blob: af87727ca33ff31a2800256734f978a4268fc19d [file] [log] [blame]
Cody Northrop722ff402014-10-20 09:22:42 -06001// Copyright 2005, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
31// XGL tests
32//
33// Copyright (C) 2014 LunarG, Inc.
34//
35// Permission is hereby granted, free of charge, to any person obtaining a
36// copy of this software and associated documentation files (the "Software"),
37// to deal in the Software without restriction, including without limitation
38// the rights to use, copy, modify, merge, publish, distribute, sublicense,
39// and/or sell copies of the Software, and to permit persons to whom the
40// Software is furnished to do so, subject to the following conditions:
41//
42// The above copyright notice and this permission notice shall be included
43// in all copies or substantial portions of the Software.
44//
45// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
48// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
50// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
51// DEALINGS IN THE SOFTWARE.
52
53// Basic rendering tests
54
55#include <stdlib.h>
56#include <stdio.h>
57#include <stdbool.h>
58#include <string.h>
59#include <iostream>
60#include <fstream>
61using namespace std;
62
63#include <xgl.h>
64#include "gtest-1.7.0/include/gtest/gtest.h"
65
66#include "xgldevice.h"
67#include "xglimage.h"
68#include "icd-bil.h"
69
70#define GLM_FORCE_RADIANS
71#include "glm/glm.hpp"
72#include <glm/gtc/matrix_transform.hpp>
73
74#include "xglrenderframework.h"
75
76#undef ASSERT_NO_FATAL_FAILURE
77#define ASSERT_NO_FATAL_FAILURE(x) x
78
79//--------------------------------------------------------------------------------------
80// Mesh and VertexFormat Data
81//--------------------------------------------------------------------------------------
82struct Vertex
83{
84 XGL_FLOAT posX, posY, posZ, posW; // Position data
85 XGL_FLOAT r, g, b, a; // Color
86};
87
88#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
89
90static const Vertex g_vbData[] =
91{
92 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
93 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
94 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
95 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
96 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
97 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
98
99 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
100 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.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( 0.f, 1.f, 1.f ) },
104 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
105
106 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
107 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
108 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
109 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
110 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
111 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
112
113 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
114 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
115 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
116 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
117 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
118 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
119
120 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
121 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
122 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
123 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
124 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
125 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
126
127 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
128 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
129 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
130 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
131 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
132 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
133};
134
135class XglRenderTest : public XglRenderFramework
136{
137public:
138 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
139 void InitTexture();
140 void InitSampler();
141 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
142 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
143 void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
144 void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText);
Cody Northrop0fdf64e2014-10-20 11:51:06 -0600145 void DrawTriangleFSUniformBlock(const char *vertShaderText, const char *fragShaderText);
146 void DrawTriangleVSUniformBlock(const char *vertShaderText, const char *fragShaderText);
147 void DrawTriangleVSFSUniformBlock(const char *vertShaderText, const char *fragShaderText);
Cody Northropc6953d02014-10-20 11:23:32 -0600148 void DrawTexturedTriangle(const char *vertShaderText, const char *fragShaderText);
Cody Northrop722ff402014-10-20 09:22:42 -0600149
Cody Northrop0fdf64e2014-10-20 11:51:06 -0600150
Cody Northrop722ff402014-10-20 09:22:42 -0600151 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
152 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop0fdf64e2014-10-20 11:51:06 -0600153 void CreatePipelineVSFSUniformBlock(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northropc6953d02014-10-20 11:23:32 -0600154 void CreatePipelineSingleTextureAndSampler(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop722ff402014-10-20 09:22:42 -0600155 void DrawRotatedTriangleTest();
156
157
158protected:
159 XGL_IMAGE m_texture;
160 XGL_IMAGE_VIEW m_textureView;
161 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
162 XGL_GPU_MEMORY m_textureMem;
163
164 XGL_SAMPLER m_sampler;
165
166// XGL_APPLICATION_INFO app_info;
167// XGL_PHYSICAL_GPU objs[MAX_GPUS];
168// XGL_UINT gpu_count;
169// XGL_GPU_MEMORY m_descriptor_set_mem;
170// XGL_GPU_MEMORY m_pipe_mem;
171// XglDevice *m_device;
172// XGL_CMD_BUFFER m_cmdBuffer;
173// XGL_UINT32 m_numVertices;
174// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
175// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
176// XGL_GPU_MEMORY m_vtxBufferMem;
177// XGL_GPU_MEMORY m_constantBufferMem;
178// XGL_UINT32 m_numMemRefs;
179// XGL_MEMORY_REF m_memRefs[5];
180// XGL_RASTER_STATE_OBJECT m_stateRaster;
181// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
182// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
183// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
184// XGL_MSAA_STATE_OBJECT m_stateMsaa;
185// XGL_DESCRIPTOR_SET m_rsrcDescSet;
186
187 virtual void SetUp() {
188
189 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
190 this->app_info.pNext = NULL;
Cody Northropaa853252014-10-20 09:25:17 -0600191 this->app_info.pAppName = (const XGL_CHAR *) "compiler render_tests";
Cody Northrop722ff402014-10-20 09:22:42 -0600192 this->app_info.appVersion = 1;
193 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
194 this->app_info.engineVersion = 1;
195 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
196
197 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
198 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
199
200 InitFramework();
201 }
202
203 virtual void TearDown() {
204 // Clean up resources before we reset
205 ShutdownFramework();
206 }
207};
208
209// this function will create the vertex buffer and fill it with the mesh data
210void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
211 const void* vertices )
212{
213 XGL_RESULT err = XGL_SUCCESS;
214
215 assert( numVertices * vbStride > 0 );
216 m_numVertices = numVertices;
217
218 XGL_MEMORY_ALLOC_INFO alloc_info = {};
219 XGL_UINT8 *pData;
220
221 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
222 alloc_info.allocationSize = numVertices * vbStride;
223 alloc_info.alignment = 0;
224 alloc_info.heapCount = 1;
225 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
226
227 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
228 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
229
230 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
231 ASSERT_XGL_SUCCESS(err);
232
233 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
234 ASSERT_XGL_SUCCESS(err);
235
236 memcpy(pData, vertices, alloc_info.allocationSize);
237
238 err = xglUnmapMemory(m_vtxBufferMem);
239 ASSERT_XGL_SUCCESS(err);
240
241 // set up the memory view for the vertex buffer
242 this->m_vtxBufferView.stride = vbStride;
243 this->m_vtxBufferView.range = numVertices * vbStride;
244 this->m_vtxBufferView.offset = 0;
245 this->m_vtxBufferView.mem = m_vtxBufferMem;
246 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
247 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
248
249 // open the command buffer
250 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
251 ASSERT_XGL_SUCCESS(err);
252
253 XGL_MEMORY_STATE_TRANSITION transition = {};
254 transition.mem = m_vtxBufferMem;
255 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
256 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
257 transition.offset = 0;
258 transition.regionSize = numVertices * vbStride;
259
260 // write transition to the command buffer
261 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
262 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
263
264 // finish recording the command buffer
265 err = xglEndCommandBuffer( m_cmdBuffer );
266 ASSERT_XGL_SUCCESS(err);
267
268 // this command buffer only uses the vertex buffer memory
269 m_numMemRefs = 1;
270 m_memRefs[0].flags = 0;
271 m_memRefs[0].mem = m_vtxBufferMem;
272
273 // submit the command buffer to the universal queue
274 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
275 ASSERT_XGL_SUCCESS(err);
276}
277
278void XglRenderTest::InitTexture()
279{
280#define DEMO_TEXTURE_COUNT 1
281
282 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
283 const XGL_INT tex_width = 16;
284 const XGL_INT tex_height = 16;
285 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
286 { 0xffff0000, 0xff00ff00 },
287 };
288 XGL_RESULT err;
289 XGL_UINT i;
290
291 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
292 const XGL_SAMPLER_CREATE_INFO sampler = {
293 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
294 .pNext = NULL,
295 .magFilter = XGL_TEX_FILTER_NEAREST,
296 .minFilter = XGL_TEX_FILTER_NEAREST,
297 .mipMode = XGL_TEX_MIPMAP_BASE,
298 .addressU = XGL_TEX_ADDRESS_WRAP,
299 .addressV = XGL_TEX_ADDRESS_WRAP,
300 .addressW = XGL_TEX_ADDRESS_WRAP,
301 .mipLodBias = 0.0f,
302 .maxAnisotropy = 0,
303 .compareFunc = XGL_COMPARE_NEVER,
304 .minLod = 0.0f,
305 .maxLod = 0.0f,
306 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
307 };
308 const XGL_IMAGE_CREATE_INFO image = {
309 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
310 .pNext = NULL,
311 .imageType = XGL_IMAGE_2D,
312 .format = tex_format,
313 .extent = { tex_width, tex_height, 1 },
314 .mipLevels = 1,
315 .arraySize = 1,
316 .samples = 1,
317 .tiling = XGL_LINEAR_TILING,
318 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
319 .flags = 0,
320 };
321 XGL_MEMORY_ALLOC_INFO mem_alloc;
322 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
323 mem_alloc.pNext = NULL;
324 mem_alloc.allocationSize = 0;
325 mem_alloc.alignment = 0;
326 mem_alloc.flags = 0;
327 mem_alloc.heapCount = 0;
328 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
329 XGL_IMAGE_VIEW_CREATE_INFO view;
330 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
331 view.pNext = NULL;
332 view.image = XGL_NULL_HANDLE;
333 view.viewType = XGL_IMAGE_VIEW_2D;
334 view.format = image.format;
335 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
336 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
337 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
338 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
339 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
340 view.subresourceRange.baseMipLevel = 0;
341 view.subresourceRange.mipLevels = 1;
342 view.subresourceRange.baseArraySlice = 0;
343 view.subresourceRange.arraySize = 1;
344 view.minLod = 0.0f;
345
346 XGL_MEMORY_REQUIREMENTS mem_reqs;
347 XGL_SIZE mem_reqs_size;
348
349 /* create sampler */
350 err = xglCreateSampler(device(), &sampler, &m_sampler);
351 assert(!err);
352
353 /* create image */
354 err = xglCreateImage(device(), &image, &m_texture);
355 assert(!err);
356
357 err = xglGetObjectInfo(m_texture,
358 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
359 &mem_reqs_size, &mem_reqs);
360 assert(!err && mem_reqs_size == sizeof(mem_reqs));
361
362 mem_alloc.allocationSize = mem_reqs.size;
363 mem_alloc.alignment = mem_reqs.alignment;
364 mem_alloc.heapCount = mem_reqs.heapCount;
365 memcpy(mem_alloc.heaps, mem_reqs.heaps,
366 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
367
368 /* allocate memory */
369 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
370 assert(!err);
371
372 /* bind memory */
373 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
374 assert(!err);
375
376 /* create image view */
377 view.image = m_texture;
378 err = xglCreateImageView(device(), &view, &m_textureView);
379 assert(!err);
380 }
381
382 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
383 const XGL_IMAGE_SUBRESOURCE subres = {
384 .aspect = XGL_IMAGE_ASPECT_COLOR,
385 .mipLevel = 0,
386 .arraySlice = 0,
387 };
388 XGL_SUBRESOURCE_LAYOUT layout;
389 XGL_SIZE layout_size;
390 XGL_VOID *data;
391 XGL_INT x, y;
392
393 err = xglGetImageSubresourceInfo(m_texture, &subres,
394 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
395 assert(!err && layout_size == sizeof(layout));
396
397 err = xglMapMemory(m_textureMem, 0, &data);
398 assert(!err);
399
400 for (y = 0; y < tex_height; y++) {
401 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
402 for (x = 0; x < tex_width; x++)
403 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
404 }
405
406 err = xglUnmapMemory(m_textureMem);
407 assert(!err);
408 }
409
410 m_textureViewInfo.view = m_textureView;
411}
412
413void XglRenderTest::InitSampler()
414{
415 XGL_RESULT err;
416
417 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
418 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
419 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
420 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
421 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
422 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
423 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
424 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
425 samplerCreateInfo.mipLodBias = 0.0;
426 samplerCreateInfo.maxAnisotropy = 0.0;
427 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
428 samplerCreateInfo.minLod = 0.0;
429 samplerCreateInfo.maxLod = 0.0;
430 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
431
432 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
433 ASSERT_XGL_SUCCESS(err);
434}
435
436void XglRenderTest::DrawRotatedTriangleTest()
437{
438 // TODO : This test will pass a matrix into VS to affect triangle orientation.
439}
440
441void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
442{
443 XGL_PIPELINE pipeline;
444 XGL_SHADER vs, ps;
445 XGL_RESULT err;
446
447 ASSERT_NO_FATAL_FAILURE(InitState());
448 ASSERT_NO_FATAL_FAILURE(InitViewport());
449
450 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
451 vertShaderText, &vs));
452
453 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
454 fragShaderText, &ps));
455
456 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
457
458 /*
459 * Shaders are now part of the pipeline, don't need these anymore
460 */
461 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
462 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
463
464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
465
466 const int constantCount = 4;
467 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
468 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
469
470 // Create descriptor set for a uniform resource
471 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
472 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
473 descriptorInfo.slots = 1;
474
475 // create a descriptor set with a single slot
476 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
477 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
478
479 // bind memory to the descriptor set
480 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
481
482 // write the constant buffer view to the descriptor set
483 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
484 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
485 xglEndDescriptorSetUpdate( m_rsrcDescSet );
486
487 // Build command buffer
488 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
489 ASSERT_XGL_SUCCESS(err);
490
491 GenerateClearAndPrepareBufferCmds();
492 GenerateBindRenderTargetCmd();
493 GenerateBindStateAndPipelineCmds(&pipeline);
494
495// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
496// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
497
498 // render the cube
499 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
500
501 // prepare the back buffer for present
502// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
503// transitionToPresent.image = m_image;
504// transitionToPresent.oldState = m_image_state;
505// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
506// transitionToPresent.subresourceRange = srRange;
507// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
508// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
509
510 // finalize recording of the command buffer
511 err = xglEndCommandBuffer( m_cmdBuffer );
512 ASSERT_XGL_SUCCESS( err );
513
514 // this command buffer only uses the vertex buffer memory
515 m_numMemRefs = 0;
516// m_memRefs[0].flags = 0;
517// m_memRefs[0].mem = m_vtxBufferMemory;
518
519 // submit the command buffer to the universal queue
520 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
521 ASSERT_XGL_SUCCESS( err );
522
523 err = xglQueueWaitIdle( m_device->m_queue );
524 ASSERT_XGL_SUCCESS( err );
525
526 // Wait for work to finish before cleaning up.
527 xglDeviceWaitIdle(m_device->device());
528
529 RecordImage(m_renderTarget);
530
531}
532
533void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
534{
535 XGL_PIPELINE pipeline;
536 XGL_SHADER vs, ps;
537 XGL_RESULT err;
538
539 ASSERT_NO_FATAL_FAILURE(InitState());
540 ASSERT_NO_FATAL_FAILURE(InitViewport());
541
542 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
543 vertShaderText, &vs));
544
545 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
546 fragShaderText, &ps));
547
548 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
549
550 /*
551 * Shaders are now part of the pipeline, don't need these anymore
552 */
553 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
554 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
555
556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
557
558 const int constantCount = 8;
559 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
560 0.0, 0.0, 1.0, 1.0 };
561
562 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
563
564 // Create descriptor set for a uniform resource
565 const int slotCount = 1;
566 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
567 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
568 descriptorInfo.slots = slotCount;
569
570 // create a descriptor set with a single slot
571 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
572 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
573
574 // bind memory to the descriptor set
575 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
576
577 // write the constant buffer view to the descriptor set
578 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
579 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
580 xglEndDescriptorSetUpdate( m_rsrcDescSet );
581
582 // Build command buffer
583 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
584 ASSERT_XGL_SUCCESS(err);
585
586 GenerateClearAndPrepareBufferCmds();
587 GenerateBindRenderTargetCmd();
588 GenerateBindStateAndPipelineCmds(&pipeline);
589
590// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
591// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
592
593 // render the cube
594 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
595
596 // prepare the back buffer for present
597// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
598// transitionToPresent.image = m_image;
599// transitionToPresent.oldState = m_image_state;
600// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
601// transitionToPresent.subresourceRange = srRange;
602// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
603// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
604
605 // finalize recording of the command buffer
606 err = xglEndCommandBuffer( m_cmdBuffer );
607 ASSERT_XGL_SUCCESS( err );
608
609 // this command buffer only uses the vertex buffer memory
610 m_numMemRefs = 0;
611// m_memRefs[0].flags = 0;
612// m_memRefs[0].mem = m_vtxBufferMemory;
613
614 // submit the command buffer to the universal queue
615 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
616 ASSERT_XGL_SUCCESS( err );
617
618 err = xglQueueWaitIdle( m_device->m_queue );
619 ASSERT_XGL_SUCCESS( err );
620
621 // Wait for work to finish before cleaning up.
622 xglDeviceWaitIdle(m_device->device());
623
624 RecordImage(m_renderTarget);
625
626}
627
Cody Northropc6953d02014-10-20 11:23:32 -0600628void XglRenderTest::DrawTexturedTriangle(const char *vertShaderText, const char *fragShaderText)
629{
630
631 // based on DrawTriangleTwoUniformsFS
632
633 XGL_PIPELINE pipeline;
634 XGL_SHADER vs, ps;
635 XGL_RESULT err;
636
637 ASSERT_NO_FATAL_FAILURE(InitState());
638 ASSERT_NO_FATAL_FAILURE(InitViewport());
639
640 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
641 vertShaderText, &vs));
642
643 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
644 fragShaderText, &ps));
645
646 ASSERT_NO_FATAL_FAILURE(CreatePipelineSingleTextureAndSampler(&pipeline, vs, ps));
647
648 /*
649 * Shaders are now part of the pipeline, don't need these anymore
650 */
651 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
652 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
653
654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
655
656
657 // Enable our single sampler
658 ASSERT_NO_FATAL_FAILURE(InitSampler());
659
660 // Enable our single texture
661 ASSERT_NO_FATAL_FAILURE(InitTexture());
662
663 // Create descriptor set for a texture and sampler resources
Cody Northrop5fa1d332014-10-20 11:51:32 -0600664 const int slotCount = 2;
Cody Northropc6953d02014-10-20 11:23:32 -0600665 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
666 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
667 descriptorInfo.slots = slotCount;
668
669 // create a descriptor set with a single slot
670 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
671 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
672
673 // bind memory to the descriptor set
674 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
675
676 // write the sampler and image views to the descriptor set
677 // ensure this matches order set in CreatePipelineSingleTextureAndSampler
678 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
679 xglAttachImageViewDescriptors( m_rsrcDescSet, 0, 1, &m_textureViewInfo );
680 xglAttachSamplerDescriptors(m_rsrcDescSet, 1, 1, &m_sampler);
681 xglEndDescriptorSetUpdate( m_rsrcDescSet );
682
683 // Build command buffer
684 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
685 ASSERT_XGL_SUCCESS(err);
686
687 GenerateClearAndPrepareBufferCmds();
688 GenerateBindRenderTargetCmd();
689 GenerateBindStateAndPipelineCmds(&pipeline);
690
691// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
692// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
693
694 // render the cube
695 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
696
697 // prepare the back buffer for present
698// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
699// transitionToPresent.image = m_image;
700// transitionToPresent.oldState = m_image_state;
701// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
702// transitionToPresent.subresourceRange = srRange;
703// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
704// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
705
706 // finalize recording of the command buffer
707 err = xglEndCommandBuffer( m_cmdBuffer );
708 ASSERT_XGL_SUCCESS( err );
709
710 // this command buffer only uses the vertex buffer memory
711 m_numMemRefs = 0;
712// m_memRefs[0].flags = 0;
713// m_memRefs[0].mem = m_vtxBufferMemory;
714
715 // submit the command buffer to the universal queue
716 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
717 ASSERT_XGL_SUCCESS( err );
718
719 err = xglQueueWaitIdle( m_device->m_queue );
720 ASSERT_XGL_SUCCESS( err );
721
722 // Wait for work to finish before cleaning up.
723 xglDeviceWaitIdle(m_device->device());
724
725 RecordImage(m_renderTarget);
726
727}
Cody Northrop722ff402014-10-20 09:22:42 -0600728
729void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText)
730{
731 XGL_PIPELINE pipeline;
732 XGL_SHADER vs, ps;
733 XGL_RESULT err;
734 glm::mat4 MVP;
735 int i;
736
737 // Create identity matrix
738 glm::mat4 Model = glm::mat4(1.0f);
739
740 ASSERT_NO_FATAL_FAILURE(InitState());
741 ASSERT_NO_FATAL_FAILURE(InitViewport());
742
743 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
744 vertShaderText, &vs));
745
746 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
747 fragShaderText, &ps));
748
749 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
750
751 /*
752 * Shaders are now part of the pipeline, don't need these anymore
753 */
754 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
755 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
756
757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
758
759 const int matrixSize = 16;
760 MVP = Model;
761
762 InitConstantBuffer(matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
763
764 // Create descriptor set for a uniform resource
765 const int slotCount = 1;
766 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
767 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
768 descriptorInfo.slots = slotCount;
769
770 // create a descriptor set with a single slot
771 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
772 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
773
774 // bind memory to the descriptor set
775 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
776
777 // write the constant buffer view to the descriptor set
778 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
779 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
780 xglEndDescriptorSetUpdate( m_rsrcDescSet );
781
782 // Build command buffer
783 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
784 ASSERT_XGL_SUCCESS(err);
785
786 GenerateClearAndPrepareBufferCmds();
787 GenerateBindRenderTargetCmd();
788 GenerateBindStateAndPipelineCmds(&pipeline);
789
790// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
791// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
792
793 // render the cube
794 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
795
796 // prepare the back buffer for present
797// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
798// transitionToPresent.image = m_image;
799// transitionToPresent.oldState = m_image_state;
800// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
801// transitionToPresent.subresourceRange = srRange;
802// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
803// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
804
805 // finalize recording of the command buffer
806 err = xglEndCommandBuffer( m_cmdBuffer );
807 ASSERT_XGL_SUCCESS( err );
808
809 // this command buffer only uses the vertex buffer memory
810 m_numMemRefs = 0;
811// m_memRefs[0].flags = 0;
812// m_memRefs[0].mem = m_vtxBufferMemory;
813
814 // submit the command buffer to the universal queue
815 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
816 ASSERT_XGL_SUCCESS( err );
817
818 err = xglQueueWaitIdle( m_device->m_queue );
819 ASSERT_XGL_SUCCESS( err );
820
821 // Wait for work to finish before cleaning up.
822 xglDeviceWaitIdle(m_device->device());
823
824 RecordImage(m_renderTarget);
825
826 for (i = 0; i < 8; i++) {
827 XGL_UINT8 *pData;
828 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
829 ASSERT_XGL_SUCCESS(err);
830
831 MVP = glm::rotate(MVP, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
832 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
833
834 err = xglUnmapMemory(m_constantBufferMem);
835 ASSERT_XGL_SUCCESS(err);
836
837 // submit the command buffer to the universal queue
838 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
839 ASSERT_XGL_SUCCESS( err );
840
841 err = xglQueueWaitIdle( m_device->m_queue );
842 ASSERT_XGL_SUCCESS( err );
843
844 // Wait for work to finish before cleaning up.
845 xglDeviceWaitIdle(m_device->device());
846
847 RecordImage(m_renderTarget);
848 }
849}
850
Cody Northrop0fdf64e2014-10-20 11:51:06 -0600851void XglRenderTest::DrawTriangleVSUniformBlock(const char *vertShaderText, const char *fragShaderText)
852{
853 // sourced from DrawTriangleVSUniform
854 XGL_PIPELINE pipeline;
855 XGL_SHADER vs, ps;
856 XGL_RESULT err;
857
858 ASSERT_NO_FATAL_FAILURE(InitState());
859 ASSERT_NO_FATAL_FAILURE(InitViewport());
860
861 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
862 vertShaderText, &vs));
863
864 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
865 fragShaderText, &ps));
866
867 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
868
869 /*
870 * Shaders are now part of the pipeline, don't need these anymore
871 */
872 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
873 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
874
875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
876
877 // Let's populate our buffer with the following:
878 // vec4 red;
879 // vec4 green;
880 // vec4 blue;
881 // vec4 white;
882 const int valCount = 4 * 4;
883 const float bufferVals[valCount] = { 1.0, 0.0, 0.0, 1.0,
884 0.0, 1.0, 0.0, 1.0,
885 0.0, 0.0, 1.0, 1.0,
886 1.0, 1.0, 1.0, 1.0 };
887
888 InitConstantBuffer(valCount, sizeof(bufferVals[0]), (const void*) bufferVals);
889
890 // Create descriptor set for a uniform resource
891 const int slotCount = 1;
892 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
893 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
894 descriptorInfo.slots = slotCount;
895
896 // create a descriptor set with a single slot
897 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
898 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
899
900 // bind memory to the descriptor set
901 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
902
903 // write the constant buffer view to the descriptor set
904 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
905 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
906 xglEndDescriptorSetUpdate( m_rsrcDescSet );
907
908 // Build command buffer
909 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
910 ASSERT_XGL_SUCCESS(err);
911
912 GenerateClearAndPrepareBufferCmds();
913 GenerateBindRenderTargetCmd();
914 GenerateBindStateAndPipelineCmds(&pipeline);
915
916// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
917// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
918
919 // render the cube
920 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
921
922 // prepare the back buffer for present
923// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
924// transitionToPresent.image = m_image;
925// transitionToPresent.oldState = m_image_state;
926// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
927// transitionToPresent.subresourceRange = srRange;
928// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
929// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
930
931 // finalize recording of the command buffer
932 err = xglEndCommandBuffer( m_cmdBuffer );
933 ASSERT_XGL_SUCCESS( err );
934
935 // this command buffer only uses the vertex buffer memory
936 m_numMemRefs = 0;
937// m_memRefs[0].flags = 0;
938// m_memRefs[0].mem = m_vtxBufferMemory;
939
940 // submit the command buffer to the universal queue
941 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
942 ASSERT_XGL_SUCCESS( err );
943
944 err = xglQueueWaitIdle( m_device->m_queue );
945 ASSERT_XGL_SUCCESS( err );
946
947 // Wait for work to finish before cleaning up.
948 xglDeviceWaitIdle(m_device->device());
949
950 RecordImage(m_renderTarget);
951}
952
Cody Northrop722ff402014-10-20 09:22:42 -0600953void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
954{
955 XGL_RESULT err;
956 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
957 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
958 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
959
960
961 // Create descriptor set for our one resource
962 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
963 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
964 descriptorInfo.slots = 1; // Vertex buffer only
965
966 // create a descriptor set with a single slot
967 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
968 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
969
970 // bind memory to the descriptor set
971 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
972
973 // write the vertex buffer view to the descriptor set
974 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
975 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
976 xglEndDescriptorSetUpdate( m_rsrcDescSet );
977
978 const int slots = 1;
979 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
980 slotInfo[0].shaderEntityIndex = 0;
981 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
982
983 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
984 vs_stage.pNext = XGL_NULL_HANDLE;
985 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
986 vs_stage.shader.shader = vs;
987 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
988 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
989 vs_stage.shader.linkConstBufferCount = 0;
990 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
991 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
992 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
993
994 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
995 ps_stage.pNext = &vs_stage;
996 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
997 ps_stage.shader.shader = ps;
998 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
999 ps_stage.shader.linkConstBufferCount = 0;
1000 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1001 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1002 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1003
1004 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1005 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1006 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1007 };
1008
1009 // this is the current description of g_vbData
1010 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1011 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1012 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1013 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1014 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1015 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1016 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1017 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1018 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1019
1020 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
1021 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
1022 &ps_stage, // pNext;
1023 1, // bindingCount
1024 &vi_binding, // pVertexBindingDescriptions;
1025 2, // attributeCount; // number of attributes
1026 vi_attribs // pVertexAttributeDescriptions;
1027 };
1028
1029 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1030 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1031 &vi_state, // pNext
1032 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1033 XGL_FALSE, // disableVertexReuse
1034 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1035 XGL_FALSE, // primitiveRestartEnable
1036 0 // primitiveRestartIndex
1037 };
1038
1039 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1040 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1041 &ia_state,
1042 XGL_FALSE, // depthClipEnable
1043 XGL_FALSE, // rasterizerDiscardEnable
1044 1.0 // pointSize
1045 };
1046
1047 XGL_PIPELINE_CB_STATE cb_state = {
1048 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1049 &rs_state,
1050 XGL_FALSE, // alphaToCoverageEnable
1051 XGL_FALSE, // dualSourceBlendEnable
1052 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1053 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1054 {
1055 XGL_FALSE, // blendEnable
1056 m_render_target_fmt, // XGL_FORMAT
1057 0xF // channelWriteMask
1058 }
1059 }
1060 };
1061
1062 // TODO: Should take depth buffer format from queried formats
1063 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1064 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1065 &cb_state,
1066 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1067 };
1068
1069 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1070 info.pNext = &db_state;
1071 info.flags = 0;
1072 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1073 ASSERT_XGL_SUCCESS(err);
1074
1075 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1076 ASSERT_XGL_SUCCESS(err);
1077}
1078
1079void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1080{
1081 XGL_RESULT err;
1082 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1083 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1084 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1085
1086
1087 const int vsSlots = 1; // Uniform buffer only
1088
1089 // Create descriptor set for our one resource
1090 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1091 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1092 descriptorInfo.slots = vsSlots;
1093
1094 // create a descriptor set with a single slot
1095 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1096 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1097
1098 // bind memory to the descriptor set
1099 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1100
1101
1102 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1103 slotInfo[0].shaderEntityIndex = 0;
1104 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1105
1106 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1107 vs_stage.pNext = XGL_NULL_HANDLE;
1108 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1109 vs_stage.shader.shader = vs;
1110 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1111 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
1112 vs_stage.shader.linkConstBufferCount = 0;
1113 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1114 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1115 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1116
1117 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1118 ps_stage.pNext = &vs_stage;
1119 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1120 ps_stage.shader.shader = ps;
1121 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1122 ps_stage.shader.linkConstBufferCount = 0;
1123 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1124 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1125 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1126
1127 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1128 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1129 &ps_stage, // pNext
1130 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1131 XGL_FALSE, // disableVertexReuse
1132 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1133 XGL_FALSE, // primitiveRestartEnable
1134 0 // primitiveRestartIndex
1135 };
1136
1137 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1138 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1139 &ia_state,
1140 XGL_FALSE, // depthClipEnable
1141 XGL_FALSE, // rasterizerDiscardEnable
1142 1.0 // pointSize
1143 };
1144
1145 XGL_PIPELINE_CB_STATE cb_state = {
1146 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1147 &rs_state,
1148 XGL_FALSE, // alphaToCoverageEnable
1149 XGL_FALSE, // dualSourceBlendEnable
1150 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1151 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1152 {
1153 XGL_FALSE, // blendEnable
1154 m_render_target_fmt, // XGL_FORMAT
1155 0xF // channelWriteMask
1156 }
1157 }
1158 };
1159
1160 // TODO: Should take depth buffer format from queried formats
1161 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1162 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1163 &cb_state,
1164 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1165 };
1166
1167 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1168 info.pNext = &db_state;
1169 info.flags = 0;
1170 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1171 ASSERT_XGL_SUCCESS(err);
1172
1173 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1174 ASSERT_XGL_SUCCESS(err);
1175}
1176
Cody Northrop0fdf64e2014-10-20 11:51:06 -06001177void XglRenderTest::CreatePipelineVSFSUniformBlock(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1178{
1179 // this is based on CreatePipelineVSUniform
1180
1181 XGL_RESULT err;
1182 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1183 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1184 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1185
1186
1187 const int slots = 1; // Uniform buffer only
1188
1189 // Create descriptor set for our one resource
1190 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1191 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1192 descriptorInfo.slots = slots;
1193
1194 // create a descriptor set with a single slot
1195 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1196 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1197
1198 // bind memory to the descriptor set
1199 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1200
1201
1202 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1203 slotInfo[0].shaderEntityIndex = 0;
1204 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1205
1206 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1207 vs_stage.pNext = XGL_NULL_HANDLE;
1208 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1209 vs_stage.shader.shader = vs;
1210 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1211 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1212 vs_stage.shader.linkConstBufferCount = 0;
1213 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1214 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1215 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1216
1217 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1218 ps_stage.pNext = &vs_stage;
1219 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1220 ps_stage.shader.shader = ps;
1221 ps_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1222 ps_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1223 ps_stage.shader.linkConstBufferCount = 0;
1224 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1225 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1226 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1227
1228 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1229 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1230 &ps_stage, // pNext
1231 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1232 XGL_FALSE, // disableVertexReuse
1233 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1234 XGL_FALSE, // primitiveRestartEnable
1235 0 // primitiveRestartIndex
1236 };
1237
1238 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1239 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1240 &ia_state,
1241 XGL_FALSE, // depthClipEnable
1242 XGL_FALSE, // rasterizerDiscardEnable
1243 1.0 // pointSize
1244 };
1245
1246 XGL_PIPELINE_CB_STATE cb_state = {
1247 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1248 &rs_state,
1249 XGL_FALSE, // alphaToCoverageEnable
1250 XGL_FALSE, // dualSourceBlendEnable
1251 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1252 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1253 {
1254 XGL_FALSE, // blendEnable
1255 m_render_target_fmt, // XGL_FORMAT
1256 0xF // channelWriteMask
1257 }
1258 }
1259 };
1260
1261 // TODO: Should take depth buffer format from queried formats
1262 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1263 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1264 &cb_state,
1265 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1266 };
1267
1268 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1269 info.pNext = &db_state;
1270 info.flags = 0;
1271 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1272 ASSERT_XGL_SUCCESS(err);
1273
1274 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1275 ASSERT_XGL_SUCCESS(err);
1276}
1277
Cody Northropc6953d02014-10-20 11:23:32 -06001278void XglRenderTest::CreatePipelineSingleTextureAndSampler(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1279{
1280 // based on CreatePipelineVSUniform
1281
1282 XGL_RESULT err;
1283 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1284 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1285 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1286
1287 const int psSlots = 2; // One texture, one sampler
1288
1289 // Create descriptor set for single texture and sampler
1290 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1291 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1292 descriptorInfo.slots = psSlots;
1293 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1294 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1295 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1296
Cody Northropc6953d02014-10-20 11:23:32 -06001297 // Assign the slots, note that only t0 and s0 will work as of writing this test
1298 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( psSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1299 slotInfo[0].shaderEntityIndex = 0;
1300 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1301 slotInfo[1].shaderEntityIndex = 0;
1302 slotInfo[1].slotObjectType = XGL_SLOT_SHADER_SAMPLER;
1303
1304 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1305 vs_stage.pNext = XGL_NULL_HANDLE;
1306 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1307 vs_stage.shader.shader = vs;
1308 vs_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1309 vs_stage.shader.linkConstBufferCount = 0;
1310 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1311 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1312 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1313
1314 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1315 ps_stage.pNext = &vs_stage;
1316 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1317 ps_stage.shader.shader = ps;
1318 ps_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1319 ps_stage.shader.descriptorSetMapping[0].descriptorCount = psSlots;
1320 ps_stage.shader.linkConstBufferCount = 0;
1321 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1322 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1323 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1324
1325 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1326 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1327 &ps_stage, // pNext
1328 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1329 XGL_FALSE, // disableVertexReuse
1330 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1331 XGL_FALSE, // primitiveRestartEnable
1332 0 // primitiveRestartIndex
1333 };
1334
1335 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1336 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1337 &ia_state,
1338 XGL_FALSE, // depthClipEnable
1339 XGL_FALSE, // rasterizerDiscardEnable
1340 1.0 // pointSize
1341 };
1342
1343 XGL_PIPELINE_CB_STATE cb_state = {
1344 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1345 &rs_state,
1346 XGL_FALSE, // alphaToCoverageEnable
1347 XGL_FALSE, // dualSourceBlendEnable
1348 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1349 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1350 {
1351 XGL_FALSE, // blendEnable
1352 m_render_target_fmt, // XGL_FORMAT
1353 0xF // channelWriteMask
1354 }
1355 }
1356 };
1357
1358 // TODO: Should take depth buffer format from queried formats
1359 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1360 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1361 &cb_state,
1362 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1363 };
1364
1365 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1366 info.pNext = &db_state;
1367 info.flags = 0;
1368 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1369 ASSERT_XGL_SUCCESS(err);
1370
1371 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1372 ASSERT_XGL_SUCCESS(err);
1373}
1374
Cody Northrop722ff402014-10-20 09:22:42 -06001375void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
1376{
1377 XGL_PIPELINE pipeline;
1378 XGL_SHADER vs, ps;
1379 XGL_RESULT err;
1380
1381 ASSERT_NO_FATAL_FAILURE(InitState());
1382 ASSERT_NO_FATAL_FAILURE(InitViewport());
1383 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
1384
1385 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1386 vertShaderText, &vs));
1387
1388 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1389 fragShaderText, &ps));
1390
1391 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
1392
1393 /*
1394 * Shaders are now part of the pipeline, don't need these anymore
1395 */
1396 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1397 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1398
1399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1400
1401 // Build command buffer
1402 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1403 ASSERT_XGL_SUCCESS(err);
1404
1405 GenerateClearAndPrepareBufferCmds();
1406 GenerateBindRenderTargetCmd();
1407 GenerateBindStateAndPipelineCmds(&pipeline);
1408
1409// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1410// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1411
1412 // render the cube
1413 xglCmdDraw( m_cmdBuffer, 0, 6, 0, 1 );
1414
1415 // prepare the back buffer for present
1416// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1417// transitionToPresent.image = m_image;
1418// transitionToPresent.oldState = m_image_state;
1419// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1420// transitionToPresent.subresourceRange = srRange;
1421// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1422// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1423
1424 // finalize recording of the command buffer
1425 err = xglEndCommandBuffer( m_cmdBuffer );
1426 ASSERT_XGL_SUCCESS( err );
1427
1428 // this command buffer only uses the vertex buffer memory
1429 m_numMemRefs = 0;
1430// m_memRefs[0].flags = 0;
1431// m_memRefs[0].mem = m_vtxBufferMemory;
1432
1433 // submit the command buffer to the universal queue
1434 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1435 ASSERT_XGL_SUCCESS( err );
1436
1437 err = xglQueueWaitIdle( m_device->m_queue );
1438 ASSERT_XGL_SUCCESS( err );
1439
1440 // Wait for work to finish before cleaning up.
1441 xglDeviceWaitIdle(m_device->device());
1442
1443 RecordImage(m_renderTarget);
1444
1445}
1446
Cody Northrop0fdf64e2014-10-20 11:51:06 -06001447void XglRenderTest::DrawTriangleFSUniformBlock(const char *vertShaderText, const char *fragShaderText)
1448{
1449 // probably sourced from DrawTriangleTwoUniformsFS
1450
1451 XGL_PIPELINE pipeline;
1452 XGL_SHADER vs, ps;
1453 XGL_RESULT err;
1454
1455 ASSERT_NO_FATAL_FAILURE(InitState());
1456 ASSERT_NO_FATAL_FAILURE(InitViewport());
1457
1458 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1459 vertShaderText, &vs));
1460
1461 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1462 fragShaderText, &ps));
1463
1464 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
1465
1466 /*
1467 * Shaders are now part of the pipeline, don't need these anymore
1468 */
1469 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1470 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1471
1472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1473
1474
1475 // Let's populate our buffer with the following:
1476 // vec4 red;
1477 // vec4 green;
1478 // vec4 blue;
1479 // vec4 white;
1480 const int valCount = 4 * 4;
1481 const float bufferVals[valCount] = { 1.0, 0.0, 0.0, 1.0,
1482 0.0, 1.0, 0.0, 1.0,
1483 0.0, 0.0, 1.0, 1.0,
1484 1.0, 1.0, 1.0, 1.0 };
1485
1486 InitConstantBuffer(valCount, sizeof(bufferVals[0]), (const void*) bufferVals);
1487
1488 // Create descriptor set for a uniform resource
1489 const int slotCount = 1;
1490 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1491 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1492 descriptorInfo.slots = slotCount;
1493
1494 // create a descriptor set with a single slot
1495 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1496 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1497
1498 // bind memory to the descriptor set
1499 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1500
1501 // write the constant buffer view to the descriptor set
1502 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1503 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
1504 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1505
1506 // Build command buffer
1507 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1508 ASSERT_XGL_SUCCESS(err);
1509
1510 GenerateClearAndPrepareBufferCmds();
1511 GenerateBindRenderTargetCmd();
1512 GenerateBindStateAndPipelineCmds(&pipeline);
1513
1514// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1515// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1516
1517 // render the cube
1518 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
1519
1520 // prepare the back buffer for present
1521// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1522// transitionToPresent.image = m_image;
1523// transitionToPresent.oldState = m_image_state;
1524// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1525// transitionToPresent.subresourceRange = srRange;
1526// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1527// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1528
1529 // finalize recording of the command buffer
1530 err = xglEndCommandBuffer( m_cmdBuffer );
1531 ASSERT_XGL_SUCCESS( err );
1532
1533 // this command buffer only uses the vertex buffer memory
1534 m_numMemRefs = 0;
1535// m_memRefs[0].flags = 0;
1536// m_memRefs[0].mem = m_vtxBufferMemory;
1537
1538 // submit the command buffer to the universal queue
1539 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1540 ASSERT_XGL_SUCCESS( err );
1541
1542 err = xglQueueWaitIdle( m_device->m_queue );
1543 ASSERT_XGL_SUCCESS( err );
1544
1545 // Wait for work to finish before cleaning up.
1546 xglDeviceWaitIdle(m_device->device());
1547
1548 RecordImage(m_renderTarget);
1549
1550}
1551
1552void XglRenderTest::DrawTriangleVSFSUniformBlock(const char *vertShaderText, const char *fragShaderText)
1553{
1554 // this is sourced from DrawTriangleFSUniformBlock
1555
1556 XGL_PIPELINE pipeline;
1557 XGL_SHADER vs, ps;
1558 XGL_RESULT err;
1559
1560 ASSERT_NO_FATAL_FAILURE(InitState());
1561 ASSERT_NO_FATAL_FAILURE(InitViewport());
1562
1563 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1564 vertShaderText, &vs));
1565
1566 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1567 fragShaderText, &ps));
1568
1569 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSFSUniformBlock(&pipeline, vs, ps));
1570
1571 /*
1572 * Shaders are now part of the pipeline, don't need these anymore
1573 */
1574 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1575 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1576
1577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1578
1579
1580 // Let's populate our buffer with the following:
1581 // vec4 red;
1582 // vec4 green;
1583 // vec4 blue;
1584 // vec4 white;
1585 const int valCount = 4 * 4;
1586 const float bufferVals[valCount] = { 1.0, 0.0, 0.0, 1.0,
1587 0.0, 1.0, 0.0, 1.0,
1588 0.0, 0.0, 1.0, 1.0,
1589 1.0, 1.0, 1.0, 1.0 };
1590
1591 InitConstantBuffer(valCount, sizeof(bufferVals[0]), (const void*) bufferVals);
1592
1593 // Create descriptor set for a uniform resource
1594 const int slotCount = 1;
1595 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1596 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1597 descriptorInfo.slots = slotCount;
1598
1599 // create a descriptor set with a single slot
1600 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1601 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1602
1603 // bind memory to the descriptor set
1604 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1605
1606 // write the constant buffer view to the descriptor set
1607 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1608 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
1609 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1610
1611 // Build command buffer
1612 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1613 ASSERT_XGL_SUCCESS(err);
1614
1615 GenerateClearAndPrepareBufferCmds();
1616 GenerateBindRenderTargetCmd();
1617 GenerateBindStateAndPipelineCmds(&pipeline);
1618
1619// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1620// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1621
1622 // render the cube
1623 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
1624
1625 // prepare the back buffer for present
1626// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1627// transitionToPresent.image = m_image;
1628// transitionToPresent.oldState = m_image_state;
1629// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1630// transitionToPresent.subresourceRange = srRange;
1631// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1632// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1633
1634 // finalize recording of the command buffer
1635 err = xglEndCommandBuffer( m_cmdBuffer );
1636 ASSERT_XGL_SUCCESS( err );
1637
1638 // this command buffer only uses the vertex buffer memory
1639 m_numMemRefs = 0;
1640// m_memRefs[0].flags = 0;
1641// m_memRefs[0].mem = m_vtxBufferMemory;
1642
1643 // submit the command buffer to the universal queue
1644 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1645 ASSERT_XGL_SUCCESS( err );
1646
1647 err = xglQueueWaitIdle( m_device->m_queue );
1648 ASSERT_XGL_SUCCESS( err );
1649
1650 // Wait for work to finish before cleaning up.
1651 xglDeviceWaitIdle(m_device->device());
1652
1653 RecordImage(m_renderTarget);
1654
1655}
1656
Cody Northrop722ff402014-10-20 09:22:42 -06001657TEST_F(XglRenderTest, GreenTriangle)
1658{
1659 static const char *vertShaderText =
1660 "#version 130\n"
1661 "vec2 vertices[3];\n"
1662 "void main() {\n"
1663 " vertices[0] = vec2(-1.0, -1.0);\n"
1664 " vertices[1] = vec2( 1.0, -1.0);\n"
1665 " vertices[2] = vec2( 0.0, 1.0);\n"
1666 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1667 "}\n";
1668
1669 static const char *fragShaderText =
1670 "#version 130\n"
1671 "void main() {\n"
1672 " gl_FragColor = vec4(0,1,0,1);\n"
1673 "}\n";
1674 DrawTriangleTest(vertShaderText, fragShaderText);
1675}
1676
1677TEST_F(XglRenderTest, BIL_GreenTriangle)
1678{
1679 bool saved_use_bil = XglTestFramework::m_use_bil;
1680
1681 static const char *vertShaderText =
1682 "#version 130\n"
1683 "vec2 vertices[3];\n"
1684 "void main() {\n"
1685 " vertices[0] = vec2(-1.0, -1.0);\n"
1686 " vertices[1] = vec2( 1.0, -1.0);\n"
1687 " vertices[2] = vec2( 0.0, 1.0);\n"
1688 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1689 "}\n";
1690
1691 static const char *fragShaderText =
1692 "#version 130\n"
1693 "void main() {\n"
1694 " gl_FragColor = vec4(0,1,0,1);\n"
1695 "}\n";
1696 XglTestFramework::m_use_bil = true;
1697 DrawTriangleTest(vertShaderText, fragShaderText);
1698 XglTestFramework::m_use_bil = saved_use_bil;
1699}
1700
1701TEST_F(XglRenderTest, TriangleFragUniform)
1702{
1703
1704 static const char *vertShaderText =
1705 "#version 130\n"
1706 "out vec4 color;\n"
1707 "out vec4 scale;\n"
1708 "vec2 vertices[3];\n"
1709 "void main() {\n"
1710 "vec2 vertices[3];\n"
1711 " vertices[0] = vec2(-0.5, -0.5);\n"
1712 " vertices[1] = vec2( 0.5, -0.5);\n"
1713 " vertices[2] = vec2( 0.5, 0.5);\n"
1714 "vec4 colors[3];\n"
1715 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1716 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1717 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1718 " color = colors[gl_VertexID % 3];\n"
1719 " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
1720 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1721 "}\n";
1722
1723 static const char *fragShaderText =
1724 "#version 130\n"
1725 "in vec4 color;\n"
1726 "in vec4 scale;\n"
1727 "uniform vec4 foo;\n"
1728 "void main() {\n"
1729 " gl_FragColor = color * scale + foo;\n"
1730 "}\n";
1731
1732 DrawTriangleTest(vertShaderText, fragShaderText);
1733}
1734
1735TEST_F(XglRenderTest, YellowTriangle)
1736{
1737 static const char *vertShaderText =
1738 "#version 130\n"
1739 "void main() {\n"
1740 " vec2 vertices[3];"
1741 " vertices[0] = vec2(-0.5, -0.5);\n"
1742 " vertices[1] = vec2( 0.5, -0.5);\n"
1743 " vertices[2] = vec2( 0.5, 0.5);\n"
1744 " vec4 colors[3];\n"
1745 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1746 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1747 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1748 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1749 "}\n";
1750
1751 static const char *fragShaderText =
1752 "#version 130\n"
1753 "void main() {\n"
1754 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
1755 "}\n";
1756
1757 DrawTriangleTest(vertShaderText, fragShaderText);
1758}
1759
1760TEST_F(XglRenderTest, RotatedTriangle) {
1761 DrawRotatedTriangleTest();
1762}
1763
1764TEST_F(XglRenderTest, TriangleTwoFSUniforms)
1765{
1766 static const char *vertShaderText =
1767 "#version 130\n"
1768 "out vec4 color;\n"
1769 "out vec4 scale;\n"
1770 "out vec2 samplePos;\n"
1771 "void main() {\n"
1772 " vec2 vertices[3];"
1773 " vertices[0] = vec2(-0.5, -0.5);\n"
1774 " vertices[1] = vec2( 0.5, -0.5);\n"
1775 " vertices[2] = vec2( 0.5, 0.5);\n"
1776 " vec4 colors[3];\n"
1777 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1778 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1779 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1780 " color = colors[gl_VertexID % 3];\n"
1781 " vec2 positions[3];"
1782 " positions[0] = vec2( 0.0, 0.0);\n"
1783 " positions[1] = vec2( 1.0, 0.0);\n"
1784 " positions[2] = vec2( 1.0, 1.0);\n"
1785 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
1786 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1787 "}\n";
1788
1789
1790 static const char *fragShaderText =
1791 "#version 430\n"
1792 "in vec4 color;\n"
1793 "in vec4 scale;\n"
1794 "uniform vec4 foo;\n"
1795 "uniform vec4 bar;\n"
1796 "void main() {\n"
1797 // by default, with no location or blocks
1798 // the compiler will read them from buffer
1799 // in reverse order of first use in shader
1800 // The buffer contains red, followed by blue,
1801 // so foo should be blue, bar should be red
1802 " gl_FragColor = color * scale * foo * bar + foo;\n"
1803 "}\n";
1804
1805 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
1806}
1807
1808TEST_F(XglRenderTest, TriangleWithVertexFetch)
1809{
1810 static const char *vertShaderText =
1811 "#version 130\n"
1812 //XYZ1( -1, -1, -1 )
1813 "in vec4 pos;\n"
1814 //XYZ1( 0.f, 0.f, 0.f )
1815 "in vec4 inColor;\n"
1816 "out vec4 outColor;\n"
1817 "void main() {\n"
1818 " outColor = inColor;\n"
1819 " gl_Position = pos;\n"
1820 "}\n";
1821
1822
1823 static const char *fragShaderText =
1824 "#version 430\n"
1825 "in vec4 color;\n"
1826 "void main() {\n"
1827 " gl_FragColor = color;\n"
1828 "}\n";
1829
1830 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
1831}
1832
1833TEST_F(XglRenderTest, TriangleVSUniform)
1834{
1835 static const char *vertShaderText =
1836 "#version 130\n"
1837 "uniform mat4 mvp;\n"
1838 "void main() {\n"
1839 " vec2 vertices[3];"
1840 " vertices[0] = vec2(-0.5, -0.5);\n"
1841 " vertices[1] = vec2( 0.5, -0.5);\n"
1842 " vertices[2] = vec2( 0.5, 0.5);\n"
1843 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0) * mvp;\n"
1844 "}\n";
1845
1846 static const char *fragShaderText =
1847 "#version 430\n"
1848 "void main() {\n"
1849 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
1850 "}\n";
1851
1852 // Create identity matrix
1853 glm::mat4 Model = glm::mat4(1.0f);
1854 DrawTriangleVSUniform(vertShaderText, fragShaderText);
1855
1856// Model = glm::rotate(Model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
1857// DrawTriangleVSUniform(vertShaderText, fragShaderText, Model);
1858}
1859
Cody Northrop0fdf64e2014-10-20 11:51:06 -06001860TEST_F(XglRenderTest, TriangleFSUniformBlock)
1861{
1862 // The expected result from this test is a blue triangle
1863
1864 static const char *vertShaderText =
1865 "#version 130\n"
1866 "void main() {\n"
1867 " vec2 vertices[3];"
1868 " vertices[0] = vec2(-0.5, -0.5);\n"
1869 " vertices[1] = vec2( 0.5, -0.5);\n"
1870 " vertices[2] = vec2( 0.5, 0.5);\n"
1871 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1872 "}\n";
1873
1874 static const char *fragShaderText =
1875 "#version 430\n"
1876 "layout (std140) uniform bufferVals {\n"
1877 " vec4 red;\n"
1878 " vec4 green;\n"
1879 " vec4 blue;\n"
1880 " vec4 white;\n"
1881 "} myBufferVals;\n"
1882 "void main() {\n"
1883 " gl_FragColor = myBufferVals.blue;\n"
1884 "}\n";
1885
1886 DrawTriangleFSUniformBlock(vertShaderText, fragShaderText);
1887}
1888
1889TEST_F(XglRenderTest, TriangleVSUniformBlock)
1890{
1891 // The expected result from this test is a blue triangle
1892
1893 static const char *vertShaderText =
1894 "#version 140\n"
1895 "out vec4 outColor;\n"
1896 "layout (std140) uniform bufferVals {\n"
1897 " vec4 red;\n"
1898 " vec4 green;\n"
1899 " vec4 blue;\n"
1900 " vec4 white;\n"
1901 "} myBufferVals;\n"
1902 "void main() {\n"
1903 " vec2 vertices[3];"
1904 " vertices[0] = vec2(-0.5, -0.5);\n"
1905 " vertices[1] = vec2( 0.5, -0.5);\n"
1906 " vertices[2] = vec2( 0.5, 0.5);\n"
1907 " outColor = myBufferVals.blue;\n"
1908 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1909 "}\n";
1910
1911 static const char *fragShaderText =
1912 "#version 430\n"
1913 "in vec4 inColor;\n"
1914 "void main() {\n"
1915 " gl_FragColor = inColor;\n"
1916 "}\n";
1917
1918 DrawTriangleVSUniformBlock(vertShaderText, fragShaderText);
1919}
1920
1921TEST_F(XglRenderTest, TriangleVSFSUniformBlock)
1922{
1923 // The expected result from this test is a green triangle
1924 // Note the buffer is shared between stages, idenitical layout
1925
1926 static const char *vertShaderText =
1927 "#version 140\n"
1928 "out vec4 outRed;\n"
1929 "out vec4 outGreen;\n"
1930 "out vec4 outBlue;\n"
1931 "out vec4 outWhite;\n"
1932 "layout (std140) uniform bufferVals {\n"
1933 " vec4 red;\n"
1934 " vec4 green;\n"
1935 " vec4 blue;\n"
1936 " vec4 white;\n"
1937 "} myBufferVals;\n"
1938 "void main() {\n"
1939 " vec2 vertices[3];"
1940 " vertices[0] = vec2(-0.5, -0.5);\n"
1941 " vertices[1] = vec2( 0.5, -0.5);\n"
1942 " vertices[2] = vec2( 0.5, 0.5);\n"
1943 " outRed = myBufferVals.red;\n"
1944 " outGreen = myBufferVals.green;\n"
1945 " outBlue = myBufferVals.blue;\n"
1946 " outWhite = myBufferVals.white;\n"
1947 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1948 "}\n";
1949
1950 static const char *fragShaderText =
1951 "#version 430\n"
1952 "in vec4 inRed;\n"
1953 "in vec4 inGreen;\n"
1954 "in vec4 inBlue;\n"
1955 "in vec4 inWhite;\n"
1956 "layout (std140) uniform bufferVals {\n"
1957 " vec4 red;\n"
1958 " vec4 green;\n"
1959 " vec4 blue;\n"
1960 " vec4 white;\n"
1961 "} myBufferVals;\n"
1962 "void main() {\n"
1963 " if (inRed == myBufferVals.red && \n"
1964 " inGreen == myBufferVals.green && \n"
1965 " inBlue == myBufferVals.blue && \n"
1966 " inWhite == myBufferVals.white) \n"
1967 " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
1968 " else\n"
1969 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
1970 "}\n";
1971
1972 DrawTriangleVSFSUniformBlock(vertShaderText, fragShaderText);
1973 }
1974
1975
Cody Northropc6953d02014-10-20 11:23:32 -06001976TEST_F(XglRenderTest, TexturedTriangle)
1977{
Cody Northrop5fa1d332014-10-20 11:51:32 -06001978 // The expected result from this test is a red and green checkered triangle
Cody Northropc6953d02014-10-20 11:23:32 -06001979 static const char *vertShaderText =
1980 "#version 130\n"
1981 "out vec2 samplePos;\n"
1982 "void main() {\n"
1983 " vec2 vertices[3];"
1984 " vertices[0] = vec2(-0.5, -0.5);\n"
1985 " vertices[1] = vec2( 0.5, -0.5);\n"
1986 " vertices[2] = vec2( 0.5, 0.5);\n"
1987 " vec2 positions[3];"
1988 " positions[0] = vec2( 0.0, 0.0);\n"
1989 " positions[1] = vec2( 1.0, 0.0);\n"
1990 " positions[2] = vec2( 1.0, 1.0);\n"
1991 " samplePos = positions[gl_VertexID % 3];\n"
1992 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1993 "}\n";
1994
1995 static const char *fragShaderText =
1996 "#version 130\n"
1997 "in vec2 samplePos;\n"
1998 "uniform sampler2D surface;\n"
1999 "void main() {\n"
2000 " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
2001 " gl_FragColor = texColor;\n"
2002 "}\n";
2003 DrawTexturedTriangle(vertShaderText, fragShaderText);
2004}
2005
Cody Northrop722ff402014-10-20 09:22:42 -06002006int main(int argc, char **argv) {
2007 int result;
2008
2009 ::testing::InitGoogleTest(&argc, argv);
2010 XglTestFramework::InitArgs(&argc, argv);
2011
2012 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
2013
2014 result = RUN_ALL_TESTS();
2015
2016 XglTestFramework::Finish();
2017 return result;
2018}