blob: fe02b8aebe8cf410411f6579edd22dd58866e817 [file] [log] [blame]
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -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
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060053// Basic rendering tests
54
55#include <stdlib.h>
56#include <stdio.h>
57#include <stdbool.h>
58#include <string.h>
Courtney Goeltzenleuchter76a643b2014-08-21 17:34:22 -060059#include <iostream>
60#include <fstream>
61using namespace std;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060062
63#include <xgl.h>
64#include "gtest-1.7.0/include/gtest/gtest.h"
65
66#include "xgldevice.h"
Courtney Goeltzenleuchter04814f82014-09-01 16:37:18 -060067#include "xglimage.h"
Chia-I Wu4115c892014-08-28 11:56:29 +080068#include "icd-bil.h"
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060069
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -060070#include "xglrenderframework.h"
Courtney Goeltzenleuchter2268d1e2014-09-01 13:57:15 -060071
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -060072#undef ASSERT_NO_FATAL_FAILURE
73#define ASSERT_NO_FATAL_FAILURE(x) x
74
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -060075//--------------------------------------------------------------------------------------
76// Mesh and VertexFormat Data
77//--------------------------------------------------------------------------------------
78struct Vertex
79{
80 XGL_FLOAT posX, posY, posZ, posW; // Position data
81 XGL_FLOAT r, g, b, a; // Color
82};
83
84#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
85
86static const Vertex g_vbData[] =
87{
88 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
89 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
90 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
91 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
92 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
93 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
94
95 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
96 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
97 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
98 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
99 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
100 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
101
102 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
103 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
104 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
105 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
106 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
107 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
108
109 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
110 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
111 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
112 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
113 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
114 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
115
116 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
117 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
118 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
119 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
120 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
121 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
122
123 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
124 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
125 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
126 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
127 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
128 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
129};
130
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600131class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600132{
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600133public:
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600134 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Cody Northrop350727b2014-10-06 15:42:00 -0600135 void InitTexture();
136 void InitSampler();
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600137 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600138 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600139 void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600140 void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600141
142 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600143 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600144 void DrawRotatedTriangleTest();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600145
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600146
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600147protected:
Cody Northrop350727b2014-10-06 15:42:00 -0600148 XGL_IMAGE m_texture;
149 XGL_IMAGE_VIEW m_textureView;
150 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
151 XGL_GPU_MEMORY m_textureMem;
152
153 XGL_SAMPLER m_sampler;
154
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600155// XGL_APPLICATION_INFO app_info;
156// XGL_PHYSICAL_GPU objs[MAX_GPUS];
157// XGL_UINT gpu_count;
158// XGL_GPU_MEMORY m_descriptor_set_mem;
159// XGL_GPU_MEMORY m_pipe_mem;
160// XglDevice *m_device;
161// XGL_CMD_BUFFER m_cmdBuffer;
162// XGL_UINT32 m_numVertices;
163// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
164// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
165// XGL_GPU_MEMORY m_vtxBufferMem;
166// XGL_GPU_MEMORY m_constantBufferMem;
167// XGL_UINT32 m_numMemRefs;
168// XGL_MEMORY_REF m_memRefs[5];
169// XGL_RASTER_STATE_OBJECT m_stateRaster;
170// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
171// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
172// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
173// XGL_MSAA_STATE_OBJECT m_stateMsaa;
174// XGL_DESCRIPTOR_SET m_rsrcDescSet;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600175
176 virtual void SetUp() {
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600177
178 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
179 this->app_info.pNext = NULL;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600180 this->app_info.pAppName = (const XGL_CHAR *) "render_tests";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600181 this->app_info.appVersion = 1;
182 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
183 this->app_info.engineVersion = 1;
184 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
185
Cody Northrop350727b2014-10-06 15:42:00 -0600186 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
187 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
188
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600189 InitFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600190 }
191
192 virtual void TearDown() {
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600193 // Clean up resources before we reset
194 ShutdownFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600195 }
196};
197
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600198// this function will create the vertex buffer and fill it with the mesh data
199void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
200 const void* vertices )
201{
202 XGL_RESULT err = XGL_SUCCESS;
203
204 assert( numVertices * vbStride > 0 );
205 m_numVertices = numVertices;
206
207 XGL_MEMORY_ALLOC_INFO alloc_info = {};
208 XGL_UINT8 *pData;
209
210 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
211 alloc_info.allocationSize = numVertices * vbStride;
212 alloc_info.alignment = 0;
213 alloc_info.heapCount = 1;
214 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
215
216 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
217 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
218
219 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
220 ASSERT_XGL_SUCCESS(err);
221
222 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
223 ASSERT_XGL_SUCCESS(err);
224
225 memcpy(pData, vertices, alloc_info.allocationSize);
226
227 err = xglUnmapMemory(m_vtxBufferMem);
228 ASSERT_XGL_SUCCESS(err);
229
230 // set up the memory view for the vertex buffer
231 this->m_vtxBufferView.stride = vbStride;
232 this->m_vtxBufferView.range = numVertices * vbStride;
233 this->m_vtxBufferView.offset = 0;
234 this->m_vtxBufferView.mem = m_vtxBufferMem;
235 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
236 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
237
238 // open the command buffer
239 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
240 ASSERT_XGL_SUCCESS(err);
241
242 XGL_MEMORY_STATE_TRANSITION transition = {};
243 transition.mem = m_vtxBufferMem;
244 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
245 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
246 transition.offset = 0;
247 transition.regionSize = numVertices * vbStride;
248
249 // write transition to the command buffer
250 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
251 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
252
253 // finish recording the command buffer
254 err = xglEndCommandBuffer( m_cmdBuffer );
255 ASSERT_XGL_SUCCESS(err);
256
257 // this command buffer only uses the vertex buffer memory
258 m_numMemRefs = 1;
259 m_memRefs[0].flags = 0;
260 m_memRefs[0].mem = m_vtxBufferMem;
261
262 // submit the command buffer to the universal queue
263 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
264 ASSERT_XGL_SUCCESS(err);
265}
266
Cody Northrop350727b2014-10-06 15:42:00 -0600267void XglRenderTest::InitTexture()
268{
Cody Northrop904742c2014-10-07 16:25:00 -0600269#define DEMO_TEXTURE_COUNT 1
270
271 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
272 const XGL_INT tex_width = 16;
273 const XGL_INT tex_height = 16;
274 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
275 { 0xffff0000, 0xff00ff00 },
276 };
Cody Northrop350727b2014-10-06 15:42:00 -0600277 XGL_RESULT err;
Cody Northrop904742c2014-10-07 16:25:00 -0600278 XGL_UINT i;
Cody Northrop350727b2014-10-06 15:42:00 -0600279
Cody Northrop904742c2014-10-07 16:25:00 -0600280 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
281 const XGL_SAMPLER_CREATE_INFO sampler = {
282 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
283 .pNext = NULL,
284 .magFilter = XGL_TEX_FILTER_NEAREST,
285 .minFilter = XGL_TEX_FILTER_NEAREST,
286 .mipMode = XGL_TEX_MIPMAP_BASE,
287 .addressU = XGL_TEX_ADDRESS_WRAP,
288 .addressV = XGL_TEX_ADDRESS_WRAP,
289 .addressW = XGL_TEX_ADDRESS_WRAP,
290 .mipLodBias = 0.0f,
291 .maxAnisotropy = 0,
292 .compareFunc = XGL_COMPARE_NEVER,
293 .minLod = 0.0f,
294 .maxLod = 0.0f,
295 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
296 };
297 const XGL_IMAGE_CREATE_INFO image = {
298 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
299 .pNext = NULL,
300 .imageType = XGL_IMAGE_2D,
301 .format = tex_format,
302 .extent = { tex_width, tex_height, 1 },
303 .mipLevels = 1,
304 .arraySize = 1,
305 .samples = 1,
306 .tiling = XGL_LINEAR_TILING,
307 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
308 .flags = 0,
309 };
310 XGL_MEMORY_ALLOC_INFO mem_alloc;
311 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
312 mem_alloc.pNext = NULL;
313 mem_alloc.allocationSize = 0;
314 mem_alloc.alignment = 0;
315 mem_alloc.flags = 0;
316 mem_alloc.heapCount = 0;
317 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
318 XGL_IMAGE_VIEW_CREATE_INFO view;
319 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
320 view.pNext = NULL;
321 view.image = XGL_NULL_HANDLE;
322 view.viewType = XGL_IMAGE_VIEW_2D;
323 view.format = image.format;
324 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
325 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
326 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
327 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
328 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
329 view.subresourceRange.baseMipLevel = 0;
330 view.subresourceRange.mipLevels = 1;
331 view.subresourceRange.baseArraySlice = 0;
332 view.subresourceRange.arraySize = 1;
333 view.minLod = 0.0f;
Cody Northrop350727b2014-10-06 15:42:00 -0600334
Cody Northrop904742c2014-10-07 16:25:00 -0600335 XGL_MEMORY_REQUIREMENTS mem_reqs;
336 XGL_SIZE mem_reqs_size;
Cody Northrop350727b2014-10-06 15:42:00 -0600337
Cody Northrop904742c2014-10-07 16:25:00 -0600338 /* create sampler */
339 err = xglCreateSampler(device(), &sampler, &m_sampler);
340 assert(!err);
341
342 /* create image */
343 err = xglCreateImage(device(), &image, &m_texture);
344 assert(!err);
345
346 err = xglGetObjectInfo(m_texture,
347 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
348 &mem_reqs_size, &mem_reqs);
349 assert(!err && mem_reqs_size == sizeof(mem_reqs));
350
351 mem_alloc.allocationSize = mem_reqs.size;
352 mem_alloc.alignment = mem_reqs.alignment;
353 mem_alloc.heapCount = mem_reqs.heapCount;
354 memcpy(mem_alloc.heaps, mem_reqs.heaps,
355 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
356
357 /* allocate memory */
358 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
359 assert(!err);
360
361 /* bind memory */
362 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
363 assert(!err);
364
365 /* create image view */
366 view.image = m_texture;
367 err = xglCreateImageView(device(), &view, &m_textureView);
368 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600369 }
370
Cody Northrop904742c2014-10-07 16:25:00 -0600371 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
372 const XGL_IMAGE_SUBRESOURCE subres = {
373 .aspect = XGL_IMAGE_ASPECT_COLOR,
374 .mipLevel = 0,
375 .arraySlice = 0,
376 };
377 XGL_SUBRESOURCE_LAYOUT layout;
378 XGL_SIZE layout_size;
379 XGL_VOID *data;
380 XGL_INT x, y;
Cody Northrop350727b2014-10-06 15:42:00 -0600381
Cody Northrop904742c2014-10-07 16:25:00 -0600382 err = xglGetImageSubresourceInfo(m_texture, &subres,
383 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
384 assert(!err && layout_size == sizeof(layout));
Cody Northrop350727b2014-10-06 15:42:00 -0600385
Cody Northrop904742c2014-10-07 16:25:00 -0600386 err = xglMapMemory(m_textureMem, 0, &data);
387 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600388
Cody Northrop904742c2014-10-07 16:25:00 -0600389 for (y = 0; y < tex_height; y++) {
390 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
391 for (x = 0; x < tex_width; x++)
392 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
Cody Northrop350727b2014-10-06 15:42:00 -0600393 }
Cody Northrop904742c2014-10-07 16:25:00 -0600394
395 err = xglUnmapMemory(m_textureMem);
396 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600397 }
398
Cody Northrop350727b2014-10-06 15:42:00 -0600399 m_textureViewInfo.view = m_textureView;
400}
401
402void XglRenderTest::InitSampler()
403{
404 XGL_RESULT err;
405
406 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
407 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
408 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
409 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
410 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
411 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
412 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
413 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
414 samplerCreateInfo.mipLodBias = 0.0;
415 samplerCreateInfo.maxAnisotropy = 0.0;
416 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
417 samplerCreateInfo.minLod = 0.0;
418 samplerCreateInfo.maxLod = 0.0;
419 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
420
421 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
422 ASSERT_XGL_SUCCESS(err);
423}
424
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600425void XglRenderTest::DrawRotatedTriangleTest()
426{
427 // TODO : This test will pass a matrix into VS to affect triangle orientation.
428}
429
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600430void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600431{
432 XGL_PIPELINE pipeline;
433 XGL_SHADER vs, ps;
434 XGL_RESULT err;
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600435
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600436 ASSERT_NO_FATAL_FAILURE(InitState());
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600437 ASSERT_NO_FATAL_FAILURE(InitViewport());
438
439 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
440 vertShaderText, &vs));
441
442 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
443 fragShaderText, &ps));
444
445 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600446
447 /*
448 * Shaders are now part of the pipeline, don't need these anymore
449 */
450 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
451 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
452
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600454
Cody Northrop342912c2014-10-01 14:03:25 -0600455 const int constantCount = 4;
456 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
457 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
458
459 // Create descriptor set for a uniform resource
460 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
461 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
462 descriptorInfo.slots = 1;
463
464 // create a descriptor set with a single slot
465 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
466 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
467
468 // bind memory to the descriptor set
469 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
470
471 // write the constant buffer view to the descriptor set
472 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
473 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
474 xglEndDescriptorSetUpdate( m_rsrcDescSet );
475
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600476 // Build command buffer
477 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
478 ASSERT_XGL_SUCCESS(err);
479
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600480 GenerateClearAndPrepareBufferCmds();
481 GenerateBindRenderTargetCmd();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600482 GenerateBindStateAndPipelineCmds(&pipeline);
483
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600484// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
485// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
486
487 // render the cube
488 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
489
490 // prepare the back buffer for present
491// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
492// transitionToPresent.image = m_image;
493// transitionToPresent.oldState = m_image_state;
494// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
495// transitionToPresent.subresourceRange = srRange;
496// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
497// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
498
499 // finalize recording of the command buffer
500 err = xglEndCommandBuffer( m_cmdBuffer );
501 ASSERT_XGL_SUCCESS( err );
502
503 // this command buffer only uses the vertex buffer memory
504 m_numMemRefs = 0;
505// m_memRefs[0].flags = 0;
506// m_memRefs[0].mem = m_vtxBufferMemory;
507
508 // submit the command buffer to the universal queue
509 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
510 ASSERT_XGL_SUCCESS( err );
511
Chia-I Wuf34ac502014-08-27 14:58:05 +0800512 err = xglQueueWaitIdle( m_device->m_queue );
513 ASSERT_XGL_SUCCESS( err );
514
Courtney Goeltzenleuchter68cfe612014-08-26 18:16:41 -0600515 // Wait for work to finish before cleaning up.
516 xglDeviceWaitIdle(m_device->device());
517
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600518 RecordImage(m_renderTarget);
Chia-I Wuf070ec12014-08-30 23:58:36 +0800519
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600520}
521
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600522void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600523{
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600524 XGL_PIPELINE pipeline;
525 XGL_SHADER vs, ps;
526 XGL_RESULT err;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600527
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600528 ASSERT_NO_FATAL_FAILURE(InitState());
529 ASSERT_NO_FATAL_FAILURE(InitViewport());
530
531 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
532 vertShaderText, &vs));
533
534 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
535 fragShaderText, &ps));
536
537 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
538
539 /*
540 * Shaders are now part of the pipeline, don't need these anymore
541 */
542 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
543 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
544
545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
546
547 const int constantCount = 8;
548 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
549 0.0, 0.0, 1.0, 1.0 };
550
551 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
552
553 // Create descriptor set for a uniform resource
554 const int slotCount = 1;
555 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
556 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
557 descriptorInfo.slots = slotCount;
558
559 // create a descriptor set with a single slot
560 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
561 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
562
563 // bind memory to the descriptor set
564 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
565
566 // write the constant buffer view to the descriptor set
567 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
568 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
569 xglEndDescriptorSetUpdate( m_rsrcDescSet );
570
571 // Build command buffer
572 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
573 ASSERT_XGL_SUCCESS(err);
574
575 GenerateClearAndPrepareBufferCmds();
576 GenerateBindRenderTargetCmd();
577 GenerateBindStateAndPipelineCmds(&pipeline);
578
579// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
580// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
581
582 // render the cube
583 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
584
585 // prepare the back buffer for present
586// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
587// transitionToPresent.image = m_image;
588// transitionToPresent.oldState = m_image_state;
589// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
590// transitionToPresent.subresourceRange = srRange;
591// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
592// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
593
594 // finalize recording of the command buffer
595 err = xglEndCommandBuffer( m_cmdBuffer );
596 ASSERT_XGL_SUCCESS( err );
597
598 // this command buffer only uses the vertex buffer memory
599 m_numMemRefs = 0;
600// m_memRefs[0].flags = 0;
601// m_memRefs[0].mem = m_vtxBufferMemory;
602
603 // submit the command buffer to the universal queue
604 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
605 ASSERT_XGL_SUCCESS( err );
606
607 err = xglQueueWaitIdle( m_device->m_queue );
608 ASSERT_XGL_SUCCESS( err );
609
610 // Wait for work to finish before cleaning up.
611 xglDeviceWaitIdle(m_device->device());
612
613 RecordImage(m_renderTarget);
614
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600615}
616
Cody Northrop7a1f0462014-10-10 14:49:36 -0600617
618void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText)
619{
620 XGL_PIPELINE pipeline;
621 XGL_SHADER vs, ps;
622 XGL_RESULT err;
623
624 ASSERT_NO_FATAL_FAILURE(InitState());
625 ASSERT_NO_FATAL_FAILURE(InitViewport());
626
627 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
628 vertShaderText, &vs));
629
630 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
631 fragShaderText, &ps));
632
633 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
634
635 /*
636 * Shaders are now part of the pipeline, don't need these anymore
637 */
638 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
639 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
640
641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
642
643 const int constantCount = 16;
644 const float constants[constantCount] = { 1.0, 0.0, 0.0, 0.0,
645 0.0, 1.0, 0.0, 0.0,
646 0.0, 0.0, 1.0, 0.0,
647 0.0, 0.0, 0.0, 1.0};
648// const float constants[constantCount] = { 0.0, 0.0, 0.0, 1.0,
649// 0.0, 0.0, 1.0, 0.0,
650// 0.0, 1.0, 0.0, 0.0,
651// 1.0, 0.0, 0.0, 0.0 };
652
653
654 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
655
656 // Create descriptor set for a uniform resource
657 const int slotCount = 1;
658 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
659 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
660 descriptorInfo.slots = slotCount;
661
662 // create a descriptor set with a single slot
663 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
664 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
665
666 // bind memory to the descriptor set
667 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
668
669 // write the constant buffer view to the descriptor set
670 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
671 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
672 xglEndDescriptorSetUpdate( m_rsrcDescSet );
673
674 // Build command buffer
675 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
676 ASSERT_XGL_SUCCESS(err);
677
678 GenerateClearAndPrepareBufferCmds();
679 GenerateBindRenderTargetCmd();
680 GenerateBindStateAndPipelineCmds(&pipeline);
681
682// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
683// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
684
685 // render the cube
686 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
687
688 // prepare the back buffer for present
689// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
690// transitionToPresent.image = m_image;
691// transitionToPresent.oldState = m_image_state;
692// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
693// transitionToPresent.subresourceRange = srRange;
694// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
695// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
696
697 // finalize recording of the command buffer
698 err = xglEndCommandBuffer( m_cmdBuffer );
699 ASSERT_XGL_SUCCESS( err );
700
701 // this command buffer only uses the vertex buffer memory
702 m_numMemRefs = 0;
703// m_memRefs[0].flags = 0;
704// m_memRefs[0].mem = m_vtxBufferMemory;
705
706 // submit the command buffer to the universal queue
707 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
708 ASSERT_XGL_SUCCESS( err );
709
710 err = xglQueueWaitIdle( m_device->m_queue );
711 ASSERT_XGL_SUCCESS( err );
712
713 // Wait for work to finish before cleaning up.
714 xglDeviceWaitIdle(m_device->device());
715
716 RecordImage(m_renderTarget);
717
718}
719
Cody Northrop4e6b4762014-10-09 21:25:22 -0600720void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
721{
722 XGL_RESULT err;
723 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
724 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
725 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
726
727
728 // Create descriptor set for our one resource
729 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
730 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
731 descriptorInfo.slots = 1; // Vertex buffer only
732
733 // create a descriptor set with a single slot
734 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
735 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
736
737 // bind memory to the descriptor set
738 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
739
740 // write the vertex buffer view to the descriptor set
741 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
742 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
743 xglEndDescriptorSetUpdate( m_rsrcDescSet );
744
745 const int slots = 1;
746 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
747 slotInfo[0].shaderEntityIndex = 0;
748 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
749
750 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
751 vs_stage.pNext = XGL_NULL_HANDLE;
752 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
753 vs_stage.shader.shader = vs;
754 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
755 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
756 vs_stage.shader.linkConstBufferCount = 0;
757 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
758 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
759 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
760
761 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
762 ps_stage.pNext = &vs_stage;
763 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
764 ps_stage.shader.shader = ps;
765 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
766 ps_stage.shader.linkConstBufferCount = 0;
767 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
768 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
769 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
770
771 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
772 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
773 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
774 };
775
776 // this is the current description of g_vbData
777 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
778 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
779 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
780 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
781 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
782 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
783 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
784 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
785 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
786
787 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
788 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
789 &ps_stage, // pNext;
790 1, // bindingCount
791 &vi_binding, // pVertexBindingDescriptions;
792 2, // attributeCount; // number of attributes
793 vi_attribs // pVertexAttributeDescriptions;
794 };
795
796 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
797 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
798 &vi_state, // pNext
799 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
800 XGL_FALSE, // disableVertexReuse
801 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
802 XGL_FALSE, // primitiveRestartEnable
803 0 // primitiveRestartIndex
804 };
805
806 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
807 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
808 &ia_state,
809 XGL_FALSE, // depthClipEnable
810 XGL_FALSE, // rasterizerDiscardEnable
811 1.0 // pointSize
812 };
813
814 XGL_PIPELINE_CB_STATE cb_state = {
815 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
816 &rs_state,
817 XGL_FALSE, // alphaToCoverageEnable
818 XGL_FALSE, // dualSourceBlendEnable
819 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
820 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
821 {
822 XGL_FALSE, // blendEnable
823 m_render_target_fmt, // XGL_FORMAT
824 0xF // channelWriteMask
825 }
826 }
827 };
828
829 // TODO: Should take depth buffer format from queried formats
830 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
831 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
832 &cb_state,
833 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
834 };
835
836 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
837 info.pNext = &db_state;
838 info.flags = 0;
839 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
840 ASSERT_XGL_SUCCESS(err);
841
842 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
843 ASSERT_XGL_SUCCESS(err);
844}
845
Cody Northrop7a1f0462014-10-10 14:49:36 -0600846void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
847{
848 XGL_RESULT err;
849 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
850 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
851 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
852
853
854 const int vsSlots = 1; // Uniform buffer only
855
856 // Create descriptor set for our one resource
857 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
858 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
859 descriptorInfo.slots = vsSlots;
860
861 // create a descriptor set with a single slot
862 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
863 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
864
865 // bind memory to the descriptor set
866 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
867
868
869 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
870 slotInfo[0].shaderEntityIndex = 0;
871 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
872
873 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
874 vs_stage.pNext = XGL_NULL_HANDLE;
875 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
876 vs_stage.shader.shader = vs;
877 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
878 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
879 vs_stage.shader.linkConstBufferCount = 0;
880 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
881 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
882 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
883
884 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
885 ps_stage.pNext = &vs_stage;
886 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
887 ps_stage.shader.shader = ps;
888 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
889 ps_stage.shader.linkConstBufferCount = 0;
890 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
891 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
892 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
893
894 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
895 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
896 &ps_stage, // pNext
897 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
898 XGL_FALSE, // disableVertexReuse
899 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
900 XGL_FALSE, // primitiveRestartEnable
901 0 // primitiveRestartIndex
902 };
903
904 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
905 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
906 &ia_state,
907 XGL_FALSE, // depthClipEnable
908 XGL_FALSE, // rasterizerDiscardEnable
909 1.0 // pointSize
910 };
911
912 XGL_PIPELINE_CB_STATE cb_state = {
913 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
914 &rs_state,
915 XGL_FALSE, // alphaToCoverageEnable
916 XGL_FALSE, // dualSourceBlendEnable
917 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
918 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
919 {
920 XGL_FALSE, // blendEnable
921 m_render_target_fmt, // XGL_FORMAT
922 0xF // channelWriteMask
923 }
924 }
925 };
926
927 // TODO: Should take depth buffer format from queried formats
928 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
929 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
930 &cb_state,
931 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
932 };
933
934 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
935 info.pNext = &db_state;
936 info.flags = 0;
937 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
938 ASSERT_XGL_SUCCESS(err);
939
940 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
941 ASSERT_XGL_SUCCESS(err);
942}
943
Cody Northrop4e6b4762014-10-09 21:25:22 -0600944void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
945{
946 XGL_PIPELINE pipeline;
947 XGL_SHADER vs, ps;
948 XGL_RESULT err;
949
950 ASSERT_NO_FATAL_FAILURE(InitState());
951 ASSERT_NO_FATAL_FAILURE(InitViewport());
952 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
953
954 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
955 vertShaderText, &vs));
956
957 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
958 fragShaderText, &ps));
959
960 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
961
962 /*
963 * Shaders are now part of the pipeline, don't need these anymore
964 */
965 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
966 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
967
968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
969
970 // Build command buffer
971 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
972 ASSERT_XGL_SUCCESS(err);
973
974 GenerateClearAndPrepareBufferCmds();
975 GenerateBindRenderTargetCmd();
976 GenerateBindStateAndPipelineCmds(&pipeline);
977
978// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
979// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
980
981 // render the cube
Courtney Goeltzenleuchtere2a5a092014-10-10 09:52:27 -0600982 xglCmdDraw( m_cmdBuffer, 0, 6, 0, 1 );
Cody Northrop4e6b4762014-10-09 21:25:22 -0600983
984 // prepare the back buffer for present
985// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
986// transitionToPresent.image = m_image;
987// transitionToPresent.oldState = m_image_state;
988// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
989// transitionToPresent.subresourceRange = srRange;
990// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
991// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
992
993 // finalize recording of the command buffer
994 err = xglEndCommandBuffer( m_cmdBuffer );
995 ASSERT_XGL_SUCCESS( err );
996
997 // this command buffer only uses the vertex buffer memory
998 m_numMemRefs = 0;
999// m_memRefs[0].flags = 0;
1000// m_memRefs[0].mem = m_vtxBufferMemory;
1001
1002 // submit the command buffer to the universal queue
1003 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1004 ASSERT_XGL_SUCCESS( err );
1005
1006 err = xglQueueWaitIdle( m_device->m_queue );
1007 ASSERT_XGL_SUCCESS( err );
1008
1009 // Wait for work to finish before cleaning up.
1010 xglDeviceWaitIdle(m_device->device());
1011
1012 RecordImage(m_renderTarget);
1013
1014}
1015
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001016TEST_F(XglRenderTest, TestDrawTriangle1)
1017{
1018 static const char *vertShaderText =
1019 "#version 130\n"
1020 "vec2 vertices[3];\n"
1021 "void main() {\n"
1022 " vertices[0] = vec2(-1.0, -1.0);\n"
1023 " vertices[1] = vec2( 1.0, -1.0);\n"
1024 " vertices[2] = vec2( 0.0, 1.0);\n"
1025 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1026 "}\n";
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -06001027
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001028 static const char *fragShaderText =
1029 "#version 130\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001030 "void main() {\n"
Steve K10b32512014-10-10 08:54:29 -06001031 " gl_FragColor = vec4(0,1,0,1);\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001032 "}\n";
1033 DrawTriangleTest(vertShaderText, fragShaderText);
1034}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001035
Courtney Goeltzenleuchterd4ee38d2014-10-10 13:59:38 -06001036TEST_F(XglRenderTest, BIL_GreenTriangle)
1037{
1038 bool saved_use_bil = XglTestFramework::m_use_bil;
1039
1040 static const char *vertShaderText =
1041 "#version 130\n"
1042 "vec2 vertices[3];\n"
1043 "void main() {\n"
1044 " vertices[0] = vec2(-1.0, -1.0);\n"
1045 " vertices[1] = vec2( 1.0, -1.0);\n"
1046 " vertices[2] = vec2( 0.0, 1.0);\n"
1047 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1048 "}\n";
1049
1050 static const char *fragShaderText =
1051 "#version 130\n"
1052 "void main() {\n"
1053 " gl_FragColor = vec4(0,1,0,1);\n"
1054 "}\n";
1055 XglTestFramework::m_use_bil = true;
1056 DrawTriangleTest(vertShaderText, fragShaderText);
1057 XglTestFramework::m_use_bil = saved_use_bil;
1058}
1059
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001060TEST_F(XglRenderTest, TestDrawTriangle2)
1061{
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001062
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001063 static const char *vertShaderText =
1064 "#version 130\n"
1065 "out vec4 color;\n"
1066 "out vec4 scale;\n"
1067 "vec2 vertices[3];\n"
1068 "void main() {\n"
1069 "vec2 vertices[3];\n"
1070 " vertices[0] = vec2(-0.5, -0.5);\n"
1071 " vertices[1] = vec2( 0.5, -0.5);\n"
1072 " vertices[2] = vec2( 0.5, 0.5);\n"
1073 "vec4 colors[3];\n"
1074 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1075 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1076 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1077 " color = colors[gl_VertexID % 3];\n"
1078 " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
1079 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1080 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001081
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001082 static const char *fragShaderText =
1083 "#version 130\n"
1084 "in vec4 color;\n"
1085 "in vec4 scale;\n"
1086 "uniform vec4 foo;\n"
1087 "void main() {\n"
1088 " gl_FragColor = color * scale + foo;\n"
1089 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001090
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001091 DrawTriangleTest(vertShaderText, fragShaderText);
1092}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001093
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001094TEST_F(XglRenderTest, TestDrawTriangle3)
1095{
1096 static const char *vertShaderText =
1097 "#version 130\n"
1098 "void main() {\n"
1099 " vec2 vertices[3];"
1100 " vertices[0] = vec2(-0.5, -0.5);\n"
1101 " vertices[1] = vec2( 0.5, -0.5);\n"
1102 " vertices[2] = vec2( 0.5, 0.5);\n"
1103 " vec4 colors[3];\n"
1104 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1105 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1106 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1107 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1108 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001109
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001110 static const char *fragShaderText =
1111 "#version 130\n"
1112 "void main() {\n"
1113 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
1114 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001115
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001116 DrawTriangleTest(vertShaderText, fragShaderText);
1117}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001118
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001119TEST_F(XglRenderTest, TestDrawRotatedTriangle) {
1120 DrawRotatedTriangleTest();
1121}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001122
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001123TEST_F(XglRenderTest, TestDrawTriangleTwoFSUniforms)
1124{
1125 static const char *vertShaderText =
1126 "#version 130\n"
1127 "out vec4 color;\n"
1128 "out vec4 scale;\n"
1129 "out vec2 samplePos;\n"
1130 "void main() {\n"
1131 " vec2 vertices[3];"
1132 " vertices[0] = vec2(-0.5, -0.5);\n"
1133 " vertices[1] = vec2( 0.5, -0.5);\n"
1134 " vertices[2] = vec2( 0.5, 0.5);\n"
1135 " vec4 colors[3];\n"
1136 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1137 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1138 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1139 " color = colors[gl_VertexID % 3];\n"
1140 " vec2 positions[3];"
1141 " positions[0] = vec2( 0.0, 0.0);\n"
1142 " positions[1] = vec2( 1.0, 0.0);\n"
1143 " positions[2] = vec2( 1.0, 1.0);\n"
1144 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
1145 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1146 "}\n";
Cody Northrop4e6b4762014-10-09 21:25:22 -06001147
1148
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001149 static const char *fragShaderText =
1150 "#version 430\n"
1151 "in vec4 color;\n"
1152 "in vec4 scale;\n"
1153 "uniform vec4 foo;\n"
1154 "uniform vec4 bar;\n"
1155 "void main() {\n"
1156 // by default, with no location or blocks
1157 // the compiler will read them from buffer
1158 // in reverse order of first use in shader
1159 // The buffer contains red, followed by blue,
1160 // so foo should be blue, bar should be red
1161 " gl_FragColor = color * scale * foo * bar + foo;\n"
1162 "}\n";
Cody Northrop4e6b4762014-10-09 21:25:22 -06001163
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001164 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
1165}
Cody Northrop4e6b4762014-10-09 21:25:22 -06001166
1167TEST_F(XglRenderTest, TestDrawTriangleWithVertexFetch)
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001168{
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -06001169 static const char *vertShaderText =
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -06001170 "#version 130\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001171 //XYZ1( -1, -1, -1 )
1172 "in vec4 pos;\n"
1173 //XYZ1( 0.f, 0.f, 0.f )
1174 "in vec4 inColor;\n"
1175 "out vec4 outColor;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001176 "void main() {\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001177 " outColor = inColor;\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001178 " gl_Position = pos;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001179 "}\n";
1180
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001181
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001182 static const char *fragShaderText =
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001183 "#version 430\n"
1184 "in vec4 color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001185 "void main() {\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001186 " gl_FragColor = color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001187 "}\n";
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001188
Cody Northrop4e6b4762014-10-09 21:25:22 -06001189 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
Tobin Ehlis34e0e442014-10-07 14:41:29 -06001190}
1191
Cody Northrop7a1f0462014-10-10 14:49:36 -06001192TEST_F(XglRenderTest, TestDrawTriangleVSUniform)
1193{
1194 static const char *vertShaderText =
1195 "#version 130\n"
1196 "uniform mat4 mvp;\n"
1197 "out vec4 matrix0;\n"
1198 "out vec4 matrix1;\n"
1199 "out vec4 matrix2;\n"
1200 "out vec4 matrix3;\n"
1201 "void main() {\n"
1202 " vec2 vertices[3];"
1203 " vertices[0] = vec2(-0.5, -0.5);\n"
1204 " vertices[1] = vec2( 0.5, -0.5);\n"
1205 " vertices[2] = vec2( 0.5, 0.5);\n"
1206 " matrix0 = mvp[0];\n"
1207 " matrix1 = mvp[1];\n"
1208 " matrix2 = mvp[2];\n"
1209 " matrix3 = mvp[3];\n"
1210 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1211 "}\n";
1212
1213 static const char *fragShaderText =
1214 "#version 430\n"
1215 "in vec4 matrix0;\n"
1216 "in vec4 matrix1;\n"
1217 "in vec4 matrix2;\n"
1218 "in vec4 matrix3;\n"
1219 "void main() {\n"
1220 //" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
1221 " gl_FragColor = matrix0 + matrix1 + matrix2 + matrix3;\n"
1222 "}\n";
1223
1224 DrawTriangleVSUniform(vertShaderText, fragShaderText);
1225}
1226
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001227int main(int argc, char **argv) {
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001228 int result;
1229
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001230 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001231 XglTestFramework::InitArgs(&argc, argv);
1232
Courtney Goeltzenleuchterf12c7762014-10-08 08:46:51 -06001233 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
1234
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001235 result = RUN_ALL_TESTS();
1236
1237 XglTestFramework::Finish();
1238 return result;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001239}