blob: 5eb74d20184a33b96ad850231f778580cedff5a1 [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;
Corentin Wallez66ff4472017-07-14 11:32:57 -040022nxtRenderPipeline pipeline;
Kai Ninomiya68df8b02017-05-16 14:04:22 -070023nxtRenderPass renderpass;
24nxtFramebuffer framebuffer;
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
35 const char* vs =
36 "#version 450\n"
37 "const vec2 pos[3] = vec2[3](vec2(0.0f, 0.5f), vec2(-0.5f, -0.5f), vec2(0.5f, -0.5f));\n"
38 "void main() {\n"
39 " gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n"
40 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040041 nxtShaderModule vsModule = utils::CreateShaderModule(nxt::Device(device), nxt::ShaderStage::Vertex, vs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040042
43 const char* fs =
44 "#version 450\n"
45 "out vec4 fragColor;"
46 "void main() {\n"
47 " fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
48 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040049 nxtShaderModule fsModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, fs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040050
51 {
Kai Ninomiya68df8b02017-05-16 14:04:22 -070052 nxtRenderPassBuilder builder = nxtDeviceCreateRenderPassBuilder(device);
53 nxtRenderPassBuilderSetAttachmentCount(builder, 1);
54 nxtRenderPassBuilderAttachmentSetFormat(builder, 0, NXT_TEXTURE_FORMAT_R8_G8_B8_A8_UNORM);
55 nxtRenderPassBuilderSetSubpassCount(builder, 1);
56 nxtRenderPassBuilderSubpassSetColorAttachment(builder, 0, 0, 0);
57 renderpass = nxtRenderPassBuilderGetResult(builder);
58 nxtRenderPassBuilderRelease(builder);
59 }
60 {
61 nxtFramebufferBuilder builder = nxtDeviceCreateFramebufferBuilder(device);
62 nxtFramebufferBuilderSetRenderPass(builder, renderpass);
63 nxtFramebufferBuilderSetDimensions(builder, 640, 480);
64 framebuffer = nxtFramebufferBuilderGetResult(builder);
65 nxtFramebufferBuilderRelease(builder);
66 }
67 {
Corentin Wallez66ff4472017-07-14 11:32:57 -040068 nxtRenderPipelineBuilder builder = nxtDeviceCreateRenderPipelineBuilder(device);
69 nxtRenderPipelineBuilderSetSubpass(builder, renderpass, 0);
70 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_VERTEX, vsModule, "main");
71 nxtRenderPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_FRAGMENT, fsModule, "main");
72 pipeline = nxtRenderPipelineBuilderGetResult(builder);
73 nxtRenderPipelineBuilderRelease(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040074 }
75
76 nxtShaderModuleRelease(vsModule);
77 nxtShaderModuleRelease(fsModule);
78}
79
80void frame() {
81 nxtCommandBuffer commands;
82 {
83 nxtCommandBufferBuilder builder = nxtDeviceCreateCommandBufferBuilder(device);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070084 nxtCommandBufferBuilderBeginRenderPass(builder, renderpass, framebuffer);
Kai Ninomiyafec8c582017-07-17 12:03:16 -040085 nxtCommandBufferBuilderBeginRenderSubpass(builder);
Corentin Wallez66ff4472017-07-14 11:32:57 -040086 nxtCommandBufferBuilderSetRenderPipeline(builder, pipeline);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040087 nxtCommandBufferBuilderDrawArrays(builder, 3, 1, 0, 0);
Kai Ninomiyafec8c582017-07-17 12:03:16 -040088 nxtCommandBufferBuilderEndRenderSubpass(builder);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070089 nxtCommandBufferBuilderEndRenderPass(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040090 commands = nxtCommandBufferBuilderGetResult(builder);
91 nxtCommandBufferBuilderRelease(builder);
92 }
93
94 nxtQueueSubmit(queue, 1, &commands);
95 nxtCommandBufferRelease(commands);
96
Corentin Wallez583e9a82017-05-29 11:30:29 -070097 DoSwapBuffers();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040098}
99
100int main(int argc, const char* argv[]) {
Corentin Wallez9347e8f2017-06-19 13:15:13 -0400101 if (!InitSample(argc, argv)) {
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400102 return 1;
103 }
104 init();
105
106 while (!ShouldQuit()) {
107 frame();
Corentin Wallez134e0802017-07-17 17:13:57 -0400108 utils::USleep(16000);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400109 }
110
111 // TODO release stuff
112}