blob: 0378592bbcc51d803c278302e032f8c7c72b9c8c [file] [log] [blame]
Corentin Wallezf07e3bd2017-04-20 14:38:20 -04001// Copyright 2017 The NXT Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Corentin Wallez9347e8f2017-06-19 13:15:13 -040015#include "SampleUtils.h"
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040016
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040017#include "utils/NXTHelpers.h"
Corentin Wallez134e0802017-07-17 17:13:57 -040018#include "utils/SystemUtils.h"
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040019
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040020nxtDevice device;
21nxtQueue queue;
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070022nxtSwapChain swapchain;
Corentin Wallez66ff4472017-07-14 11:32:57 -040023nxtRenderPipeline pipeline;
Kai Ninomiya68df8b02017-05-16 14:04:22 -070024nxtRenderPass renderpass;
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040025
Corentin Walleze98678f2018-01-19 12:51:18 -050026nxtTextureFormat swapChainFormat;
27
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040028void init() {
Corentin Wallez931e6e82017-06-16 18:51:14 -040029 device = CreateCppNXTDevice().Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040030
31 {
32 nxtQueueBuilder builder = nxtDeviceCreateQueueBuilder(device);
33 queue = nxtQueueBuilderGetResult(builder);
34 nxtQueueBuilderRelease(builder);
35 }
36
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070037 {
38 nxtSwapChainBuilder builder = nxtDeviceCreateSwapChainBuilder(device);
39 uint64_t swapchainImpl = GetSwapChainImplementation();
40 nxtSwapChainBuilderSetImplementation(builder, swapchainImpl);
41 swapchain = nxtSwapChainBuilderGetResult(builder);
42 nxtSwapChainBuilderRelease(builder);
43 }
Corentin Walleze98678f2018-01-19 12:51:18 -050044 swapChainFormat = static_cast<nxtTextureFormat>(GetPreferredSwapChainTextureFormat());
45 nxtSwapChainConfigure(swapchain, swapChainFormat, NXT_TEXTURE_USAGE_BIT_OUTPUT_ATTACHMENT, 640,
46 480);
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070047
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040048 const char* vs =
49 "#version 450\n"
50 "const vec2 pos[3] = vec2[3](vec2(0.0f, 0.5f), vec2(-0.5f, -0.5f), vec2(0.5f, -0.5f));\n"
51 "void main() {\n"
52 " gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n"
53 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040054 nxtShaderModule vsModule = utils::CreateShaderModule(nxt::Device(device), nxt::ShaderStage::Vertex, vs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040055
56 const char* fs =
57 "#version 450\n"
Corentin Wallezb6fb5f32017-08-29 13:37:45 -040058 "layout(location = 0) out vec4 fragColor;"
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040059 "void main() {\n"
60 " fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
61 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040062 nxtShaderModule fsModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, fs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040063
64 {
Kai Ninomiya68df8b02017-05-16 14:04:22 -070065 nxtRenderPassBuilder builder = nxtDeviceCreateRenderPassBuilder(device);
66 nxtRenderPassBuilderSetAttachmentCount(builder, 1);
Corentin Walleze98678f2018-01-19 12:51:18 -050067 nxtRenderPassBuilderAttachmentSetFormat(builder, 0, swapChainFormat);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070068 nxtRenderPassBuilderSetSubpassCount(builder, 1);
69 nxtRenderPassBuilderSubpassSetColorAttachment(builder, 0, 0, 0);
70 renderpass = nxtRenderPassBuilderGetResult(builder);
71 nxtRenderPassBuilderRelease(builder);
72 }
73 {
Corentin Wallez66ff4472017-07-14 11:32:57 -040074 nxtRenderPipelineBuilder builder = nxtDeviceCreateRenderPipelineBuilder(device);
75 nxtRenderPipelineBuilderSetSubpass(builder, renderpass, 0);
76 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_VERTEX, vsModule, "main");
77 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_FRAGMENT, fsModule, "main");
78 pipeline = nxtRenderPipelineBuilderGetResult(builder);
79 nxtRenderPipelineBuilderRelease(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040080 }
81
82 nxtShaderModuleRelease(vsModule);
83 nxtShaderModuleRelease(fsModule);
84}
85
86void frame() {
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070087 nxtTexture backbuffer = nxtSwapChainGetNextTexture(swapchain);
88 nxtTextureView backbufferView;
89 {
90 nxtTextureViewBuilder builder = nxtTextureCreateTextureViewBuilder(backbuffer);
91 backbufferView = nxtTextureViewBuilderGetResult(builder);
92 nxtTextureViewBuilderRelease(builder);
93 }
94 nxtFramebuffer framebuffer;
95 {
96 nxtFramebufferBuilder builder = nxtDeviceCreateFramebufferBuilder(device);
97 nxtFramebufferBuilderSetRenderPass(builder, renderpass);
98 nxtFramebufferBuilderSetDimensions(builder, 640, 480);
99 nxtFramebufferBuilderSetAttachment(builder, 0, backbufferView);
100 framebuffer = nxtFramebufferBuilderGetResult(builder);
101 nxtFramebufferBuilderRelease(builder);
102 }
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400103 nxtCommandBuffer commands;
104 {
105 nxtCommandBufferBuilder builder = nxtDeviceCreateCommandBufferBuilder(device);
Kai Ninomiya68df8b02017-05-16 14:04:22 -0700106 nxtCommandBufferBuilderBeginRenderPass(builder, renderpass, framebuffer);
Kai Ninomiyafec8c582017-07-17 12:03:16 -0400107 nxtCommandBufferBuilderBeginRenderSubpass(builder);
Corentin Wallez66ff4472017-07-14 11:32:57 -0400108 nxtCommandBufferBuilderSetRenderPipeline(builder, pipeline);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400109 nxtCommandBufferBuilderDrawArrays(builder, 3, 1, 0, 0);
Kai Ninomiyafec8c582017-07-17 12:03:16 -0400110 nxtCommandBufferBuilderEndRenderSubpass(builder);
Kai Ninomiya68df8b02017-05-16 14:04:22 -0700111 nxtCommandBufferBuilderEndRenderPass(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400112 commands = nxtCommandBufferBuilderGetResult(builder);
113 nxtCommandBufferBuilderRelease(builder);
114 }
115
116 nxtQueueSubmit(queue, 1, &commands);
117 nxtCommandBufferRelease(commands);
Kai Ninomiyac16a67a2017-07-27 18:30:57 -0700118 nxtTextureTransitionUsage(backbuffer, NXT_TEXTURE_USAGE_BIT_PRESENT);
119 nxtSwapChainPresent(swapchain, backbuffer);
120 nxtFramebufferRelease(framebuffer);
121 nxtTextureViewRelease(backbufferView);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400122
Kai Ninomiyac16a67a2017-07-27 18:30:57 -0700123 DoFlush();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400124}
125
126int main(int argc, const char* argv[]) {
Corentin Wallez9347e8f2017-06-19 13:15:13 -0400127 if (!InitSample(argc, argv)) {
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400128 return 1;
129 }
130 init();
131
132 while (!ShouldQuit()) {
133 frame();
Corentin Wallez134e0802017-07-17 17:13:57 -0400134 utils::USleep(16000);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400135 }
136
137 // TODO release stuff
138}