blob: 26d5ce9f597a0663875092a0a5d72d6a4b5a56c2 [file] [log] [blame]
Courtney Goeltzenleuchtercc5eb3a2014-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 Goeltzenleuchtercc5eb3a2014-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 Goeltzenleuchterda91b952014-08-21 17:34:22 -060059#include <iostream>
60#include <fstream>
61using namespace std;
Courtney Goeltzenleuchtercc5eb3a2014-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 Goeltzenleuchterefd4e0a2014-09-01 16:37:18 -060067#include "xglimage.h"
Chia-I Wufe7c1de2014-08-28 11:56:29 +080068#include "icd-bil.h"
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -060069
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060070#include "xglrenderframework.h"
Courtney Goeltzenleuchterf21d32d2014-09-01 13:57:15 -060071
Courtney Goeltzenleuchterf1b5b082014-10-09 11:05:19 -060072#undef ASSERT_NO_FATAL_FAILURE
73#define ASSERT_NO_FATAL_FAILURE(x) x
74
Courtney Goeltzenleuchter02461882014-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 Goeltzenleuchter53d8d892014-10-08 12:20:26 -0600131class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter54119a32014-09-04 16:26:02 -0600132{
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600133public:
Courtney Goeltzenleuchter02461882014-08-22 16:27:58 -0600134 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Cody Northrop7d2035d2014-10-06 15:42:00 -0600135 void InitTexture();
136 void InitSampler();
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600137 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
Cody Northropee6586d2014-10-09 19:55:56 -0600138 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
Cody Northrop7ad4aaf2014-10-09 21:25:22 -0600139 void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
Cody Northrop66594a72014-10-10 14:49:36 -0600140 void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText);
Cody Northrop7ad4aaf2014-10-09 21:25:22 -0600141
142 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop66594a72014-10-10 14:49:36 -0600143 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Tobin Ehlisd806c8e2014-10-07 14:41:29 -0600144 void DrawRotatedTriangleTest();
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600145
Cody Northropee6586d2014-10-09 19:55:56 -0600146
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600147protected:
Cody Northrop7d2035d2014-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 Goeltzenleuchter53d8d892014-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 Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600175
176 virtual void SetUp() {
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600177
178 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
179 this->app_info.pNext = NULL;
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600180 this->app_info.pAppName = (const XGL_CHAR *) "render_tests";
Courtney Goeltzenleuchtercc5eb3a2014-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 Northrop7d2035d2014-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 Goeltzenleuchter53d8d892014-10-08 12:20:26 -0600189 InitFramework();
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600190 }
191
192 virtual void TearDown() {
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -0600193 // Clean up resources before we reset
194 ShutdownFramework();
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -0600195 }
196};
197
Courtney Goeltzenleuchter02461882014-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 Northrop7d2035d2014-10-06 15:42:00 -0600267void XglRenderTest::InitTexture()
268{
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600277 XGL_RESULT err;
Cody Northrop2f1646d2014-10-07 16:25:00 -0600278 XGL_UINT i;
Cody Northrop7d2035d2014-10-06 15:42:00 -0600279
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600334
Cody Northrop2f1646d2014-10-07 16:25:00 -0600335 XGL_MEMORY_REQUIREMENTS mem_reqs;
336 XGL_SIZE mem_reqs_size;
Cody Northrop7d2035d2014-10-06 15:42:00 -0600337
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600369 }
370
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600381
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600385
Cody Northrop2f1646d2014-10-07 16:25:00 -0600386 err = xglMapMemory(m_textureMem, 0, &data);
387 assert(!err);
Cody Northrop7d2035d2014-10-06 15:42:00 -0600388
Cody Northrop2f1646d2014-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 Northrop7d2035d2014-10-06 15:42:00 -0600393 }
Cody Northrop2f1646d2014-10-07 16:25:00 -0600394
395 err = xglUnmapMemory(m_textureMem);
396 assert(!err);
Cody Northrop7d2035d2014-10-06 15:42:00 -0600397 }
398
Cody Northrop7d2035d2014-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 Ehlisd806c8e2014-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 Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600430void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
Tobin Ehlisd806c8e2014-10-07 14:41:29 -0600431{
432 XGL_PIPELINE pipeline;
433 XGL_SHADER vs, ps;
434 XGL_RESULT err;
Tobin Ehlisd806c8e2014-10-07 14:41:29 -0600435
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -0600436 ASSERT_NO_FATAL_FAILURE(InitState());
Courtney Goeltzenleuchter02d33c12014-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 Ehlisd806c8e2014-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 Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisd806c8e2014-10-07 14:41:29 -0600454
Cody Northrop275d40b2014-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 Ehlisd806c8e2014-10-07 14:41:29 -0600476 // Build command buffer
477 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
478 ASSERT_XGL_SUCCESS(err);
479
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600480 GenerateClearAndPrepareBufferCmds();
481 GenerateBindRenderTargetCmd();
Tobin Ehlisd806c8e2014-10-07 14:41:29 -0600482 GenerateBindStateAndPipelineCmds(&pipeline);
483
Courtney Goeltzenleuchter02461882014-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 Wu113e9d92014-08-27 14:58:05 +0800512 err = xglQueueWaitIdle( m_device->m_queue );
513 ASSERT_XGL_SUCCESS( err );
514
Courtney Goeltzenleuchter464746c2014-08-26 18:16:41 -0600515 // Wait for work to finish before cleaning up.
516 xglDeviceWaitIdle(m_device->device());
517
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600518 RecordImage(m_renderTarget);
Chia-I Wu57b3fa82014-08-30 23:58:36 +0800519
Courtney Goeltzenleuchter02461882014-08-22 16:27:58 -0600520}
521
Cody Northropee6586d2014-10-09 19:55:56 -0600522void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter538062a2014-10-09 15:40:19 -0600523{
Cody Northropee6586d2014-10-09 19:55:56 -0600524 XGL_PIPELINE pipeline;
525 XGL_SHADER vs, ps;
526 XGL_RESULT err;
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600527
Cody Northropee6586d2014-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 Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600615}
616
Cody Northrop66594a72014-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;
Cody Northropbb38ad32014-10-10 15:45:00 -0600644 const float constants[constantCount] = { 0.0, -1.0, 0.0, 0.0,
645 1.0, 0.0, 0.0, 0.0,
Cody Northrop66594a72014-10-10 14:49:36 -0600646 0.0, 0.0, 1.0, 0.0,
Cody Northropbb38ad32014-10-10 15:45:00 -0600647 0.0, 0.0, 0.0, 1.0 };
Cody Northrop66594a72014-10-10 14:49:36 -0600648
649 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
650
651 // Create descriptor set for a uniform resource
652 const int slotCount = 1;
653 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
654 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
655 descriptorInfo.slots = slotCount;
656
657 // create a descriptor set with a single slot
658 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
659 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
660
661 // bind memory to the descriptor set
662 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
663
664 // write the constant buffer view to the descriptor set
665 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
666 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
667 xglEndDescriptorSetUpdate( m_rsrcDescSet );
668
669 // Build command buffer
670 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
671 ASSERT_XGL_SUCCESS(err);
672
673 GenerateClearAndPrepareBufferCmds();
674 GenerateBindRenderTargetCmd();
675 GenerateBindStateAndPipelineCmds(&pipeline);
676
677// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
678// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
679
680 // render the cube
681 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
682
683 // prepare the back buffer for present
684// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
685// transitionToPresent.image = m_image;
686// transitionToPresent.oldState = m_image_state;
687// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
688// transitionToPresent.subresourceRange = srRange;
689// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
690// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
691
692 // finalize recording of the command buffer
693 err = xglEndCommandBuffer( m_cmdBuffer );
694 ASSERT_XGL_SUCCESS( err );
695
696 // this command buffer only uses the vertex buffer memory
697 m_numMemRefs = 0;
698// m_memRefs[0].flags = 0;
699// m_memRefs[0].mem = m_vtxBufferMemory;
700
701 // submit the command buffer to the universal queue
702 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
703 ASSERT_XGL_SUCCESS( err );
704
705 err = xglQueueWaitIdle( m_device->m_queue );
706 ASSERT_XGL_SUCCESS( err );
707
708 // Wait for work to finish before cleaning up.
709 xglDeviceWaitIdle(m_device->device());
710
711 RecordImage(m_renderTarget);
712
713}
714
Cody Northrop7ad4aaf2014-10-09 21:25:22 -0600715void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
716{
717 XGL_RESULT err;
718 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
719 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
720 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
721
722
723 // Create descriptor set for our one resource
724 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
725 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
726 descriptorInfo.slots = 1; // Vertex buffer only
727
728 // create a descriptor set with a single slot
729 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
730 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
731
732 // bind memory to the descriptor set
733 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
734
735 // write the vertex buffer view to the descriptor set
736 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
737 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
738 xglEndDescriptorSetUpdate( m_rsrcDescSet );
739
740 const int slots = 1;
741 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
742 slotInfo[0].shaderEntityIndex = 0;
743 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
744
745 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
746 vs_stage.pNext = XGL_NULL_HANDLE;
747 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
748 vs_stage.shader.shader = vs;
749 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
750 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
751 vs_stage.shader.linkConstBufferCount = 0;
752 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
753 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
754 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
755
756 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
757 ps_stage.pNext = &vs_stage;
758 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
759 ps_stage.shader.shader = ps;
760 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
761 ps_stage.shader.linkConstBufferCount = 0;
762 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
763 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
764 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
765
766 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
767 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
768 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
769 };
770
771 // this is the current description of g_vbData
772 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
773 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
774 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
775 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
776 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
777 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
778 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
779 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
780 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
781
782 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
783 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
784 &ps_stage, // pNext;
785 1, // bindingCount
786 &vi_binding, // pVertexBindingDescriptions;
787 2, // attributeCount; // number of attributes
788 vi_attribs // pVertexAttributeDescriptions;
789 };
790
791 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
792 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
793 &vi_state, // pNext
794 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
795 XGL_FALSE, // disableVertexReuse
796 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
797 XGL_FALSE, // primitiveRestartEnable
798 0 // primitiveRestartIndex
799 };
800
801 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
802 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
803 &ia_state,
804 XGL_FALSE, // depthClipEnable
805 XGL_FALSE, // rasterizerDiscardEnable
806 1.0 // pointSize
807 };
808
809 XGL_PIPELINE_CB_STATE cb_state = {
810 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
811 &rs_state,
812 XGL_FALSE, // alphaToCoverageEnable
813 XGL_FALSE, // dualSourceBlendEnable
814 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
815 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
816 {
817 XGL_FALSE, // blendEnable
818 m_render_target_fmt, // XGL_FORMAT
819 0xF // channelWriteMask
820 }
821 }
822 };
823
824 // TODO: Should take depth buffer format from queried formats
825 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
826 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
827 &cb_state,
828 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
829 };
830
831 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
832 info.pNext = &db_state;
833 info.flags = 0;
834 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
835 ASSERT_XGL_SUCCESS(err);
836
837 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
838 ASSERT_XGL_SUCCESS(err);
839}
840
Cody Northrop66594a72014-10-10 14:49:36 -0600841void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
842{
843 XGL_RESULT err;
844 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
845 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
846 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
847
848
849 const int vsSlots = 1; // Uniform buffer only
850
851 // Create descriptor set for our one resource
852 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
853 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
854 descriptorInfo.slots = vsSlots;
855
856 // create a descriptor set with a single slot
857 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
858 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
859
860 // bind memory to the descriptor set
861 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
862
863
864 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
865 slotInfo[0].shaderEntityIndex = 0;
866 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
867
868 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
869 vs_stage.pNext = XGL_NULL_HANDLE;
870 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
871 vs_stage.shader.shader = vs;
872 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
873 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
874 vs_stage.shader.linkConstBufferCount = 0;
875 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
876 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
877 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
878
879 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
880 ps_stage.pNext = &vs_stage;
881 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
882 ps_stage.shader.shader = ps;
883 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
884 ps_stage.shader.linkConstBufferCount = 0;
885 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
886 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
887 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
888
889 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
890 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
891 &ps_stage, // pNext
892 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
893 XGL_FALSE, // disableVertexReuse
894 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
895 XGL_FALSE, // primitiveRestartEnable
896 0 // primitiveRestartIndex
897 };
898
899 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
900 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
901 &ia_state,
902 XGL_FALSE, // depthClipEnable
903 XGL_FALSE, // rasterizerDiscardEnable
904 1.0 // pointSize
905 };
906
907 XGL_PIPELINE_CB_STATE cb_state = {
908 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
909 &rs_state,
910 XGL_FALSE, // alphaToCoverageEnable
911 XGL_FALSE, // dualSourceBlendEnable
912 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
913 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
914 {
915 XGL_FALSE, // blendEnable
916 m_render_target_fmt, // XGL_FORMAT
917 0xF // channelWriteMask
918 }
919 }
920 };
921
922 // TODO: Should take depth buffer format from queried formats
923 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
924 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
925 &cb_state,
926 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
927 };
928
929 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
930 info.pNext = &db_state;
931 info.flags = 0;
932 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
933 ASSERT_XGL_SUCCESS(err);
934
935 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
936 ASSERT_XGL_SUCCESS(err);
937}
938
Cody Northrop7ad4aaf2014-10-09 21:25:22 -0600939void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
940{
941 XGL_PIPELINE pipeline;
942 XGL_SHADER vs, ps;
943 XGL_RESULT err;
944
945 ASSERT_NO_FATAL_FAILURE(InitState());
946 ASSERT_NO_FATAL_FAILURE(InitViewport());
947 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
948
949 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
950 vertShaderText, &vs));
951
952 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
953 fragShaderText, &ps));
954
955 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
956
957 /*
958 * Shaders are now part of the pipeline, don't need these anymore
959 */
960 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
961 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
962
963 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
964
965 // Build command buffer
966 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
967 ASSERT_XGL_SUCCESS(err);
968
969 GenerateClearAndPrepareBufferCmds();
970 GenerateBindRenderTargetCmd();
971 GenerateBindStateAndPipelineCmds(&pipeline);
972
973// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
974// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
975
976 // render the cube
Courtney Goeltzenleuchtercc4287a2014-10-10 09:52:27 -0600977 xglCmdDraw( m_cmdBuffer, 0, 6, 0, 1 );
Cody Northrop7ad4aaf2014-10-09 21:25:22 -0600978
979 // prepare the back buffer for present
980// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
981// transitionToPresent.image = m_image;
982// transitionToPresent.oldState = m_image_state;
983// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
984// transitionToPresent.subresourceRange = srRange;
985// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
986// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
987
988 // finalize recording of the command buffer
989 err = xglEndCommandBuffer( m_cmdBuffer );
990 ASSERT_XGL_SUCCESS( err );
991
992 // this command buffer only uses the vertex buffer memory
993 m_numMemRefs = 0;
994// m_memRefs[0].flags = 0;
995// m_memRefs[0].mem = m_vtxBufferMemory;
996
997 // submit the command buffer to the universal queue
998 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
999 ASSERT_XGL_SUCCESS( err );
1000
1001 err = xglQueueWaitIdle( m_device->m_queue );
1002 ASSERT_XGL_SUCCESS( err );
1003
1004 // Wait for work to finish before cleaning up.
1005 xglDeviceWaitIdle(m_device->device());
1006
1007 RecordImage(m_renderTarget);
1008
1009}
1010
Cody Northropd1a256b2014-10-09 21:26:47 -06001011TEST_F(XglRenderTest, TestDrawTriangle1)
1012{
1013 static const char *vertShaderText =
1014 "#version 130\n"
1015 "vec2 vertices[3];\n"
1016 "void main() {\n"
1017 " vertices[0] = vec2(-1.0, -1.0);\n"
1018 " vertices[1] = vec2( 1.0, -1.0);\n"
1019 " vertices[2] = vec2( 0.0, 1.0);\n"
1020 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1021 "}\n";
Courtney Goeltzenleuchter538062a2014-10-09 15:40:19 -06001022
Cody Northropd1a256b2014-10-09 21:26:47 -06001023 static const char *fragShaderText =
1024 "#version 130\n"
Cody Northropd1a256b2014-10-09 21:26:47 -06001025 "void main() {\n"
Steve Kc53f8632014-10-10 08:54:29 -06001026 " gl_FragColor = vec4(0,1,0,1);\n"
Cody Northropd1a256b2014-10-09 21:26:47 -06001027 "}\n";
1028 DrawTriangleTest(vertShaderText, fragShaderText);
1029}
Cody Northropee6586d2014-10-09 19:55:56 -06001030
Courtney Goeltzenleuchteraafe0222014-10-10 13:59:38 -06001031TEST_F(XglRenderTest, BIL_GreenTriangle)
1032{
1033 bool saved_use_bil = XglTestFramework::m_use_bil;
1034
1035 static const char *vertShaderText =
1036 "#version 130\n"
1037 "vec2 vertices[3];\n"
1038 "void main() {\n"
1039 " vertices[0] = vec2(-1.0, -1.0);\n"
1040 " vertices[1] = vec2( 1.0, -1.0);\n"
1041 " vertices[2] = vec2( 0.0, 1.0);\n"
1042 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1043 "}\n";
1044
1045 static const char *fragShaderText =
1046 "#version 130\n"
1047 "void main() {\n"
1048 " gl_FragColor = vec4(0,1,0,1);\n"
1049 "}\n";
1050 XglTestFramework::m_use_bil = true;
1051 DrawTriangleTest(vertShaderText, fragShaderText);
1052 XglTestFramework::m_use_bil = saved_use_bil;
1053}
1054
Cody Northropd1a256b2014-10-09 21:26:47 -06001055TEST_F(XglRenderTest, TestDrawTriangle2)
1056{
Cody Northropee6586d2014-10-09 19:55:56 -06001057
Cody Northropd1a256b2014-10-09 21:26:47 -06001058 static const char *vertShaderText =
1059 "#version 130\n"
1060 "out vec4 color;\n"
1061 "out vec4 scale;\n"
1062 "vec2 vertices[3];\n"
1063 "void main() {\n"
1064 "vec2 vertices[3];\n"
1065 " vertices[0] = vec2(-0.5, -0.5);\n"
1066 " vertices[1] = vec2( 0.5, -0.5);\n"
1067 " vertices[2] = vec2( 0.5, 0.5);\n"
1068 "vec4 colors[3];\n"
1069 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1070 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1071 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1072 " color = colors[gl_VertexID % 3];\n"
1073 " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
1074 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1075 "}\n";
Cody Northropee6586d2014-10-09 19:55:56 -06001076
Cody Northropd1a256b2014-10-09 21:26:47 -06001077 static const char *fragShaderText =
1078 "#version 130\n"
1079 "in vec4 color;\n"
1080 "in vec4 scale;\n"
1081 "uniform vec4 foo;\n"
1082 "void main() {\n"
1083 " gl_FragColor = color * scale + foo;\n"
1084 "}\n";
Cody Northropee6586d2014-10-09 19:55:56 -06001085
Cody Northropd1a256b2014-10-09 21:26:47 -06001086 DrawTriangleTest(vertShaderText, fragShaderText);
1087}
Cody Northropee6586d2014-10-09 19:55:56 -06001088
Cody Northropd1a256b2014-10-09 21:26:47 -06001089TEST_F(XglRenderTest, TestDrawTriangle3)
1090{
1091 static const char *vertShaderText =
1092 "#version 130\n"
1093 "void main() {\n"
1094 " vec2 vertices[3];"
1095 " vertices[0] = vec2(-0.5, -0.5);\n"
1096 " vertices[1] = vec2( 0.5, -0.5);\n"
1097 " vertices[2] = vec2( 0.5, 0.5);\n"
1098 " vec4 colors[3];\n"
1099 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1100 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1101 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1102 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1103 "}\n";
Cody Northropee6586d2014-10-09 19:55:56 -06001104
Cody Northropd1a256b2014-10-09 21:26:47 -06001105 static const char *fragShaderText =
1106 "#version 130\n"
1107 "void main() {\n"
1108 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
1109 "}\n";
Cody Northropee6586d2014-10-09 19:55:56 -06001110
Cody Northropd1a256b2014-10-09 21:26:47 -06001111 DrawTriangleTest(vertShaderText, fragShaderText);
1112}
Cody Northropee6586d2014-10-09 19:55:56 -06001113
Cody Northropd1a256b2014-10-09 21:26:47 -06001114TEST_F(XglRenderTest, TestDrawRotatedTriangle) {
1115 DrawRotatedTriangleTest();
1116}
Cody Northropee6586d2014-10-09 19:55:56 -06001117
Cody Northropd1a256b2014-10-09 21:26:47 -06001118TEST_F(XglRenderTest, TestDrawTriangleTwoFSUniforms)
1119{
1120 static const char *vertShaderText =
1121 "#version 130\n"
1122 "out vec4 color;\n"
1123 "out vec4 scale;\n"
1124 "out vec2 samplePos;\n"
1125 "void main() {\n"
1126 " vec2 vertices[3];"
1127 " vertices[0] = vec2(-0.5, -0.5);\n"
1128 " vertices[1] = vec2( 0.5, -0.5);\n"
1129 " vertices[2] = vec2( 0.5, 0.5);\n"
1130 " vec4 colors[3];\n"
1131 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1132 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1133 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1134 " color = colors[gl_VertexID % 3];\n"
1135 " vec2 positions[3];"
1136 " positions[0] = vec2( 0.0, 0.0);\n"
1137 " positions[1] = vec2( 1.0, 0.0);\n"
1138 " positions[2] = vec2( 1.0, 1.0);\n"
1139 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
1140 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1141 "}\n";
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001142
1143
Cody Northropd1a256b2014-10-09 21:26:47 -06001144 static const char *fragShaderText =
1145 "#version 430\n"
1146 "in vec4 color;\n"
1147 "in vec4 scale;\n"
1148 "uniform vec4 foo;\n"
1149 "uniform vec4 bar;\n"
1150 "void main() {\n"
1151 // by default, with no location or blocks
1152 // the compiler will read them from buffer
1153 // in reverse order of first use in shader
1154 // The buffer contains red, followed by blue,
1155 // so foo should be blue, bar should be red
1156 " gl_FragColor = color * scale * foo * bar + foo;\n"
1157 "}\n";
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001158
Cody Northropd1a256b2014-10-09 21:26:47 -06001159 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
1160}
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001161
1162TEST_F(XglRenderTest, TestDrawTriangleWithVertexFetch)
Cody Northropee6586d2014-10-09 19:55:56 -06001163{
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -06001164 static const char *vertShaderText =
Courtney Goeltzenleuchterf1b5b082014-10-09 11:05:19 -06001165 "#version 130\n"
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001166 //XYZ1( -1, -1, -1 )
1167 "in vec4 pos;\n"
1168 //XYZ1( 0.f, 0.f, 0.f )
1169 "in vec4 inColor;\n"
1170 "out vec4 outColor;\n"
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001171 "void main() {\n"
Cody Northrop66594a72014-10-10 14:49:36 -06001172 " outColor = inColor;\n"
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001173 " gl_Position = pos;\n"
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001174 "}\n";
1175
Cody Northropee6586d2014-10-09 19:55:56 -06001176
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001177 static const char *fragShaderText =
Cody Northropee6586d2014-10-09 19:55:56 -06001178 "#version 430\n"
1179 "in vec4 color;\n"
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001180 "void main() {\n"
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001181 " gl_FragColor = color;\n"
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001182 "}\n";
Courtney Goeltzenleuchterce25e252014-10-09 15:37:21 -06001183
Cody Northrop7ad4aaf2014-10-09 21:25:22 -06001184 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
Tobin Ehlisd806c8e2014-10-07 14:41:29 -06001185}
1186
Cody Northrop66594a72014-10-10 14:49:36 -06001187TEST_F(XglRenderTest, TestDrawTriangleVSUniform)
1188{
1189 static const char *vertShaderText =
1190 "#version 130\n"
1191 "uniform mat4 mvp;\n"
Cody Northrop66594a72014-10-10 14:49:36 -06001192 "void main() {\n"
1193 " vec2 vertices[3];"
1194 " vertices[0] = vec2(-0.5, -0.5);\n"
1195 " vertices[1] = vec2( 0.5, -0.5);\n"
1196 " vertices[2] = vec2( 0.5, 0.5);\n"
Cody Northropbb38ad32014-10-10 15:45:00 -06001197 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0) * mvp;\n"
Cody Northrop66594a72014-10-10 14:49:36 -06001198 "}\n";
1199
1200 static const char *fragShaderText =
1201 "#version 430\n"
Cody Northrop66594a72014-10-10 14:49:36 -06001202 "void main() {\n"
Cody Northropbb38ad32014-10-10 15:45:00 -06001203 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
Cody Northrop66594a72014-10-10 14:49:36 -06001204 "}\n";
1205
1206 DrawTriangleVSUniform(vertShaderText, fragShaderText);
1207}
1208
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -06001209int main(int argc, char **argv) {
Courtney Goeltzenleuchter54119a32014-09-04 16:26:02 -06001210 int result;
1211
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -06001212 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter54119a32014-09-04 16:26:02 -06001213 XglTestFramework::InitArgs(&argc, argv);
1214
Courtney Goeltzenleuchtera0f74c52014-10-08 08:46:51 -06001215 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
1216
Courtney Goeltzenleuchter54119a32014-09-04 16:26:02 -06001217 result = RUN_ALL_TESTS();
1218
1219 XglTestFramework::Finish();
1220 return result;
Courtney Goeltzenleuchtercc5eb3a2014-08-19 18:35:50 -06001221}