blob: 5cc2385e0cf8c2e03984dbb7e43950b5a39d4b8a [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>
Courtney Goeltzenleuchterff87c822014-10-03 18:05:10 -060064#include <xglIntelExt.h>
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060065#include "gtest-1.7.0/include/gtest/gtest.h"
66
67#include "xgldevice.h"
Courtney Goeltzenleuchter04814f82014-09-01 16:37:18 -060068#include "xglimage.h"
Chia-I Wu4115c892014-08-28 11:56:29 +080069#include "icd-bil.h"
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060070
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -060071#include "xglrenderframework.h"
Courtney Goeltzenleuchter2268d1e2014-09-01 13:57:15 -060072
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -060073#undef ASSERT_NO_FATAL_FAILURE
74#define ASSERT_NO_FATAL_FAILURE(x) x
75
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -060076//--------------------------------------------------------------------------------------
77// Mesh and VertexFormat Data
78//--------------------------------------------------------------------------------------
79struct Vertex
80{
81 XGL_FLOAT posX, posY, posZ, posW; // Position data
82 XGL_FLOAT r, g, b, a; // Color
83};
84
85#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
86
87static const Vertex g_vbData[] =
88{
89 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
90 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
91 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
92 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
93 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
94 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
95
96 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
97 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
98 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
99 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
100 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
101 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
102
103 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
104 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
105 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
106 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
107 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
108 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
109
110 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
111 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
112 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
113 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
114 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
115 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
116
117 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
118 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
119 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
120 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
121 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
122 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
123
124 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
125 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
126 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
127 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
128 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
129 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
130};
131
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600132class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600133{
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600134public:
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600135 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Cody Northrop350727b2014-10-06 15:42:00 -0600136 void InitTexture();
137 void InitSampler();
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600138 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600139 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600140 void DrawRotatedTriangleTest();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600141
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600142
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600143protected:
Cody Northrop350727b2014-10-06 15:42:00 -0600144 XGL_IMAGE m_texture;
145 XGL_IMAGE_VIEW m_textureView;
146 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
147 XGL_GPU_MEMORY m_textureMem;
148
149 XGL_SAMPLER m_sampler;
150
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600151// XGL_APPLICATION_INFO app_info;
152// XGL_PHYSICAL_GPU objs[MAX_GPUS];
153// XGL_UINT gpu_count;
154// XGL_GPU_MEMORY m_descriptor_set_mem;
155// XGL_GPU_MEMORY m_pipe_mem;
156// XglDevice *m_device;
157// XGL_CMD_BUFFER m_cmdBuffer;
158// XGL_UINT32 m_numVertices;
159// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
160// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
161// XGL_GPU_MEMORY m_vtxBufferMem;
162// XGL_GPU_MEMORY m_constantBufferMem;
163// XGL_UINT32 m_numMemRefs;
164// XGL_MEMORY_REF m_memRefs[5];
165// XGL_RASTER_STATE_OBJECT m_stateRaster;
166// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
167// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
168// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
169// XGL_MSAA_STATE_OBJECT m_stateMsaa;
170// XGL_DESCRIPTOR_SET m_rsrcDescSet;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600171
172 virtual void SetUp() {
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600173
174 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
175 this->app_info.pNext = NULL;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600176 this->app_info.pAppName = (const XGL_CHAR *) "render_tests";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600177 this->app_info.appVersion = 1;
178 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
179 this->app_info.engineVersion = 1;
180 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
181
Cody Northrop350727b2014-10-06 15:42:00 -0600182 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
183 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
184
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600185 InitFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600186 }
187
188 virtual void TearDown() {
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600189 // Clean up resources before we reset
190 ShutdownFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600191 }
192};
193
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600194// this function will create the vertex buffer and fill it with the mesh data
195void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
196 const void* vertices )
197{
198 XGL_RESULT err = XGL_SUCCESS;
199
200 assert( numVertices * vbStride > 0 );
201 m_numVertices = numVertices;
202
203 XGL_MEMORY_ALLOC_INFO alloc_info = {};
204 XGL_UINT8 *pData;
205
206 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
207 alloc_info.allocationSize = numVertices * vbStride;
208 alloc_info.alignment = 0;
209 alloc_info.heapCount = 1;
210 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
211
212 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
213 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
214
215 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
216 ASSERT_XGL_SUCCESS(err);
217
218 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
219 ASSERT_XGL_SUCCESS(err);
220
221 memcpy(pData, vertices, alloc_info.allocationSize);
222
223 err = xglUnmapMemory(m_vtxBufferMem);
224 ASSERT_XGL_SUCCESS(err);
225
226 // set up the memory view for the vertex buffer
227 this->m_vtxBufferView.stride = vbStride;
228 this->m_vtxBufferView.range = numVertices * vbStride;
229 this->m_vtxBufferView.offset = 0;
230 this->m_vtxBufferView.mem = m_vtxBufferMem;
231 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
232 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
233
234 // open the command buffer
235 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
236 ASSERT_XGL_SUCCESS(err);
237
238 XGL_MEMORY_STATE_TRANSITION transition = {};
239 transition.mem = m_vtxBufferMem;
240 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
241 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
242 transition.offset = 0;
243 transition.regionSize = numVertices * vbStride;
244
245 // write transition to the command buffer
246 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
247 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
248
249 // finish recording the command buffer
250 err = xglEndCommandBuffer( m_cmdBuffer );
251 ASSERT_XGL_SUCCESS(err);
252
253 // this command buffer only uses the vertex buffer memory
254 m_numMemRefs = 1;
255 m_memRefs[0].flags = 0;
256 m_memRefs[0].mem = m_vtxBufferMem;
257
258 // submit the command buffer to the universal queue
259 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
260 ASSERT_XGL_SUCCESS(err);
261}
262
Cody Northrop350727b2014-10-06 15:42:00 -0600263void XglRenderTest::InitTexture()
264{
Cody Northrop904742c2014-10-07 16:25:00 -0600265#define DEMO_TEXTURE_COUNT 1
266
267 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
268 const XGL_INT tex_width = 16;
269 const XGL_INT tex_height = 16;
270 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
271 { 0xffff0000, 0xff00ff00 },
272 };
Cody Northrop350727b2014-10-06 15:42:00 -0600273 XGL_RESULT err;
Cody Northrop904742c2014-10-07 16:25:00 -0600274 XGL_UINT i;
Cody Northrop350727b2014-10-06 15:42:00 -0600275
Cody Northrop904742c2014-10-07 16:25:00 -0600276 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
277 const XGL_SAMPLER_CREATE_INFO sampler = {
278 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
279 .pNext = NULL,
280 .magFilter = XGL_TEX_FILTER_NEAREST,
281 .minFilter = XGL_TEX_FILTER_NEAREST,
282 .mipMode = XGL_TEX_MIPMAP_BASE,
283 .addressU = XGL_TEX_ADDRESS_WRAP,
284 .addressV = XGL_TEX_ADDRESS_WRAP,
285 .addressW = XGL_TEX_ADDRESS_WRAP,
286 .mipLodBias = 0.0f,
287 .maxAnisotropy = 0,
288 .compareFunc = XGL_COMPARE_NEVER,
289 .minLod = 0.0f,
290 .maxLod = 0.0f,
291 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
292 };
293 const XGL_IMAGE_CREATE_INFO image = {
294 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
295 .pNext = NULL,
296 .imageType = XGL_IMAGE_2D,
297 .format = tex_format,
298 .extent = { tex_width, tex_height, 1 },
299 .mipLevels = 1,
300 .arraySize = 1,
301 .samples = 1,
302 .tiling = XGL_LINEAR_TILING,
303 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
304 .flags = 0,
305 };
306 XGL_MEMORY_ALLOC_INFO mem_alloc;
307 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
308 mem_alloc.pNext = NULL;
309 mem_alloc.allocationSize = 0;
310 mem_alloc.alignment = 0;
311 mem_alloc.flags = 0;
312 mem_alloc.heapCount = 0;
313 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
314 XGL_IMAGE_VIEW_CREATE_INFO view;
315 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
316 view.pNext = NULL;
317 view.image = XGL_NULL_HANDLE;
318 view.viewType = XGL_IMAGE_VIEW_2D;
319 view.format = image.format;
320 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
321 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
322 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
323 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
324 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
325 view.subresourceRange.baseMipLevel = 0;
326 view.subresourceRange.mipLevels = 1;
327 view.subresourceRange.baseArraySlice = 0;
328 view.subresourceRange.arraySize = 1;
329 view.minLod = 0.0f;
Cody Northrop350727b2014-10-06 15:42:00 -0600330
Cody Northrop904742c2014-10-07 16:25:00 -0600331 XGL_MEMORY_REQUIREMENTS mem_reqs;
332 XGL_SIZE mem_reqs_size;
Cody Northrop350727b2014-10-06 15:42:00 -0600333
Cody Northrop904742c2014-10-07 16:25:00 -0600334 /* create sampler */
335 err = xglCreateSampler(device(), &sampler, &m_sampler);
336 assert(!err);
337
338 /* create image */
339 err = xglCreateImage(device(), &image, &m_texture);
340 assert(!err);
341
342 err = xglGetObjectInfo(m_texture,
343 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
344 &mem_reqs_size, &mem_reqs);
345 assert(!err && mem_reqs_size == sizeof(mem_reqs));
346
347 mem_alloc.allocationSize = mem_reqs.size;
348 mem_alloc.alignment = mem_reqs.alignment;
349 mem_alloc.heapCount = mem_reqs.heapCount;
350 memcpy(mem_alloc.heaps, mem_reqs.heaps,
351 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
352
353 /* allocate memory */
354 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
355 assert(!err);
356
357 /* bind memory */
358 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
359 assert(!err);
360
361 /* create image view */
362 view.image = m_texture;
363 err = xglCreateImageView(device(), &view, &m_textureView);
364 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600365 }
366
Cody Northrop904742c2014-10-07 16:25:00 -0600367 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
368 const XGL_IMAGE_SUBRESOURCE subres = {
369 .aspect = XGL_IMAGE_ASPECT_COLOR,
370 .mipLevel = 0,
371 .arraySlice = 0,
372 };
373 XGL_SUBRESOURCE_LAYOUT layout;
374 XGL_SIZE layout_size;
375 XGL_VOID *data;
376 XGL_INT x, y;
Cody Northrop350727b2014-10-06 15:42:00 -0600377
Cody Northrop904742c2014-10-07 16:25:00 -0600378 err = xglGetImageSubresourceInfo(m_texture, &subres,
379 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
380 assert(!err && layout_size == sizeof(layout));
Cody Northrop350727b2014-10-06 15:42:00 -0600381
Cody Northrop904742c2014-10-07 16:25:00 -0600382 err = xglMapMemory(m_textureMem, 0, &data);
383 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600384
Cody Northrop904742c2014-10-07 16:25:00 -0600385 for (y = 0; y < tex_height; y++) {
386 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
387 for (x = 0; x < tex_width; x++)
388 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
Cody Northrop350727b2014-10-06 15:42:00 -0600389 }
Cody Northrop904742c2014-10-07 16:25:00 -0600390
391 err = xglUnmapMemory(m_textureMem);
392 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600393 }
394
Cody Northrop350727b2014-10-06 15:42:00 -0600395 m_textureViewInfo.view = m_textureView;
396}
397
398void XglRenderTest::InitSampler()
399{
400 XGL_RESULT err;
401
402 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
403 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
404 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
405 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
406 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
407 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
408 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
409 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
410 samplerCreateInfo.mipLodBias = 0.0;
411 samplerCreateInfo.maxAnisotropy = 0.0;
412 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
413 samplerCreateInfo.minLod = 0.0;
414 samplerCreateInfo.maxLod = 0.0;
415 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
416
417 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
418 ASSERT_XGL_SUCCESS(err);
419}
420
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600421void XglRenderTest::DrawRotatedTriangleTest()
422{
423 // TODO : This test will pass a matrix into VS to affect triangle orientation.
424}
425
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600426void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600427{
428 XGL_PIPELINE pipeline;
429 XGL_SHADER vs, ps;
430 XGL_RESULT err;
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600431
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600432 ASSERT_NO_FATAL_FAILURE(InitState());
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600433 ASSERT_NO_FATAL_FAILURE(InitViewport());
434
435 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
436 vertShaderText, &vs));
437
438 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
439 fragShaderText, &ps));
440
441 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600442
443 /*
444 * Shaders are now part of the pipeline, don't need these anymore
445 */
446 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
447 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
448
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600450
Cody Northrop342912c2014-10-01 14:03:25 -0600451 const int constantCount = 4;
452 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
453 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
454
455 // Create descriptor set for a uniform resource
456 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
457 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
458 descriptorInfo.slots = 1;
459
460 // create a descriptor set with a single slot
461 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
462 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
463
464 // bind memory to the descriptor set
465 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
466
467 // write the constant buffer view to the descriptor set
468 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
469 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
470 xglEndDescriptorSetUpdate( m_rsrcDescSet );
471
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600472 // Build command buffer
473 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
474 ASSERT_XGL_SUCCESS(err);
475
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600476 GenerateClearAndPrepareBufferCmds();
477 GenerateBindRenderTargetCmd();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600478 GenerateBindStateAndPipelineCmds(&pipeline);
479
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600480// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
481// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
482
483 // render the cube
484 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
485
486 // prepare the back buffer for present
487// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
488// transitionToPresent.image = m_image;
489// transitionToPresent.oldState = m_image_state;
490// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
491// transitionToPresent.subresourceRange = srRange;
492// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
493// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
494
495 // finalize recording of the command buffer
496 err = xglEndCommandBuffer( m_cmdBuffer );
497 ASSERT_XGL_SUCCESS( err );
498
499 // this command buffer only uses the vertex buffer memory
500 m_numMemRefs = 0;
501// m_memRefs[0].flags = 0;
502// m_memRefs[0].mem = m_vtxBufferMemory;
503
504 // submit the command buffer to the universal queue
505 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
506 ASSERT_XGL_SUCCESS( err );
507
Chia-I Wuf34ac502014-08-27 14:58:05 +0800508 err = xglQueueWaitIdle( m_device->m_queue );
509 ASSERT_XGL_SUCCESS( err );
510
Courtney Goeltzenleuchter68cfe612014-08-26 18:16:41 -0600511 // Wait for work to finish before cleaning up.
512 xglDeviceWaitIdle(m_device->device());
513
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600514 RecordImage(m_renderTarget);
Chia-I Wuf070ec12014-08-30 23:58:36 +0800515
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600516}
517
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600518void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600519{
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600520 XGL_PIPELINE pipeline;
521 XGL_SHADER vs, ps;
522 XGL_RESULT err;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600523
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600524 ASSERT_NO_FATAL_FAILURE(InitState());
525 ASSERT_NO_FATAL_FAILURE(InitViewport());
526
527 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
528 vertShaderText, &vs));
529
530 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
531 fragShaderText, &ps));
532
533 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
534
535 /*
536 * Shaders are now part of the pipeline, don't need these anymore
537 */
538 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
539 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
540
541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
542
543 const int constantCount = 8;
544 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
545 0.0, 0.0, 1.0, 1.0 };
546
547 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
548
549 // Create descriptor set for a uniform resource
550 const int slotCount = 1;
551 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
552 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
553 descriptorInfo.slots = slotCount;
554
555 // create a descriptor set with a single slot
556 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
557 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
558
559 // bind memory to the descriptor set
560 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
561
562 // write the constant buffer view to the descriptor set
563 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
564 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
565 xglEndDescriptorSetUpdate( m_rsrcDescSet );
566
567 // Build command buffer
568 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
569 ASSERT_XGL_SUCCESS(err);
570
571 GenerateClearAndPrepareBufferCmds();
572 GenerateBindRenderTargetCmd();
573 GenerateBindStateAndPipelineCmds(&pipeline);
574
575// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
576// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
577
578 // render the cube
579 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
580
581 // prepare the back buffer for present
582// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
583// transitionToPresent.image = m_image;
584// transitionToPresent.oldState = m_image_state;
585// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
586// transitionToPresent.subresourceRange = srRange;
587// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
588// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
589
590 // finalize recording of the command buffer
591 err = xglEndCommandBuffer( m_cmdBuffer );
592 ASSERT_XGL_SUCCESS( err );
593
594 // this command buffer only uses the vertex buffer memory
595 m_numMemRefs = 0;
596// m_memRefs[0].flags = 0;
597// m_memRefs[0].mem = m_vtxBufferMemory;
598
599 // submit the command buffer to the universal queue
600 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
601 ASSERT_XGL_SUCCESS( err );
602
603 err = xglQueueWaitIdle( m_device->m_queue );
604 ASSERT_XGL_SUCCESS( err );
605
606 // Wait for work to finish before cleaning up.
607 xglDeviceWaitIdle(m_device->device());
608
609 RecordImage(m_renderTarget);
610
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600611}
612
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600613//TEST_F(XglRenderTest, TestDrawTriangle1)
614//{
615// static const char *vertShaderText =
616// "#version 130\n"
617// "vec2 vertices[3];\n"
618// "void main() {\n"
619// " vertices[0] = vec2(-1.0, -1.0);\n"
620// " vertices[1] = vec2( 1.0, -1.0);\n"
621// " vertices[2] = vec2( 0.0, 1.0);\n"
622// " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
623// "}\n";
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600624
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600625// static const char *fragShaderText =
626// "#version 130\n"
627// "uniform vec4 foo;\n"
628// "void main() {\n"
629// " gl_FragColor = foo;\n"
630// "}\n";
631// DrawTriangleTest(vertShaderText, fragShaderText);
632//}
633
634//TEST_F(XglRenderTest, TestDrawTriangle2)
635//{
636
637// static const char *vertShaderText =
638// "#version 130\n"
639// "out vec4 color;\n"
640// "out vec4 scale;\n"
641// "vec2 vertices[3];\n"
642// "void main() {\n"
643// "vec2 vertices[3];\n"
644// " vertices[0] = vec2(-0.5, -0.5);\n"
645// " vertices[1] = vec2( 0.5, -0.5);\n"
646// " vertices[2] = vec2( 0.5, 0.5);\n"
647// "vec4 colors[3];\n"
648// " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
649// " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
650// " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
651// " color = colors[gl_VertexID % 3];\n"
652// " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
653// " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
654// "}\n";
655
656// static const char *fragShaderText =
657// "#version 130\n"
658// "in vec4 color;\n"
659// "in vec4 scale;\n"
660// "uniform vec4 foo;\n"
661// "void main() {\n"
662// " gl_FragColor = color * scale + foo;\n"
663// "}\n";
664
665// DrawTriangleTest(vertShaderText, fragShaderText);
666//}
667
668//TEST_F(XglRenderTest, TestDrawTriangle3)
669//{
670// static const char *vertShaderText =
671// "#version 130\n"
672// "void main() {\n"
673// " vec2 vertices[3];"
674// " vertices[0] = vec2(-0.5, -0.5);\n"
675// " vertices[1] = vec2( 0.5, -0.5);\n"
676// " vertices[2] = vec2( 0.5, 0.5);\n"
677// " vec4 colors[3];\n"
678// " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
679// " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
680// " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
681// " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
682// "}\n";
683
684// static const char *fragShaderText =
685// "#version 130\n"
686// "void main() {\n"
687// " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
688// "}\n";
689
690// DrawTriangleTest(vertShaderText, fragShaderText);
691//}
692
693//TEST_F(XglRenderTest, TestDrawRotatedTriangle) {
694// DrawRotatedTriangleTest();
695//}
696
697TEST_F(XglRenderTest, TestDrawTriangleTwoFSUniforms)
698{
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600699 static const char *vertShaderText =
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -0600700 "#version 130\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600701 "out vec4 color;\n"
702 "out vec4 scale;\n"
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600703 "out vec2 samplePos;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600704 "void main() {\n"
705 " vec2 vertices[3];"
706 " vertices[0] = vec2(-0.5, -0.5);\n"
707 " vertices[1] = vec2( 0.5, -0.5);\n"
708 " vertices[2] = vec2( 0.5, 0.5);\n"
709 " vec4 colors[3];\n"
710 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
711 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
712 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600713 " color = colors[gl_VertexID % 3];\n"
714 " vec2 positions[3];"
715 " positions[0] = vec2( 0.0, 0.0);\n"
716 " positions[1] = vec2( 1.0, 0.0);\n"
717 " positions[2] = vec2( 1.0, 1.0);\n"
718 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600719 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
720 "}\n";
721
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600722
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600723 static const char *fragShaderText =
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600724 "#version 430\n"
725 "in vec4 color;\n"
726 "in vec4 scale;\n"
727 "uniform vec4 foo;\n"
728 "uniform vec4 bar;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600729 "void main() {\n"
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600730 // by default, with no location or blocks
731 // the compiler will read them from buffer
732 // in reverse order of first use in shader
733 // The buffer contains red, followed by blue,
734 // so foo should be blue, bar should be red
735 " gl_FragColor = color * scale * foo * bar + foo;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600736 "}\n";
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600737
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600738 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600739}
740
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600741int main(int argc, char **argv) {
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600742 int result;
743
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600744 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600745 XglTestFramework::InitArgs(&argc, argv);
746
Courtney Goeltzenleuchterf12c7762014-10-08 08:46:51 -0600747 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
748
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600749 result = RUN_ALL_TESTS();
750
751 XglTestFramework::Finish();
752 return result;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600753}