blob: 8020acb88537666f5e35f5eaa50a1fb79ea6f597 [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"
18
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040019nxtDevice device;
20nxtQueue queue;
21nxtPipeline pipeline;
Kai Ninomiya68df8b02017-05-16 14:04:22 -070022nxtRenderPass renderpass;
23nxtFramebuffer framebuffer;
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040024
25void init() {
Corentin Wallez931e6e82017-06-16 18:51:14 -040026 device = CreateCppNXTDevice().Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040027
28 {
29 nxtQueueBuilder builder = nxtDeviceCreateQueueBuilder(device);
30 queue = nxtQueueBuilderGetResult(builder);
31 nxtQueueBuilderRelease(builder);
32 }
33
34 const char* vs =
35 "#version 450\n"
36 "const vec2 pos[3] = vec2[3](vec2(0.0f, 0.5f), vec2(-0.5f, -0.5f), vec2(0.5f, -0.5f));\n"
37 "void main() {\n"
38 " gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n"
39 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040040 nxtShaderModule vsModule = utils::CreateShaderModule(nxt::Device(device), nxt::ShaderStage::Vertex, vs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040041
42 const char* fs =
43 "#version 450\n"
44 "out vec4 fragColor;"
45 "void main() {\n"
46 " fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
47 "}\n";
Corentin Wallez5ee7afd2017-06-19 13:09:41 -040048 nxtShaderModule fsModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, fs).Release();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040049
50 {
Kai Ninomiya68df8b02017-05-16 14:04:22 -070051 nxtRenderPassBuilder builder = nxtDeviceCreateRenderPassBuilder(device);
52 nxtRenderPassBuilderSetAttachmentCount(builder, 1);
53 nxtRenderPassBuilderAttachmentSetFormat(builder, 0, NXT_TEXTURE_FORMAT_R8_G8_B8_A8_UNORM);
54 nxtRenderPassBuilderSetSubpassCount(builder, 1);
55 nxtRenderPassBuilderSubpassSetColorAttachment(builder, 0, 0, 0);
56 renderpass = nxtRenderPassBuilderGetResult(builder);
57 nxtRenderPassBuilderRelease(builder);
58 }
59 {
60 nxtFramebufferBuilder builder = nxtDeviceCreateFramebufferBuilder(device);
61 nxtFramebufferBuilderSetRenderPass(builder, renderpass);
62 nxtFramebufferBuilderSetDimensions(builder, 640, 480);
63 framebuffer = nxtFramebufferBuilderGetResult(builder);
64 nxtFramebufferBuilderRelease(builder);
65 }
66 {
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040067 nxtPipelineBuilder builder = nxtDeviceCreatePipelineBuilder(device);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070068 nxtPipelineBuilderSetSubpass(builder, renderpass, 0);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040069 nxtPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_VERTEX, vsModule, "main");
70 nxtPipelineBuilderSetStage(builder, NXT_SHADER_STAGE_FRAGMENT, fsModule, "main");
71 pipeline = nxtPipelineBuilderGetResult(builder);
72 nxtPipelineBuilderRelease(builder);
73 }
74
75 nxtShaderModuleRelease(vsModule);
76 nxtShaderModuleRelease(fsModule);
77}
78
79void frame() {
80 nxtCommandBuffer commands;
81 {
82 nxtCommandBufferBuilder builder = nxtDeviceCreateCommandBufferBuilder(device);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070083 nxtCommandBufferBuilderBeginRenderPass(builder, renderpass, framebuffer);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040084 nxtCommandBufferBuilderSetPipeline(builder, pipeline);
85 nxtCommandBufferBuilderDrawArrays(builder, 3, 1, 0, 0);
Kai Ninomiya68df8b02017-05-16 14:04:22 -070086 nxtCommandBufferBuilderEndRenderPass(builder);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040087 commands = nxtCommandBufferBuilderGetResult(builder);
88 nxtCommandBufferBuilderRelease(builder);
89 }
90
91 nxtQueueSubmit(queue, 1, &commands);
92 nxtCommandBufferRelease(commands);
93
Corentin Wallez583e9a82017-05-29 11:30:29 -070094 DoSwapBuffers();
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040095}
96
97int main(int argc, const char* argv[]) {
Corentin Wallez9347e8f2017-06-19 13:15:13 -040098 if (!InitSample(argc, argv)) {
Corentin Wallezf07e3bd2017-04-20 14:38:20 -040099 return 1;
100 }
101 init();
102
103 while (!ShouldQuit()) {
104 frame();
Corentin Wallez583e9a82017-05-29 11:30:29 -0700105 USleep(16000);
Corentin Wallezf07e3bd2017-04-20 14:38:20 -0400106 }
107
108 // TODO release stuff
109}