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