blob: 6e0f08b66933351059b3178d07fec02d40d4e0da [file] [log] [blame]
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <stdbool.h>
5#include <assert.h>
6
7#include <xcb/xcb.h>
8#include <xgl.h>
9#include <xglDbg.h>
10#include <xglWsiX11Ext.h>
11
12#include "icd-bil.h"
13
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -060014#include "linmath.h"
15
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -060016#define DEMO_BUFFER_COUNT 2
17#define DEMO_TEXTURE_COUNT 1
18
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -060019// HACK
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -060020bool do_tri = false;
21
22struct xgltriangle_vs_uniform {
23 // Must start with MVP
24 XGL_FLOAT mvp[4][4];
25 XGL_FLOAT position[3][4];
26 XGL_FLOAT color[3][4];
27};
28
29struct xgltextriangle_vs_uniform {
30 // Must start with MVP
31 XGL_FLOAT mvp[4][4];
32 XGL_FLOAT position[3][4];
33 XGL_FLOAT attr[3][4];
34};
35
36struct xglcube_vs_uniform {
37 // Must start with MVP
38 XGL_FLOAT mvp[4][4];
39 XGL_FLOAT position[12*3][4];
40 XGL_FLOAT color[12*3][4];
41};
42
43struct xgltexcube_vs_uniform {
44 // Must start with MVP
45 XGL_FLOAT mvp[4][4];
46 XGL_FLOAT position[12*3][4];
47 XGL_FLOAT attr[12*3][4];
48};
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -060049
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -060050//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
53struct Vertex
54{
55 XGL_FLOAT posX, posY, posZ, posW; // Position data
56 XGL_FLOAT r, g, b, a; // Color
57};
58
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -060059struct VertexPosTex
60{
61 XGL_FLOAT posX, posY, posZ, posW; // Position data
62 XGL_FLOAT u, v, s, t; // Texcoord
63};
64
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -060065#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -060066#define UV(_u_, _v_) (_u_), (_v_), 0.f, 1.f
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -060067
68static const struct Vertex g_vb_solid_face_colors_Data[] =
69{
70 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
71 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
72 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
73 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
74 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
75 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
76
77 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
78 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
79 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
80 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
81 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
82 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
83
84 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
85 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
86 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
87 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
88 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
89 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
90
91 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
92 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
93 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
94 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
95 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
96 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
97
98 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
99 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
100 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
101 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
102 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
103 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
104
105 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
106 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
107 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
108 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
109 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
110 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
111};
112
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600113static const XGL_FLOAT g_vertex_buffer_data[] = {
114 -1.0f,-1.0f,-1.0f,
115 -1.0f,-1.0f, 1.0f,
116 -1.0f, 1.0f, 1.0f,
117 1.0f, 1.0f,-1.0f,
118 -1.0f,-1.0f,-1.0f,
119 -1.0f, 1.0f,-1.0f,
120 1.0f,-1.0f, 1.0f,
121 -1.0f,-1.0f,-1.0f,
122 1.0f,-1.0f,-1.0f,
123 1.0f, 1.0f,-1.0f,
124 1.0f,-1.0f,-1.0f,
125 -1.0f,-1.0f,-1.0f,
126 -1.0f,-1.0f,-1.0f,
127 -1.0f, 1.0f, 1.0f,
128 -1.0f, 1.0f,-1.0f,
129 1.0f,-1.0f, 1.0f,
130 -1.0f,-1.0f, 1.0f,
131 -1.0f,-1.0f,-1.0f,
132 -1.0f, 1.0f, 1.0f,
133 -1.0f,-1.0f, 1.0f,
134 1.0f,-1.0f, 1.0f,
135 1.0f, 1.0f, 1.0f,
136 1.0f,-1.0f,-1.0f,
137 1.0f, 1.0f,-1.0f,
138 1.0f,-1.0f,-1.0f,
139 1.0f, 1.0f, 1.0f,
140 1.0f,-1.0f, 1.0f,
141 1.0f, 1.0f, 1.0f,
142 1.0f, 1.0f,-1.0f,
143 -1.0f, 1.0f,-1.0f,
144 1.0f, 1.0f, 1.0f,
145 -1.0f, 1.0f,-1.0f,
146 -1.0f, 1.0f, 1.0f,
147 1.0f, 1.0f, 1.0f,
148 -1.0f, 1.0f, 1.0f,
149 1.0f,-1.0f, 1.0f
150};
151
152static const XGL_FLOAT g_uv_buffer_data[] = {
153 0.000059f, 1.0f-0.000004f,
154 0.000103f, 1.0f-0.336048f,
155 0.335973f, 1.0f-0.335903f,
156 1.000023f, 1.0f-0.000013f,
157 0.667979f, 1.0f-0.335851f,
158 0.999958f, 1.0f-0.336064f,
159 0.667979f, 1.0f-0.335851f,
160 0.336024f, 1.0f-0.671877f,
161 0.667969f, 1.0f-0.671889f,
162 1.000023f, 1.0f-0.000013f,
163 0.668104f, 1.0f-0.000013f,
164 0.667979f, 1.0f-0.335851f,
165 0.000059f, 1.0f-0.000004f,
166 0.335973f, 1.0f-0.335903f,
167 0.336098f, 1.0f-0.000071f,
168 0.667979f, 1.0f-0.335851f,
169 0.335973f, 1.0f-0.335903f,
170 0.336024f, 1.0f-0.671877f,
171 1.000004f, 1.0f-0.671847f,
172 0.999958f, 1.0f-0.336064f,
173 0.667979f, 1.0f-0.335851f,
174 0.668104f, 1.0f-0.000013f,
175 0.335973f, 1.0f-0.335903f,
176 0.667979f, 1.0f-0.335851f,
177 0.335973f, 1.0f-0.335903f,
178 0.668104f, 1.0f-0.000013f,
179 0.336098f, 1.0f-0.000071f,
180 0.000103f, 1.0f-0.336048f,
181 0.000004f, 1.0f-0.671870f,
182 0.336024f, 1.0f-0.671877f,
183 0.000103f, 1.0f-0.336048f,
184 0.336024f, 1.0f-0.671877f,
185 0.335973f, 1.0f-0.335903f,
186 0.667969f, 1.0f-0.671889f,
187 1.000004f, 1.0f-0.671847f,
188 0.667979f, 1.0f-0.335851f
189};
190
191void dumpMatrix(const char *note, mat4x4 MVP)
192{
193 int i;
194
195 printf("%s: \n", note);
196 for (i=0; i<4; i++) {
197 printf("%f, %f, %f, %f\n", MVP[i][0], MVP[i][1], MVP[i][2], MVP[i][3]);
198 }
199 printf("\n");
200 fflush(stdout);
201}
202
203void dumpVec4(const char *note, vec4 vector)
204{
205 printf("%s: \n", note);
206 printf("%f, %f, %f, %f\n", vector[0], vector[1], vector[2], vector[3]);
207 printf("\n");
208 fflush(stdout);
209}
210
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600211struct demo {
212 xcb_connection_t *connection;
213 xcb_screen_t *screen;
214
215 XGL_PHYSICAL_GPU gpu;
216 XGL_DEVICE device;
217 XGL_QUEUE queue;
218
219 int width, height;
220 XGL_FORMAT format;
221
222 struct {
223 XGL_IMAGE image;
224 XGL_GPU_MEMORY mem;
225
226 XGL_COLOR_ATTACHMENT_VIEW view;
227 } buffers[DEMO_BUFFER_COUNT];
228
229 struct {
230 XGL_FORMAT format;
231
232 XGL_IMAGE image;
233 XGL_GPU_MEMORY mem;
234 XGL_DEPTH_STENCIL_VIEW view;
235 } depth;
236
237 struct {
238 XGL_SAMPLER sampler;
239
240 XGL_IMAGE image;
241 XGL_GPU_MEMORY mem;
242 XGL_IMAGE_VIEW view;
243 } textures[DEMO_TEXTURE_COUNT];
244
245 struct {
246 XGL_GPU_MEMORY mem;
247 XGL_MEMORY_VIEW_ATTACH_INFO view;
248
249 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi;
250 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_bindings[1];
251 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attrs[2];
252 } vertices;
253
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600254 struct {
255 XGL_GPU_MEMORY mem;
256 XGL_MEMORY_VIEW_ATTACH_INFO view;
257 } uniform_data;
258
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600259 XGL_DESCRIPTOR_SET dset;
260
261 XGL_PIPELINE pipeline;
262
263 XGL_VIEWPORT_STATE_OBJECT viewport;
264 XGL_RASTER_STATE_OBJECT raster;
265 XGL_MSAA_STATE_OBJECT msaa;
266 XGL_COLOR_BLEND_STATE_OBJECT color_blend;
267 XGL_DEPTH_STENCIL_STATE_OBJECT depth_stencil;
268
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600269 mat4x4 projection_matrix;
270 mat4x4 view_matrix;
271 mat4x4 model_matrix;
272
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600273 XGL_CMD_BUFFER cmd;
274
275 xcb_window_t window;
276
277 bool quit;
278 XGL_UINT current_buffer;
279};
280
281static void demo_draw_build_cmd(struct demo *demo)
282{
283 const XGL_COLOR_ATTACHMENT_BIND_INFO color_attachment = {
284 .view = demo->buffers[demo->current_buffer].view,
285 .colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL,
286 };
287 const XGL_DEPTH_STENCIL_BIND_INFO depth_stencil = {
288 .view = demo->depth.view,
289 .depthState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL,
290 .stencilState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL,
291 };
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600292 const XGL_FLOAT clear_color[4] = { 0.2f, 0.2f, 0.2f, 0.2f };
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600293 const XGL_FLOAT clear_depth = 1.0f;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600294 XGL_IMAGE_SUBRESOURCE_RANGE clear_range;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600295 XGL_RESULT err;
296
297 err = xglBeginCommandBuffer(demo->cmd,
298 XGL_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
299 XGL_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT);
300 assert(!err);
301
302 xglCmdBindPipeline(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
303 demo->pipeline);
304 xglCmdBindDescriptorSet(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
305 0, demo->dset, 0);
306
307 xglCmdBindStateObject(demo->cmd, XGL_STATE_BIND_VIEWPORT, demo->viewport);
308 xglCmdBindStateObject(demo->cmd, XGL_STATE_BIND_RASTER, demo->raster);
309 xglCmdBindStateObject(demo->cmd, XGL_STATE_BIND_MSAA, demo->msaa);
310 xglCmdBindStateObject(demo->cmd, XGL_STATE_BIND_COLOR_BLEND,
311 demo->color_blend);
312 xglCmdBindStateObject(demo->cmd, XGL_STATE_BIND_DEPTH_STENCIL,
313 demo->depth_stencil);
314
315 xglCmdBindAttachments(demo->cmd, 1, &color_attachment, &depth_stencil);
316
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600317 clear_range.aspect = XGL_IMAGE_ASPECT_COLOR;
318 clear_range.baseMipLevel = 0;
319 clear_range.mipLevels = 1;
320 clear_range.baseArraySlice = 0;
321 clear_range.arraySize = 1;
322 xglCmdClearColorImage(demo->cmd,
323 demo->buffers[demo->current_buffer].image,
324 clear_color, 1, &clear_range);
325
326 clear_range.aspect = XGL_IMAGE_ASPECT_DEPTH;
327 xglCmdClearDepthStencil(demo->cmd, demo->depth.image,
328 clear_depth, 0, 1, &clear_range);
329
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600330 if (do_tri) {
331 xglCmdDraw(demo->cmd, 0, 3, 0, 1);
332 } else {
333 xglCmdDraw(demo->cmd, 0, 12 * 3, 0, 1);
334 }
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600335
336 err = xglEndCommandBuffer(demo->cmd);
337 assert(!err);
338}
339
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600340
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600341void demo_update_data_buffer(struct demo *demo, bool forward)
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600342{
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600343 mat4x4 MVP, Model, VP;
344 int matrixSize = sizeof(MVP);
345 XGL_UINT8 *pData;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600346 XGL_RESULT err;
347
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600348 mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600349
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600350 // Rotate 22.5 degrees around the Y axis
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600351 mat4x4_dup(Model, demo->model_matrix);
352 if (forward) {
353 mat4x4_rotate(demo->model_matrix, Model, 0.0f, 1.0f, 0.0f, degreesToRadians(22.5f));
354 } else {
355 mat4x4_rotate(demo->model_matrix, Model, 0.0f, 1.0f, 0.0f, degreesToRadians(-22.5f));
356 }
357 mat4x4_mul(MVP, VP, demo->model_matrix);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600358
359 err = xglMapMemory(demo->uniform_data.mem, 0, (XGL_VOID **) &pData);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600360 assert(!err);
361
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600362 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600363
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600364 err = xglUnmapMemory(demo->uniform_data.mem);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600365 assert(!err);
366}
367
368static void demo_draw(struct demo *demo)
369{
370 const XGL_WSI_X11_PRESENT_INFO present = {
371 .destWindow = demo->window,
372 .srcImage = demo->buffers[demo->current_buffer].image,
373 };
374 XGL_RESULT err;
375
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600376 demo_draw_build_cmd(demo);
377
378 err = xglQueueSubmit(demo->queue, 1, &demo->cmd,
379 0, NULL, XGL_NULL_HANDLE);
380 assert(!err);
381
382 err = xglWsiX11QueuePresent(demo->queue, &present, XGL_NULL_HANDLE);
383 assert(!err);
384
385 demo->current_buffer = (demo->current_buffer + 1) % DEMO_BUFFER_COUNT;
386}
387
388static void demo_prepare_buffers(struct demo *demo)
389{
390 const XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO presentable_image = {
391 .format = demo->format,
392 .usage = XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
393 .extent = {
394 .width = demo->width,
395 .height = demo->height,
396 },
397 .flags = 0,
398 };
399 XGL_RESULT err;
400 XGL_UINT i;
401
402 for (i = 0; i < DEMO_BUFFER_COUNT; i++) {
403 XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO color_attachment_view = {
404 .sType = XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
405 .pNext = NULL,
406 .format = demo->format,
407 .mipLevel = 0,
408 .baseArraySlice = 0,
409 .arraySize = 1,
410 };
411
412 err = xglWsiX11CreatePresentableImage(demo->device, &presentable_image,
413 &demo->buffers[i].image, &demo->buffers[i].mem);
414 assert(!err);
415
416 color_attachment_view.image = demo->buffers[i].image;
417
418 err = xglCreateColorAttachmentView(demo->device,
419 &color_attachment_view, &demo->buffers[i].view);
420 assert(!err);
421 }
422}
423
424static void demo_prepare_depth(struct demo *demo)
425{
426 const XGL_FORMAT depth_format = { XGL_CH_FMT_R16, XGL_NUM_FMT_DS };
427 const XGL_IMAGE_CREATE_INFO image = {
428 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
429 .pNext = NULL,
430 .imageType = XGL_IMAGE_2D,
431 .format = depth_format,
432 .extent = { demo->width, demo->height, 1 },
433 .mipLevels = 1,
434 .arraySize = 1,
435 .samples = 1,
436 .tiling = XGL_OPTIMAL_TILING,
437 .usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT,
438 .flags = 0,
439 };
440 XGL_MEMORY_ALLOC_INFO mem_alloc = {
441 .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
442 .pNext = NULL,
443 .allocationSize = 0,
444 .alignment = 0,
445 .flags = 0,
446 .heapCount = 0,
447 .memPriority = XGL_MEMORY_PRIORITY_NORMAL,
448 };
449 XGL_DEPTH_STENCIL_VIEW_CREATE_INFO view = {
450 .sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO,
451 .pNext = NULL,
452 .image = XGL_NULL_HANDLE,
453 .mipLevel = 0,
454 .baseArraySlice = 0,
455 .arraySize = 1,
456 .flags = 0,
457 };
458 XGL_MEMORY_REQUIREMENTS mem_reqs;
459 XGL_SIZE mem_reqs_size;
460 XGL_RESULT err;
461
462 demo->depth.format = depth_format;
463
464 /* create image */
465 err = xglCreateImage(demo->device, &image,
466 &demo->depth.image);
467 assert(!err);
468
469 err = xglGetObjectInfo(demo->depth.image,
470 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
471 &mem_reqs_size, &mem_reqs);
472 assert(!err && mem_reqs_size == sizeof(mem_reqs));
473
474 mem_alloc.allocationSize = mem_reqs.size;
475 mem_alloc.alignment = mem_reqs.alignment;
476 mem_alloc.heapCount = mem_reqs.heapCount;
477 memcpy(mem_alloc.heaps, mem_reqs.heaps,
478 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
479
480 /* allocate memory */
481 err = xglAllocMemory(demo->device, &mem_alloc,
482 &demo->depth.mem);
483 assert(!err);
484
485 /* bind memory */
486 err = xglBindObjectMemory(demo->depth.image,
487 demo->depth.mem, 0);
488 assert(!err);
489
490 /* create image view */
491 view.image = demo->depth.image;
492 err = xglCreateDepthStencilView(demo->device, &view,
493 &demo->depth.view);
494 assert(!err);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600495}
496
497#if 1
498static void demo_prepare_textures(struct demo *demo)
499{
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600500 const XGL_FORMAT tex_format = { XGL_CH_FMT_R8G8B8A8, XGL_NUM_FMT_UNORM };
501 const XGL_INT tex_width = 64;
502 const XGL_INT tex_height = 64;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600503 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
504 { 0xffff0000, 0xff00ff00 },
505 };
506 XGL_RESULT err;
507 XGL_UINT i;
508
509 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
510 const XGL_SAMPLER_CREATE_INFO sampler = {
511 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
512 .pNext = NULL,
513 .magFilter = XGL_TEX_FILTER_NEAREST,
514 .minFilter = XGL_TEX_FILTER_NEAREST,
515 .mipMode = XGL_TEX_MIPMAP_BASE,
516 .addressU = XGL_TEX_ADDRESS_WRAP,
517 .addressV = XGL_TEX_ADDRESS_WRAP,
518 .addressW = XGL_TEX_ADDRESS_WRAP,
519 .mipLodBias = 0.0f,
520 .maxAnisotropy = 0,
521 .compareFunc = XGL_COMPARE_NEVER,
522 .minLod = 0.0f,
523 .maxLod = 0.0f,
524 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
525 };
526 const XGL_IMAGE_CREATE_INFO image = {
527 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
528 .pNext = NULL,
529 .imageType = XGL_IMAGE_2D,
530 .format = tex_format,
531 .extent = { tex_width, tex_height, 1 },
532 .mipLevels = 1,
533 .arraySize = 1,
534 .samples = 1,
535 .tiling = XGL_LINEAR_TILING,
536 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
537 .flags = 0,
538 };
539 XGL_MEMORY_ALLOC_INFO mem_alloc = {
540 .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
541 .pNext = NULL,
542 .allocationSize = 0,
543 .alignment = 0,
544 .flags = 0,
545 .heapCount = 0,
546 .memPriority = XGL_MEMORY_PRIORITY_NORMAL,
547 };
548 XGL_IMAGE_VIEW_CREATE_INFO view = {
549 .sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
550 .pNext = NULL,
551 .image = XGL_NULL_HANDLE,
552 .viewType = XGL_IMAGE_VIEW_2D,
553 .format = image.format,
554 .channels = { XGL_CHANNEL_SWIZZLE_R,
555 XGL_CHANNEL_SWIZZLE_G,
556 XGL_CHANNEL_SWIZZLE_B,
557 XGL_CHANNEL_SWIZZLE_A, },
558 .subresourceRange = { XGL_IMAGE_ASPECT_COLOR, 0, 1, 0, 1 },
559 .minLod = 0.0f,
560 };
561 XGL_MEMORY_REQUIREMENTS mem_reqs;
562 XGL_SIZE mem_reqs_size;
563
564 /* create sampler */
565 err = xglCreateSampler(demo->device, &sampler,
566 &demo->textures[i].sampler);
567 assert(!err);
568
569 /* create image */
570 err = xglCreateImage(demo->device, &image,
571 &demo->textures[i].image);
572 assert(!err);
573
574 err = xglGetObjectInfo(demo->textures[i].image,
575 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
576 &mem_reqs_size, &mem_reqs);
577 assert(!err && mem_reqs_size == sizeof(mem_reqs));
578
579 mem_alloc.allocationSize = mem_reqs.size;
580 mem_alloc.alignment = mem_reqs.alignment;
581 mem_alloc.heapCount = mem_reqs.heapCount;
582 memcpy(mem_alloc.heaps, mem_reqs.heaps,
583 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
584
585 /* allocate memory */
586 err = xglAllocMemory(demo->device, &mem_alloc,
587 &demo->textures[i].mem);
588 assert(!err);
589
590 /* bind memory */
591 err = xglBindObjectMemory(demo->textures[i].image,
592 demo->textures[i].mem, 0);
593 assert(!err);
594
595 /* create image view */
596 view.image = demo->textures[i].image;
597 err = xglCreateImageView(demo->device, &view,
598 &demo->textures[i].view);
599 assert(!err);
600 }
601
602 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
603 const XGL_IMAGE_SUBRESOURCE subres = {
604 .aspect = XGL_IMAGE_ASPECT_COLOR,
605 .mipLevel = 0,
606 .arraySlice = 0,
607 };
608 XGL_SUBRESOURCE_LAYOUT layout;
609 XGL_SIZE layout_size;
610 XGL_VOID *data;
611 XGL_INT x, y;
612
613 err = xglGetImageSubresourceInfo(demo->textures[i].image, &subres,
614 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
615 assert(!err && layout_size == sizeof(layout));
616
617 err = xglMapMemory(demo->textures[i].mem, 0, &data);
618 assert(!err);
619
620 for (y = 0; y < tex_height; y++) {
621 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
622 for (x = 0; x < tex_width; x++)
623 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
624 }
625
626 err = xglUnmapMemory(demo->textures[i].mem);
627 assert(!err);
628 }
629}
630#endif
631
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600632void demo_prepare_cube_data_buffer(struct demo *demo)
633{
634 XGL_MEMORY_ALLOC_INFO alloc_info;
635 XGL_UINT8 *pData;
636 int i;
637 mat4x4 MVP, VP;
638 vec3 eye = {0.0f, 3.0f, 10.0f};
639 vec3 origin = {0, 0, 0};
640 vec3 up = {0.0f, 1.0f, 0.0};
641 XGL_RESULT err;
642 struct xgltexcube_vs_uniform data;
643
644 mat4x4_perspective(demo->projection_matrix, degreesToRadians(45.0f), 1.0f, 0.1f, 100.0f);
645 mat4x4_look_at(demo->view_matrix, eye, origin, up);
646// mat4x4_identity(demo->projection_matrix);
647// mat4x4_identity(demo->view_matrix);
648 mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix);
649// mat4x4_translate(demo->model_matrix, 0.25, 0, 0);
650 mat4x4_identity(demo->model_matrix);
651 mat4x4_mul(MVP, VP, demo->model_matrix);
652 memcpy(data.mvp, MVP, sizeof(MVP));
653 dumpMatrix("MVP", MVP);
654
655 for (i=0; i<12*3; i++) {
656 data.position[i][0] = g_vertex_buffer_data[i*3];
657 data.position[i][1] = g_vertex_buffer_data[i*3+1];
658 data.position[i][2] = g_vertex_buffer_data[i*3+2];
659 data.position[i][3] = 1.0f;
660 data.attr[i][0] = g_uv_buffer_data[2*i];
661 data.attr[i][1] = g_uv_buffer_data[2*i + 1];
662 data.attr[i][2] = 0;
663 data.attr[i][3] = 0;
664 }
665
666 memset(&alloc_info, 0, sizeof(alloc_info));
667 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
668 alloc_info.allocationSize = sizeof(data);
669 alloc_info.alignment = 0;
670 alloc_info.heapCount = 1;
671 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
672
673 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
674 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
675
676 err = xglAllocMemory(demo->device, &alloc_info, &demo->uniform_data.mem);
677 assert(!err);
678
679 err = xglMapMemory(demo->uniform_data.mem, 0, (XGL_VOID **) &pData);
680 assert(!err);
681
682 memcpy(pData, &data, alloc_info.allocationSize);
683
684 err = xglUnmapMemory(demo->uniform_data.mem);
685 assert(!err);
686
687 // set up the memory view for the constant buffer
688 demo->uniform_data.view.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
689 demo->uniform_data.view.stride = 16;
690 demo->uniform_data.view.range = alloc_info.allocationSize;
691 demo->uniform_data.view.offset = 0;
692 demo->uniform_data.view.mem = demo->uniform_data.mem;
693 demo->uniform_data.view.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
694 demo->uniform_data.view.format.numericFormat = XGL_NUM_FMT_FLOAT;
695}
696
697#if 0
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600698// this function will create the vertex buffer and fill it with the mesh data
699void demo_prepare_mesh( struct demo *demo )
700{
701 XGL_UINT32 m_numVertices;
702 XGL_GPU_SIZE vbStride;
703 XGL_RESULT err = XGL_SUCCESS;
704
705 m_numVertices = sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]);
706 vbStride = sizeof(g_vb_solid_face_colors_Data[0]);
707
708 XGL_MEMORY_ALLOC_INFO alloc_info;
709 XGL_UINT8 *pData;
710
711 memset(&alloc_info, 0, sizeof(alloc_info));
712 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
713// alloc_info.pNext = NULL;
714 alloc_info.allocationSize = m_numVertices * vbStride;
715 alloc_info.alignment = 0;
716 alloc_info.heapCount = 1;
717 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
718
719 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
720 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
721
722 err = xglAllocMemory(demo->device, &alloc_info, &demo->vertices.mem);
723 assert(!err);
724
725 err = xglMapMemory(demo->vertices.mem, 0, (XGL_VOID **) &pData);
726 assert(!err);
727
728 memcpy(pData, g_vb_solid_face_colors_Data, alloc_info.allocationSize);
729
730 err = xglUnmapMemory(demo->vertices.mem);
731 assert(!err);
732
733 // set up the memory view for the vertex buffer
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600734 demo->vertices.view.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600735 demo->vertices.view.pNext = NULL;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600736 demo->vertices.view.mem = demo->vertices.mem;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600737 demo->vertices.view.offset = 0;
738 demo->vertices.view.range = sizeof(g_vb_solid_face_colors_Data);
739 demo->vertices.view.stride = vbStride;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600740 demo->vertices.view.format.channelFormat = XGL_CH_FMT_UNDEFINED;
741 demo->vertices.view.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
742 demo->vertices.view.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
743
744 demo->vertices.vi_bindings[0].strideInBytes = vbStride; // strideInBytes; Distance between vertices in bytes (0 = no advancement)
745 demo->vertices.vi_bindings[0].stepRate = XGL_VERTEX_INPUT_STEP_RATE_VERTEX; // stepRate;
746
747 // this is the current description of g_vbData
748 demo->vertices.vi_attrs[0].binding = 0; // index into vertexBindingDescriptions
749 demo->vertices.vi_attrs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
750 demo->vertices.vi_attrs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
751 demo->vertices.vi_attrs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600752
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600753 demo->vertices.vi_attrs[1].binding = 0; // index into vertexBindingDescriptions
754 demo->vertices.vi_attrs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
755 demo->vertices.vi_attrs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600756 demo->vertices.vi_attrs[1].offsetInBytes = sizeof(float) * 4; // Offset of first element in bytes from base of vertex
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600757
758 demo->vertices.vi.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
759 demo->vertices.vi.pNext = NULL;
760 demo->vertices.vi.bindingCount = 1;
761 demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;
762 demo->vertices.vi.attributeCount = 2;
763 demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;
764}
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600765#endif
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600766
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600767#if 0
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600768static void demo_prepare_vertices(struct demo *demo)
769{
770 const float vb[3][5] = {
771 /* position texcoord */
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600772 { -1.0f, -1.0f, -0.6f, 0.0f, 0.0f },
773 { 1.0f, -1.0f, -0.5f, 1.0f, 0.0f },
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600774 { 0.0f, 1.0f, 1.0f, 0.5f, 1.0f },
775 };
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600776
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600777 const XGL_MEMORY_ALLOC_INFO mem_alloc = {
778 .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
779 .pNext = NULL,
780 .allocationSize = sizeof(vb),
781 .alignment = 0,
782 .flags = 0,
783 .heapCount = 1,
784 .heaps[0] = 0,
785 .memPriority = XGL_MEMORY_PRIORITY_NORMAL,
786 };
787 XGL_RESULT err;
788 void *data;
789
790 memset(&demo->vertices, 0, sizeof(demo->vertices));
791
792 err = xglAllocMemory(demo->device, &mem_alloc, &demo->vertices.mem);
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600793 XGL_RESULT err; assert(!err);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600794
795 err = xglMapMemory(demo->vertices.mem, 0, &data);
796 assert(!err);
797
798 memcpy(data, vb, sizeof(vb));
799
800 err = xglUnmapMemory(demo->vertices.mem);
801 assert(!err);
802
803 demo->vertices.view.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
804 demo->vertices.view.pNext = NULL;
805 demo->vertices.view.mem = demo->vertices.mem;
806 demo->vertices.view.offset = 0;
807 demo->vertices.view.range = sizeof(vb);
808 demo->vertices.view.stride = sizeof(vb[0]);
809 demo->vertices.view.format.channelFormat = XGL_CH_FMT_UNDEFINED;
810 demo->vertices.view.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
811 demo->vertices.view.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
812
813 demo->vertices.vi.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
814 demo->vertices.vi.pNext = NULL;
815 demo->vertices.vi.bindingCount = 1;
816 demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;
817 demo->vertices.vi.attributeCount = 2;
818 demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;
819
820 demo->vertices.vi_bindings[0].strideInBytes = sizeof(vb[0]);
821 demo->vertices.vi_bindings[0].stepRate = XGL_VERTEX_INPUT_STEP_RATE_VERTEX;
822
823 demo->vertices.vi_attrs[0].binding = 0;
824 demo->vertices.vi_attrs[0].format.channelFormat = XGL_CH_FMT_R32G32B32;
825 demo->vertices.vi_attrs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
826 demo->vertices.vi_attrs[0].offsetInBytes = 0;
827
828 demo->vertices.vi_attrs[1].binding = 0;
829 demo->vertices.vi_attrs[1].format.channelFormat = XGL_CH_FMT_R32G32;
830 demo->vertices.vi_attrs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
831 demo->vertices.vi_attrs[1].offsetInBytes = sizeof(float) * 3;
832}
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600833#endif
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600834
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600835void demo_prepare_tri_data_buffer(struct demo *demo)
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600836{
837 XGL_MEMORY_ALLOC_INFO alloc_info;
838 XGL_UINT8 *pData;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600839 int i;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600840 mat4x4 MVP, VP;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600841 vec3 eye = {0.0f, 3.0f, 10.0f};
842 vec3 origin = {0, 0, 0};
843 vec3 up = {0.0f, 1.0f, 0.0};
844 struct xgltextriangle_vs_uniform data;
845 const struct VertexPosTex tri_data[] =
846 {
847 /* position texcoord */
848 { XYZ1(-1.0f, -1.0f, -0.6f), UV(0.0f, 0.0f) },
849 { XYZ1(1.0f, -1.0f, -0.5f), UV(1.0f, 0.0f) },
850 { XYZ1(0.0f, 1.0f, 1.0f), UV(0.5f, 1.0f) },
851 };
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600852 XGL_RESULT err;
853
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600854// glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
855// dumpMatrix("Projection", Projection);
856
857 // Camera matrix
858 /* glm::mat4 View = glm::lookAt(
859 glm::vec3(0,3,10), // Camera is at (0,3,10), in World Space
860 glm::vec3(0,0,0), // and looks at the origin
861 glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
862 );
863 */
864 mat4x4_perspective(demo->projection_matrix, degreesToRadians(45.0f), 1.0f, 0.1f, 100.0f);
865 dumpMatrix("Projection", demo->projection_matrix);
866 mat4x4_look_at(demo->view_matrix, eye, origin, up);
867 dumpMatrix("View", demo->view_matrix);
868// mat4x4_identity(demo->projection_matrix);
869// mat4x4_identity(demo->view_matrix);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600870 mat4x4_mul(VP, demo->projection_matrix, demo->view_matrix);
871 mat4x4_identity(demo->model_matrix);
872 mat4x4_mul(MVP, VP, demo->model_matrix);
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600873 mat4x4_identity(MVP);
874// mat4x4_translate(MVP, 0.25, 0, 0);
875 dumpMatrix("MVP", MVP);
876 memcpy(data.mvp, MVP, sizeof(MVP));
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600877
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600878 for (i=0; i<3; i++) {
879 data.position[i][0] = tri_data[i].posX;
880 data.position[i][1] = tri_data[i].posY;
881 data.position[i][2] = tri_data[i].posZ;
882 data.position[i][3] = tri_data[i].posW;
883 data.attr[i][0] = tri_data[i].u;
884 data.attr[i][1] = tri_data[i].v;
885 data.attr[i][2] = tri_data[i].s;
886 data.attr[i][3] = tri_data[i].t;
887 }
888
889 memset(&alloc_info, 0, sizeof(alloc_info));
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600890 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600891 alloc_info.allocationSize = sizeof(data);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600892 alloc_info.alignment = 0;
893 alloc_info.heapCount = 1;
894 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
895
896 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
897 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
898
899 err = xglAllocMemory(demo->device, &alloc_info, &demo->uniform_data.mem);
900 assert(!err);
901
902 err = xglMapMemory(demo->uniform_data.mem, 0, (XGL_VOID **) &pData);
903 assert(!err);
904
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600905 memcpy(pData, &data, alloc_info.allocationSize);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600906
907 err = xglUnmapMemory(demo->uniform_data.mem);
908 assert(!err);
909
910 // set up the memory view for the constant buffer
911 demo->uniform_data.view.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
912 demo->uniform_data.view.stride = 16;
913 demo->uniform_data.view.range = alloc_info.allocationSize;
914 demo->uniform_data.view.offset = 0;
915 demo->uniform_data.view.mem = demo->uniform_data.mem;
916 demo->uniform_data.view.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
917 demo->uniform_data.view.format.numericFormat = XGL_NUM_FMT_FLOAT;
918}
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600919
920static void demo_prepare_descriptor_set(struct demo *demo)
921{
922 const XGL_DESCRIPTOR_SET_CREATE_INFO descriptor_set = {
923 .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO,
924 .pNext = NULL,
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600925 .slots = DEMO_TEXTURE_COUNT * 2 + 2,
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600926 };
927 XGL_RESULT err;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600928
929 err = xglCreateDescriptorSet(demo->device, &descriptor_set, &demo->dset);
930 assert(!err);
931
932 xglBeginDescriptorSetUpdate(demo->dset);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600933 xglClearDescriptorSetSlots(demo->dset, 0, DEMO_TEXTURE_COUNT * 2 + 2);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600934
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600935// xglAttachMemoryViewDescriptors(demo->dset, 0, 1, &demo->vertices.view);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600936
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600937 xglAttachMemoryViewDescriptors(demo->dset, 0, 1, &demo->uniform_data.view);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600938
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600939 XGL_IMAGE_VIEW_ATTACH_INFO image_view;
940
941 image_view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
942 image_view.pNext = NULL;
943 image_view.view = demo->textures[0].view;
944 image_view.state = XGL_IMAGE_STATE_GRAPHICS_SHADER_READ_ONLY;
945
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600946 xglAttachSamplerDescriptors(demo->dset, 1, 1, &demo->textures[0].sampler);
947 xglAttachImageViewDescriptors(demo->dset, 2, 1, &image_view);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600948
949 xglEndDescriptorSetUpdate(demo->dset);
950}
951
952static XGL_SHADER demo_prepare_shader(struct demo *demo,
953 XGL_PIPELINE_SHADER_STAGE stage,
954 const void *code,
955 XGL_SIZE size)
956{
957 XGL_SHADER_CREATE_INFO createInfo;
958 XGL_SHADER shader;
959 XGL_RESULT err;
960
961 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
962 createInfo.pNext = NULL;
963
964 // Create fake BIL structure to feed GLSL
965 // to the driver "under the covers"
966 createInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
967 createInfo.pCode = malloc(createInfo.codeSize);
968 createInfo.flags = 0;
969
970 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
971 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
972 ((uint32_t *) createInfo.pCode)[1] = 0;
973 ((uint32_t *) createInfo.pCode)[2] = stage;
974 memcpy(((uint32_t *) createInfo.pCode + 3), code, size + 1);
975
976 err = xglCreateShader(demo->device, &createInfo, &shader);
977 if (err) {
978 free((void *) createInfo.pCode);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600979 return NULL;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -0600980 }
981
982 return shader;
983}
984
985static XGL_SHADER demo_prepare_vs(struct demo *demo)
986{
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600987 if (do_tri) {
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -0600988 static const char *vertShaderText =
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -0600989 "#version 140\n"
990 "#extension GL_ARB_separate_shader_objects : enable\n"
991 "#extension GL_ARB_shading_language_420pack : enable\n"
992 "\n"
993 "layout(binding = 0) uniform buf {\n"
994 " mat4 MVP;\n"
995 " vec4 position[3];\n"
996 " vec4 attr[3];\n"
997 "} ubuf;\n"
998 "\n"
999 "layout (location = 0) out vec4 texcoord;\n"
1000// "layout (location = 0) out vec2 texcoord;\n"
1001 "\n"
1002 "void main() \n"
1003 "{\n"
1004 " texcoord = ubuf.attr[gl_VertexID];\n"
1005// " texcoord = ubuf.position[gl_VertexID].xy;\n"
1006 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
1007 "}\n";
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001008
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001009 return demo_prepare_shader(demo, XGL_SHADER_STAGE_VERTEX,
1010 (const void *) vertShaderText,
1011 strlen(vertShaderText));
1012 } else {
1013 static const char *vertShaderText =
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001014 "#version 140\n"
1015 "#extension GL_ARB_separate_shader_objects : enable\n"
1016 "#extension GL_ARB_shading_language_420pack : enable\n"
1017 "\n"
1018 "layout(binding = 0) uniform buf {\n"
1019 " mat4 MVP;\n"
1020 " vec4 position[12*3];\n"
1021 " vec4 attr[12*3];\n"
1022 "} ubuf;\n"
1023 "\n"
1024 "layout (location = 0) out vec4 texcoord;\n"
1025// "layout (location = 0) out vec2 texcoord;\n"
1026 "\n"
1027 "void main() \n"
1028 "{\n"
1029 " texcoord = ubuf.attr[gl_VertexID];\n"
1030// " texcoord = ubuf.position[gl_VertexID].xy;\n"
1031 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
1032 "}\n";
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001033
1034 return demo_prepare_shader(demo, XGL_SHADER_STAGE_VERTEX,
1035 (const void *) vertShaderText,
1036 strlen(vertShaderText));
1037 }
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001038}
1039
1040static XGL_SHADER demo_prepare_fs(struct demo *demo)
1041{
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001042 if (do_tri) {
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001043#if 1
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001044 static const char *fragShaderText =
1045 "#version 140\n"
1046 "#extension GL_ARB_separate_shader_objects : enable\n"
1047 "#extension GL_ARB_shading_language_420pack : enable\n"
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001048 "uniform sampler2D tex;\n"
1049// "in vec2 texcoord;\n"
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001050 "layout (location = 0) in vec4 texcoord;\n"
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001051 "void main() {\n"
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001052 " gl_FragColor = texture(tex, texcoord.xy);\n"
1053// " gl_FragColor = texture(tex, vec2(0, 0));\n"
1054// " gl_FragColor = texcoord;"
1055// " gl_FragColor = vec4(0, 1, 0, 1);"
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001056 "}\n";
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001057#endif
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001058
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001059 return demo_prepare_shader(demo, XGL_SHADER_STAGE_FRAGMENT,
1060 (const void *) fragShaderText,
1061 strlen(fragShaderText));
1062 } else {
1063 static const char *fragShaderText =
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001064 "#version 140\n"
1065 "#extension GL_ARB_separate_shader_objects : enable\n"
1066 "#extension GL_ARB_shading_language_420pack : enable\n"
1067 "uniform sampler2D tex;\n"
1068 "\n"
1069 "layout (location = 0) in vec4 texcoord;\n"
1070 "void main() {\n"
1071 " gl_FragColor = texture(tex, texcoord.xy);\n"
1072 "}\n";
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001073
1074 return demo_prepare_shader(demo, XGL_SHADER_STAGE_FRAGMENT,
1075 (const void *) fragShaderText,
1076 strlen(fragShaderText));
1077 }
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001078}
1079
1080static void demo_prepare_pipeline(struct demo *demo)
1081{
1082 XGL_GRAPHICS_PIPELINE_CREATE_INFO pipeline;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001083// XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001084 XGL_PIPELINE_IA_STATE_CREATE_INFO ia;
1085 XGL_PIPELINE_RS_STATE_CREATE_INFO rs;
1086 XGL_PIPELINE_CB_STATE cb;
1087 XGL_PIPELINE_DB_STATE_CREATE_INFO db;
1088 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs;
1089 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO fs;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001090 XGL_DESCRIPTOR_SLOT_INFO vs_slots[3];
1091 XGL_DESCRIPTOR_SLOT_INFO fs_slots[3];
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001092 XGL_RESULT err;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001093
1094 memset(&pipeline, 0, sizeof(pipeline));
1095 pipeline.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1096
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001097 memset(&ia, 0, sizeof(ia));
1098 ia.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
1099 ia.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
1100
1101 memset(&rs, 0, sizeof(rs));
1102 rs.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
1103
1104 memset(&cb, 0, sizeof(cb));
1105 cb.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
1106 cb.attachment[0].format = demo->format;
1107 cb.attachment[0].channelWriteMask = 0xf;
1108
1109 memset(&db, 0, sizeof(db));
1110 db.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO;
1111 db.format = demo->depth.format;
1112
1113 memset(&vs_slots, 0, sizeof(vs_slots));
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001114 vs_slots[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1115 vs_slots[0].shaderEntityIndex = 0;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001116
1117 memset(&fs_slots, 0, sizeof(fs_slots));
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001118 fs_slots[1].slotObjectType = XGL_SLOT_SHADER_SAMPLER;
1119 fs_slots[1].shaderEntityIndex = 0;
1120 fs_slots[2].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1121 fs_slots[2].shaderEntityIndex = 0;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001122
1123 memset(&vs, 0, sizeof(vs));
1124 vs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1125 vs.shader.stage = XGL_SHADER_STAGE_VERTEX;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001126 vs.shader.shader = demo_prepare_vs(demo);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001127 assert(vs.shader.shader != NULL);
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001128 vs.shader.descriptorSetMapping[0].descriptorCount = 3;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001129 vs.shader.descriptorSetMapping[0].pDescriptorInfo = vs_slots;
1130
1131 memset(&fs, 0, sizeof(fs));
1132 fs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1133 fs.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1134 fs.shader.shader = demo_prepare_fs(demo);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001135 assert(fs.shader.shader != NULL);
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001136 fs.shader.descriptorSetMapping[0].descriptorCount = 3;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001137 fs.shader.descriptorSetMapping[0].pDescriptorInfo = fs_slots;
1138
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001139 pipeline.pNext = (const XGL_VOID *) &ia;
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001140 ia.pNext = (const XGL_VOID *) &rs;
1141 rs.pNext = (const XGL_VOID *) &cb;
1142 cb.pNext = (const XGL_VOID *) &db;
1143 db.pNext = (const XGL_VOID *) &vs;
1144 vs.pNext = (const XGL_VOID *) &fs;
1145
1146 err = xglCreateGraphicsPipeline(demo->device, &pipeline, &demo->pipeline);
1147 assert(!err);
1148
1149 xglDestroyObject(vs.shader.shader);
1150 xglDestroyObject(fs.shader.shader);
1151}
1152
1153static void demo_prepare_dynamic_states(struct demo *demo)
1154{
1155 XGL_VIEWPORT_STATE_CREATE_INFO viewport;
1156 XGL_RASTER_STATE_CREATE_INFO raster;
1157 XGL_MSAA_STATE_CREATE_INFO msaa;
1158 XGL_COLOR_BLEND_STATE_CREATE_INFO color_blend;
1159 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depth_stencil;
1160 XGL_RESULT err;
1161
1162 memset(&viewport, 0, sizeof(viewport));
1163 viewport.viewportCount = 1;
1164 viewport.scissorEnable = XGL_FALSE;
1165 viewport.viewports[0].width = (XGL_FLOAT) demo->width;
1166 viewport.viewports[0].height = (XGL_FLOAT) demo->height;
1167 viewport.viewports[0].minDepth = (XGL_FLOAT) 0.0f;
1168 viewport.viewports[0].maxDepth = (XGL_FLOAT) 1.0f;
1169
1170 memset(&raster, 0, sizeof(raster));
1171 raster.sType = XGL_STRUCTURE_TYPE_RASTER_STATE_CREATE_INFO;
1172 raster.fillMode = XGL_FILL_SOLID;
1173 raster.cullMode = XGL_CULL_NONE;
1174 raster.frontFace = XGL_FRONT_FACE_CCW;
1175
1176 memset(&msaa, 0, sizeof(msaa));
1177 msaa.sType = XGL_STRUCTURE_TYPE_MSAA_STATE_CREATE_INFO;
1178 msaa.samples = 1;
1179 msaa.sampleMask = 0x1;
1180
1181 memset(&color_blend, 0, sizeof(color_blend));
1182 color_blend.sType = XGL_STRUCTURE_TYPE_COLOR_BLEND_STATE_CREATE_INFO;
1183
1184 memset(&depth_stencil, 0, sizeof(depth_stencil));
1185 depth_stencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
1186 depth_stencil.depthTestEnable = XGL_TRUE;
1187 depth_stencil.depthWriteEnable = XGL_TRUE;
1188 depth_stencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
1189 depth_stencil.depthBoundsEnable = XGL_FALSE;
1190
1191 err = xglCreateViewportState(demo->device, &viewport, &demo->viewport);
1192 assert(!err);
1193
1194 err = xglCreateRasterState(demo->device, &raster, &demo->raster);
1195 assert(!err);
1196
1197 err = xglCreateMsaaState(demo->device, &msaa, &demo->msaa);
1198 assert(!err);
1199
1200 err = xglCreateColorBlendState(demo->device,
1201 &color_blend, &demo->color_blend);
1202 assert(!err);
1203
1204 err = xglCreateDepthStencilState(demo->device,
1205 &depth_stencil, &demo->depth_stencil);
1206 assert(!err);
1207}
1208
1209static void demo_prepare(struct demo *demo)
1210{
1211 const XGL_CMD_BUFFER_CREATE_INFO cmd = {
1212 .sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO,
1213 .pNext = NULL,
1214 .queueType = XGL_QUEUE_TYPE_GRAPHICS,
1215 .flags = 0,
1216 };
1217 XGL_RESULT err;
1218
1219 demo_prepare_buffers(demo);
1220 demo_prepare_depth(demo);
1221 demo_prepare_textures(demo);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001222 if (do_tri) {
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001223// demo_prepare_vertices(demo);
1224 demo_prepare_tri_data_buffer(demo);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001225 } else {
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001226 demo_prepare_cube_data_buffer(demo);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001227 }
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001228 demo_prepare_descriptor_set(demo);
1229
1230 demo_prepare_pipeline(demo);
1231 demo_prepare_dynamic_states(demo);
1232
1233 err = xglCreateCommandBuffer(demo->device, &cmd, &demo->cmd);
1234 assert(!err);
1235}
1236
1237static void demo_handle_event(struct demo *demo,
1238 const xcb_generic_event_t *event)
1239{
1240 switch (event->response_type & 0x7f) {
1241 case XCB_EXPOSE:
1242 demo_draw(demo);
1243 break;
1244 case XCB_KEY_RELEASE:
1245 {
1246 const xcb_key_release_event_t *key =
1247 (const xcb_key_release_event_t *) event;
1248
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001249 switch (key->detail) {
1250 case 0x9: // Escape
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001251 demo->quit = true;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001252 break;
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001253 case 0x71: // left arrow key
1254 // Wait for work to finish before updating MVP.
1255 xglDeviceWaitIdle(demo->device);
1256
1257 demo_update_data_buffer(demo, false);
1258
1259 demo_draw(demo);
1260 break;
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001261 case 0x72: // right arrow key
1262 // Wait for work to finish before updating MVP.
1263 xglDeviceWaitIdle(demo->device);
1264
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001265 demo_update_data_buffer(demo, true);
Courtney Goeltzenleuchterfc3b9532014-10-28 10:32:57 -06001266
1267 demo_draw(demo);
1268 break;
1269 }
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001270 }
1271 break;
1272 default:
1273 break;
1274 }
1275}
1276
1277static void demo_run(struct demo *demo)
1278{
1279 xcb_flush(demo->connection);
1280
1281 while (!demo->quit) {
1282 xcb_generic_event_t *event;
1283
1284 event = xcb_wait_for_event(demo->connection);
1285 if (event) {
1286 demo_handle_event(demo, event);
1287 free(event);
1288 }
1289 }
1290}
1291
1292static void demo_create_window(struct demo *demo)
1293{
1294 uint32_t value_mask, value_list[32];
1295
1296 demo->window = xcb_generate_id(demo->connection);
1297
1298 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
1299 value_list[0] = demo->screen->black_pixel;
1300 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE |
1301 XCB_EVENT_MASK_EXPOSURE;
1302
1303 xcb_create_window(demo->connection,
1304 XCB_COPY_FROM_PARENT,
1305 demo->window, demo->screen->root,
1306 0, 0, demo->width, demo->height, 0,
1307 XCB_WINDOW_CLASS_INPUT_OUTPUT,
1308 demo->screen->root_visual,
1309 value_mask, value_list);
1310
1311 xcb_map_window(demo->connection, demo->window);
1312}
1313
1314static void demo_init_xgl(struct demo *demo)
1315{
1316 const XGL_APPLICATION_INFO app = {
1317 .sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO,
1318 .pNext = NULL,
1319 .pAppName = (const XGL_CHAR *) "cube",
1320 .appVersion = 0,
1321 .pEngineName = (const XGL_CHAR *) "cube",
1322 .engineVersion = 0,
1323 .apiVersion = XGL_MAKE_VERSION(0, 22, 0),
1324 };
1325 const XGL_WSI_X11_CONNECTION_INFO connection = {
1326 .pConnection = demo->connection,
1327 .root = demo->screen->root,
1328 .provider = 0,
1329 };
1330 const XGL_DEVICE_QUEUE_CREATE_INFO queue = {
1331 .queueNodeIndex = 0,
1332 .queueCount = 1,
1333 };
1334 const XGL_CHAR *ext_names[] = {
1335 (const XGL_CHAR *) "XGL_WSI_X11",
1336 };
1337 const XGL_DEVICE_CREATE_INFO device = {
1338 .sType = XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
1339 .pNext = NULL,
1340 .queueRecordCount = 1,
1341 .pRequestedQueues = &queue,
1342 .extensionCount = 1,
1343 .ppEnabledExtensionNames = ext_names,
1344 .maxValidationLevel = XGL_VALIDATION_LEVEL_END_RANGE,
1345 .flags = XGL_DEVICE_CREATE_VALIDATION_BIT,
1346 };
1347 XGL_RESULT err;
1348 XGL_UINT gpu_count;
1349 XGL_UINT i;
1350
1351 err = xglInitAndEnumerateGpus(&app, NULL, 1, &gpu_count, &demo->gpu);
1352 assert(!err && gpu_count == 1);
1353
1354 for (i = 0; i < device.extensionCount; i++) {
1355 err = xglGetExtensionSupport(demo->gpu, ext_names[i]);
1356 assert(!err);
1357 }
1358
1359 err = xglWsiX11AssociateConnection(demo->gpu, &connection);
1360 assert(!err);
1361
1362 err = xglCreateDevice(demo->gpu, &device, &demo->device);
1363 assert(!err);
1364
1365 err = xglGetDeviceQueue(demo->device, XGL_QUEUE_TYPE_GRAPHICS,
1366 0, &demo->queue);
1367 assert(!err);
1368}
1369
1370static void demo_init_connection(struct demo *demo)
1371{
1372 const xcb_setup_t *setup;
1373 xcb_screen_iterator_t iter;
1374 int scr;
1375
1376 demo->connection = xcb_connect(NULL, &scr);
1377
1378 setup = xcb_get_setup(demo->connection);
1379 iter = xcb_setup_roots_iterator(setup);
1380 while (scr-- > 0)
1381 xcb_screen_next(&iter);
1382
1383 demo->screen = iter.data;
1384}
1385
1386static void demo_init(struct demo *demo)
1387{
1388 memset(demo, 0, sizeof(*demo));
1389
1390 demo_init_connection(demo);
1391 demo_init_xgl(demo);
1392
1393 demo->width = 300;
1394 demo->height = 300;
1395 demo->format.channelFormat = XGL_CH_FMT_B8G8R8A8;
1396 demo->format.numericFormat = XGL_NUM_FMT_UNORM;
1397}
1398
1399static void demo_cleanup(struct demo *demo)
1400{
1401 XGL_UINT i;
1402
1403 xglDestroyObject(demo->cmd);
1404
1405 xglDestroyObject(demo->viewport);
1406 xglDestroyObject(demo->raster);
1407 xglDestroyObject(demo->msaa);
1408 xglDestroyObject(demo->color_blend);
1409 xglDestroyObject(demo->depth_stencil);
1410
1411 xglDestroyObject(demo->pipeline);
1412
1413 xglDestroyObject(demo->dset);
1414
Courtney Goeltzenleuchter4984d152014-10-28 14:50:30 -06001415// xglFreeMemory(demo->vertices.mem);
Courtney Goeltzenleuchter7be88a82014-10-23 13:16:59 -06001416
1417 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
1418 xglDestroyObject(demo->textures[i].view);
1419 xglDestroyObject(demo->textures[i].image);
1420 xglFreeMemory(demo->textures[i].mem);
1421 xglDestroyObject(demo->textures[i].sampler);
1422 }
1423
1424 xglDestroyObject(demo->depth.view);
1425 xglDestroyObject(demo->depth.image);
1426 xglFreeMemory(demo->depth.mem);
1427
1428 for (i = 0; i < DEMO_BUFFER_COUNT; i++) {
1429 xglDestroyObject(demo->buffers[i].view);
1430 xglDestroyObject(demo->buffers[i].image);
1431 }
1432
1433 xglDestroyDevice(demo->device);
1434
1435 xcb_destroy_window(demo->connection, demo->window);
1436 xcb_disconnect(demo->connection);
1437}
1438
1439int main(void)
1440{
1441 struct demo demo;
1442
1443 demo_init(&demo);
1444
1445 demo_prepare(&demo);
1446 demo_create_window(&demo);
1447 demo_run(&demo);
1448
1449 demo_cleanup(&demo);
1450
1451 return 0;
1452}