blob: 637f5d0496b24db521e8b8b87f935599f005439e [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
26void init() {
Corentin Wallez931e6e82017-06-16 18:51:14 -040027 device = CreateCppNXTDevice().Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040028
29 {
30 nxtQueueBuilder builder = nxtDeviceCreateQueueBuilder(device);
31 queue = nxtQueueBuilderGetResult(builder);
32 nxtQueueBuilderRelease(builder);
33 }
34
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070035 {
36 nxtSwapChainBuilder builder = nxtDeviceCreateSwapChainBuilder(device);
37 uint64_t swapchainImpl = GetSwapChainImplementation();
38 nxtSwapChainBuilderSetImplementation(builder, swapchainImpl);
39 swapchain = nxtSwapChainBuilderGetResult(builder);
40 nxtSwapChainBuilderRelease(builder);
41 }
42 nxtSwapChainConfigure(swapchain, NXT_TEXTURE_FORMAT_R8_G8_B8_A8_UNORM, 640, 480);
43
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040044 const char* vs =
45 "#version 450\n"
46 "const vec2 pos[3] = vec2[3](vec2(0.0f, 0.5f), vec2(-0.5f, -0.5f), vec2(0.5f, -0.5f));\n"
47 "void main() {\n"
48 " gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n"
49 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040050 nxtShaderModule vsModule = utils::CreateShaderModule(nxt::Device(device), nxt::ShaderStage::Vertex, vs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040051
52 const char* fs =
53 "#version 450\n"
54 "out vec4 fragColor;"
55 "void main() {\n"
56 " fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
57 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040058 nxtShaderModule fsModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, fs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040059
60 {
Kai Ninomiya68df8b02017-05-16 14:04:22 -070061 nxtRenderPassBuilder builder = nxtDeviceCreateRenderPassBuilder(device);
62 nxtRenderPassBuilderSetAttachmentCount(builder, 1);
63 nxtRenderPassBuilderAttachmentSetFormat(builder, 0, NXT_TEXTURE_FORMAT_R8_G8_B8_A8_UNORM);
64 nxtRenderPassBuilderSetSubpassCount(builder, 1);
65 nxtRenderPassBuilderSubpassSetColorAttachment(builder, 0, 0, 0);
66 renderpass = nxtRenderPassBuilderGetResult(builder);
67 nxtRenderPassBuilderRelease(builder);
68 }
69 {
Corentin Wallez66ff4472017-07-14 11:32:57 -040070 nxtRenderPipelineBuilder builder = nxtDeviceCreateRenderPipelineBuilder(device);
71 nxtRenderPipelineBuilderSetSubpass(builder, renderpass, 0);
72 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_VERTEX, vsModule, "main");
73 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_FRAGMENT, fsModule, "main");
74 pipeline = nxtRenderPipelineBuilderGetResult(builder);
75 nxtRenderPipelineBuilderRelease(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040076 }
77
78 nxtShaderModuleRelease(vsModule);
79 nxtShaderModuleRelease(fsModule);
80}
81
82void frame() {
Kai Ninomiyac16a67a2017-07-27 18:30:57 -070083 nxtTexture backbuffer = nxtSwapChainGetNextTexture(swapchain);
84 nxtTextureView backbufferView;
85 {
86 nxtTextureViewBuilder builder = nxtTextureCreateTextureViewBuilder(backbuffer);
87 backbufferView = nxtTextureViewBuilderGetResult(builder);
88 nxtTextureViewBuilderRelease(builder);
89 }
90 nxtFramebuffer framebuffer;
91 {
92 nxtFramebufferBuilder builder = nxtDeviceCreateFramebufferBuilder(device);
93 nxtFramebufferBuilderSetRenderPass(builder, renderpass);
94 nxtFramebufferBuilderSetDimensions(builder, 640, 480);
95 nxtFramebufferBuilderSetAttachment(builder, 0, backbufferView);
96 framebuffer = nxtFramebufferBuilderGetResult(builder);
97 nxtFramebufferBuilderRelease(builder);
98 }
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040099 nxtCommandBuffer commands;
100 {
101 nxtCommandBufferBuilder builder = nxtDeviceCreateCommandBufferBuilder(device);
Kai Ninomiya68df8b02017-05-16 14:04:22 -0700102 nxtCommandBufferBuilderBeginRenderPass(builder, renderpass, framebuffer);
Kai Ninomiyafec8c582017-07-17 12:03:16 -0400103 nxtCommandBufferBuilderBeginRenderSubpass(builder);
Corentin Wallez66ff4472017-07-14 11:32:57 -0400104 nxtCommandBufferBuilderSetRenderPipeline(builder, pipeline);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400105 nxtCommandBufferBuilderDrawArrays(builder, 3, 1, 0, 0);
Kai Ninomiyafec8c582017-07-17 12:03:16 -0400106 nxtCommandBufferBuilderEndRenderSubpass(builder);
Kai Ninomiya68df8b02017-05-16 14:04:22 -0700107 nxtCommandBufferBuilderEndRenderPass(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400108 commands = nxtCommandBufferBuilderGetResult(builder);
109 nxtCommandBufferBuilderRelease(builder);
110 }
111
112 nxtQueueSubmit(queue, 1, &commands);
113 nxtCommandBufferRelease(commands);
Kai Ninomiyac16a67a2017-07-27 18:30:57 -0700114 nxtTextureTransitionUsage(backbuffer, NXT_TEXTURE_USAGE_BIT_PRESENT);
115 nxtSwapChainPresent(swapchain, backbuffer);
116 nxtFramebufferRelease(framebuffer);
117 nxtTextureViewRelease(backbufferView);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400118
Kai Ninomiyac16a67a2017-07-27 18:30:57 -0700119 DoFlush();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400120}
121
122int main(int argc, const char* argv[]) {
Corentin Wallez9347e8f2017-06-19 13:15:13 -0400123 if (!InitSample(argc, argv)) {
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400124 return 1;
125 }
126 init();
127
128 while (!ShouldQuit()) {
129 frame();
Corentin Wallez134e0802017-07-17 17:13:57 -0400130 utils::USleep(16000);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400131 }
132
133 // TODO release stuff
134}