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