blob: 426c4a4e3458d29c70d0d6eacaee9c45df24c50c [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 Northropc6953d02014-10-20 11:23:32 -0600145 void DrawTexturedTriangle(const char *vertShaderText, const char *fragShaderText);
Cody Northrop722ff402014-10-20 09:22:42 -0600146
147 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
148 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northropc6953d02014-10-20 11:23:32 -0600149 void CreatePipelineSingleTextureAndSampler(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop722ff402014-10-20 09:22:42 -0600150 void DrawRotatedTriangleTest();
151
152
153protected:
154 XGL_IMAGE m_texture;
155 XGL_IMAGE_VIEW m_textureView;
156 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
157 XGL_GPU_MEMORY m_textureMem;
158
159 XGL_SAMPLER m_sampler;
160
161// XGL_APPLICATION_INFO app_info;
162// XGL_PHYSICAL_GPU objs[MAX_GPUS];
163// XGL_UINT gpu_count;
164// XGL_GPU_MEMORY m_descriptor_set_mem;
165// XGL_GPU_MEMORY m_pipe_mem;
166// XglDevice *m_device;
167// XGL_CMD_BUFFER m_cmdBuffer;
168// XGL_UINT32 m_numVertices;
169// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
170// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
171// XGL_GPU_MEMORY m_vtxBufferMem;
172// XGL_GPU_MEMORY m_constantBufferMem;
173// XGL_UINT32 m_numMemRefs;
174// XGL_MEMORY_REF m_memRefs[5];
175// XGL_RASTER_STATE_OBJECT m_stateRaster;
176// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
177// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
178// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
179// XGL_MSAA_STATE_OBJECT m_stateMsaa;
180// XGL_DESCRIPTOR_SET m_rsrcDescSet;
181
182 virtual void SetUp() {
183
184 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
185 this->app_info.pNext = NULL;
Cody Northropaa853252014-10-20 09:25:17 -0600186 this->app_info.pAppName = (const XGL_CHAR *) "compiler render_tests";
Cody Northrop722ff402014-10-20 09:22:42 -0600187 this->app_info.appVersion = 1;
188 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
189 this->app_info.engineVersion = 1;
190 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
191
192 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
193 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
194
195 InitFramework();
196 }
197
198 virtual void TearDown() {
199 // Clean up resources before we reset
200 ShutdownFramework();
201 }
202};
203
204// this function will create the vertex buffer and fill it with the mesh data
205void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
206 const void* vertices )
207{
208 XGL_RESULT err = XGL_SUCCESS;
209
210 assert( numVertices * vbStride > 0 );
211 m_numVertices = numVertices;
212
213 XGL_MEMORY_ALLOC_INFO alloc_info = {};
214 XGL_UINT8 *pData;
215
216 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
217 alloc_info.allocationSize = numVertices * vbStride;
218 alloc_info.alignment = 0;
219 alloc_info.heapCount = 1;
220 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
221
222 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
223 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
224
225 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
226 ASSERT_XGL_SUCCESS(err);
227
228 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
229 ASSERT_XGL_SUCCESS(err);
230
231 memcpy(pData, vertices, alloc_info.allocationSize);
232
233 err = xglUnmapMemory(m_vtxBufferMem);
234 ASSERT_XGL_SUCCESS(err);
235
236 // set up the memory view for the vertex buffer
237 this->m_vtxBufferView.stride = vbStride;
238 this->m_vtxBufferView.range = numVertices * vbStride;
239 this->m_vtxBufferView.offset = 0;
240 this->m_vtxBufferView.mem = m_vtxBufferMem;
241 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
242 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
243
244 // open the command buffer
245 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
246 ASSERT_XGL_SUCCESS(err);
247
248 XGL_MEMORY_STATE_TRANSITION transition = {};
249 transition.mem = m_vtxBufferMem;
250 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
251 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
252 transition.offset = 0;
253 transition.regionSize = numVertices * vbStride;
254
255 // write transition to the command buffer
256 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
257 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
258
259 // finish recording the command buffer
260 err = xglEndCommandBuffer( m_cmdBuffer );
261 ASSERT_XGL_SUCCESS(err);
262
263 // this command buffer only uses the vertex buffer memory
264 m_numMemRefs = 1;
265 m_memRefs[0].flags = 0;
266 m_memRefs[0].mem = m_vtxBufferMem;
267
268 // submit the command buffer to the universal queue
269 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
270 ASSERT_XGL_SUCCESS(err);
271}
272
273void XglRenderTest::InitTexture()
274{
275#define DEMO_TEXTURE_COUNT 1
276
277 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
278 const XGL_INT tex_width = 16;
279 const XGL_INT tex_height = 16;
280 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
281 { 0xffff0000, 0xff00ff00 },
282 };
283 XGL_RESULT err;
284 XGL_UINT i;
285
286 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
287 const XGL_SAMPLER_CREATE_INFO sampler = {
288 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
289 .pNext = NULL,
290 .magFilter = XGL_TEX_FILTER_NEAREST,
291 .minFilter = XGL_TEX_FILTER_NEAREST,
292 .mipMode = XGL_TEX_MIPMAP_BASE,
293 .addressU = XGL_TEX_ADDRESS_WRAP,
294 .addressV = XGL_TEX_ADDRESS_WRAP,
295 .addressW = XGL_TEX_ADDRESS_WRAP,
296 .mipLodBias = 0.0f,
297 .maxAnisotropy = 0,
298 .compareFunc = XGL_COMPARE_NEVER,
299 .minLod = 0.0f,
300 .maxLod = 0.0f,
301 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
302 };
303 const XGL_IMAGE_CREATE_INFO image = {
304 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
305 .pNext = NULL,
306 .imageType = XGL_IMAGE_2D,
307 .format = tex_format,
308 .extent = { tex_width, tex_height, 1 },
309 .mipLevels = 1,
310 .arraySize = 1,
311 .samples = 1,
312 .tiling = XGL_LINEAR_TILING,
313 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
314 .flags = 0,
315 };
316 XGL_MEMORY_ALLOC_INFO mem_alloc;
317 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
318 mem_alloc.pNext = NULL;
319 mem_alloc.allocationSize = 0;
320 mem_alloc.alignment = 0;
321 mem_alloc.flags = 0;
322 mem_alloc.heapCount = 0;
323 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
324 XGL_IMAGE_VIEW_CREATE_INFO view;
325 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
326 view.pNext = NULL;
327 view.image = XGL_NULL_HANDLE;
328 view.viewType = XGL_IMAGE_VIEW_2D;
329 view.format = image.format;
330 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
331 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
332 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
333 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
334 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
335 view.subresourceRange.baseMipLevel = 0;
336 view.subresourceRange.mipLevels = 1;
337 view.subresourceRange.baseArraySlice = 0;
338 view.subresourceRange.arraySize = 1;
339 view.minLod = 0.0f;
340
341 XGL_MEMORY_REQUIREMENTS mem_reqs;
342 XGL_SIZE mem_reqs_size;
343
344 /* create sampler */
345 err = xglCreateSampler(device(), &sampler, &m_sampler);
346 assert(!err);
347
348 /* create image */
349 err = xglCreateImage(device(), &image, &m_texture);
350 assert(!err);
351
352 err = xglGetObjectInfo(m_texture,
353 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
354 &mem_reqs_size, &mem_reqs);
355 assert(!err && mem_reqs_size == sizeof(mem_reqs));
356
357 mem_alloc.allocationSize = mem_reqs.size;
358 mem_alloc.alignment = mem_reqs.alignment;
359 mem_alloc.heapCount = mem_reqs.heapCount;
360 memcpy(mem_alloc.heaps, mem_reqs.heaps,
361 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
362
363 /* allocate memory */
364 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
365 assert(!err);
366
367 /* bind memory */
368 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
369 assert(!err);
370
371 /* create image view */
372 view.image = m_texture;
373 err = xglCreateImageView(device(), &view, &m_textureView);
374 assert(!err);
375 }
376
377 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
378 const XGL_IMAGE_SUBRESOURCE subres = {
379 .aspect = XGL_IMAGE_ASPECT_COLOR,
380 .mipLevel = 0,
381 .arraySlice = 0,
382 };
383 XGL_SUBRESOURCE_LAYOUT layout;
384 XGL_SIZE layout_size;
385 XGL_VOID *data;
386 XGL_INT x, y;
387
388 err = xglGetImageSubresourceInfo(m_texture, &subres,
389 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
390 assert(!err && layout_size == sizeof(layout));
391
392 err = xglMapMemory(m_textureMem, 0, &data);
393 assert(!err);
394
395 for (y = 0; y < tex_height; y++) {
396 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
397 for (x = 0; x < tex_width; x++)
398 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
399 }
400
401 err = xglUnmapMemory(m_textureMem);
402 assert(!err);
403 }
404
405 m_textureViewInfo.view = m_textureView;
406}
407
408void XglRenderTest::InitSampler()
409{
410 XGL_RESULT err;
411
412 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
413 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
414 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
415 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
416 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
417 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
418 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
419 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
420 samplerCreateInfo.mipLodBias = 0.0;
421 samplerCreateInfo.maxAnisotropy = 0.0;
422 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
423 samplerCreateInfo.minLod = 0.0;
424 samplerCreateInfo.maxLod = 0.0;
425 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
426
427 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
428 ASSERT_XGL_SUCCESS(err);
429}
430
431void XglRenderTest::DrawRotatedTriangleTest()
432{
433 // TODO : This test will pass a matrix into VS to affect triangle orientation.
434}
435
436void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
437{
438 XGL_PIPELINE pipeline;
439 XGL_SHADER vs, ps;
440 XGL_RESULT err;
441
442 ASSERT_NO_FATAL_FAILURE(InitState());
443 ASSERT_NO_FATAL_FAILURE(InitViewport());
444
445 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
446 vertShaderText, &vs));
447
448 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
449 fragShaderText, &ps));
450
451 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
452
453 /*
454 * Shaders are now part of the pipeline, don't need these anymore
455 */
456 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
457 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
458
459 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
460
461 const int constantCount = 4;
462 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
463 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
464
465 // Create descriptor set for a uniform resource
466 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
467 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
468 descriptorInfo.slots = 1;
469
470 // create a descriptor set with a single slot
471 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
472 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
473
474 // bind memory to the descriptor set
475 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
476
477 // write the constant buffer view to the descriptor set
478 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
479 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
480 xglEndDescriptorSetUpdate( m_rsrcDescSet );
481
482 // Build command buffer
483 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
484 ASSERT_XGL_SUCCESS(err);
485
486 GenerateClearAndPrepareBufferCmds();
487 GenerateBindRenderTargetCmd();
488 GenerateBindStateAndPipelineCmds(&pipeline);
489
490// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
491// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
492
493 // render the cube
494 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
495
496 // prepare the back buffer for present
497// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
498// transitionToPresent.image = m_image;
499// transitionToPresent.oldState = m_image_state;
500// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
501// transitionToPresent.subresourceRange = srRange;
502// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
503// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
504
505 // finalize recording of the command buffer
506 err = xglEndCommandBuffer( m_cmdBuffer );
507 ASSERT_XGL_SUCCESS( err );
508
509 // this command buffer only uses the vertex buffer memory
510 m_numMemRefs = 0;
511// m_memRefs[0].flags = 0;
512// m_memRefs[0].mem = m_vtxBufferMemory;
513
514 // submit the command buffer to the universal queue
515 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
516 ASSERT_XGL_SUCCESS( err );
517
518 err = xglQueueWaitIdle( m_device->m_queue );
519 ASSERT_XGL_SUCCESS( err );
520
521 // Wait for work to finish before cleaning up.
522 xglDeviceWaitIdle(m_device->device());
523
524 RecordImage(m_renderTarget);
525
526}
527
528void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
529{
530 XGL_PIPELINE pipeline;
531 XGL_SHADER vs, ps;
532 XGL_RESULT err;
533
534 ASSERT_NO_FATAL_FAILURE(InitState());
535 ASSERT_NO_FATAL_FAILURE(InitViewport());
536
537 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
538 vertShaderText, &vs));
539
540 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
541 fragShaderText, &ps));
542
543 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
544
545 /*
546 * Shaders are now part of the pipeline, don't need these anymore
547 */
548 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
549 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
550
551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
552
553 const int constantCount = 8;
554 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
555 0.0, 0.0, 1.0, 1.0 };
556
557 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
558
559 // Create descriptor set for a uniform resource
560 const int slotCount = 1;
561 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
562 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
563 descriptorInfo.slots = slotCount;
564
565 // create a descriptor set with a single slot
566 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
567 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
568
569 // bind memory to the descriptor set
570 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
571
572 // write the constant buffer view to the descriptor set
573 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
574 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
575 xglEndDescriptorSetUpdate( m_rsrcDescSet );
576
577 // Build command buffer
578 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
579 ASSERT_XGL_SUCCESS(err);
580
581 GenerateClearAndPrepareBufferCmds();
582 GenerateBindRenderTargetCmd();
583 GenerateBindStateAndPipelineCmds(&pipeline);
584
585// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
586// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
587
588 // render the cube
589 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
590
591 // prepare the back buffer for present
592// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
593// transitionToPresent.image = m_image;
594// transitionToPresent.oldState = m_image_state;
595// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
596// transitionToPresent.subresourceRange = srRange;
597// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
598// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
599
600 // finalize recording of the command buffer
601 err = xglEndCommandBuffer( m_cmdBuffer );
602 ASSERT_XGL_SUCCESS( err );
603
604 // this command buffer only uses the vertex buffer memory
605 m_numMemRefs = 0;
606// m_memRefs[0].flags = 0;
607// m_memRefs[0].mem = m_vtxBufferMemory;
608
609 // submit the command buffer to the universal queue
610 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
611 ASSERT_XGL_SUCCESS( err );
612
613 err = xglQueueWaitIdle( m_device->m_queue );
614 ASSERT_XGL_SUCCESS( err );
615
616 // Wait for work to finish before cleaning up.
617 xglDeviceWaitIdle(m_device->device());
618
619 RecordImage(m_renderTarget);
620
621}
622
Cody Northropc6953d02014-10-20 11:23:32 -0600623void XglRenderTest::DrawTexturedTriangle(const char *vertShaderText, const char *fragShaderText)
624{
625
626 // based on DrawTriangleTwoUniformsFS
627
628 XGL_PIPELINE pipeline;
629 XGL_SHADER vs, ps;
630 XGL_RESULT err;
631
632 ASSERT_NO_FATAL_FAILURE(InitState());
633 ASSERT_NO_FATAL_FAILURE(InitViewport());
634
635 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
636 vertShaderText, &vs));
637
638 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
639 fragShaderText, &ps));
640
641 ASSERT_NO_FATAL_FAILURE(CreatePipelineSingleTextureAndSampler(&pipeline, vs, ps));
642
643 /*
644 * Shaders are now part of the pipeline, don't need these anymore
645 */
646 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
647 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
648
649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
650
651
652 // Enable our single sampler
653 ASSERT_NO_FATAL_FAILURE(InitSampler());
654
655 // Enable our single texture
656 ASSERT_NO_FATAL_FAILURE(InitTexture());
657
658 // Create descriptor set for a texture and sampler resources
659 const int slotCount = 3;
660 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
661 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
662 descriptorInfo.slots = slotCount;
663
664 // create a descriptor set with a single slot
665 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
666 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
667
668 // bind memory to the descriptor set
669 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
670
671 // write the sampler and image views to the descriptor set
672 // ensure this matches order set in CreatePipelineSingleTextureAndSampler
673 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
674 xglAttachImageViewDescriptors( m_rsrcDescSet, 0, 1, &m_textureViewInfo );
675 xglAttachSamplerDescriptors(m_rsrcDescSet, 1, 1, &m_sampler);
676 xglEndDescriptorSetUpdate( m_rsrcDescSet );
677
678 // Build command buffer
679 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
680 ASSERT_XGL_SUCCESS(err);
681
682 GenerateClearAndPrepareBufferCmds();
683 GenerateBindRenderTargetCmd();
684 GenerateBindStateAndPipelineCmds(&pipeline);
685
686// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
687// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
688
689 // render the cube
690 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
691
692 // prepare the back buffer for present
693// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
694// transitionToPresent.image = m_image;
695// transitionToPresent.oldState = m_image_state;
696// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
697// transitionToPresent.subresourceRange = srRange;
698// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
699// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
700
701 // finalize recording of the command buffer
702 err = xglEndCommandBuffer( m_cmdBuffer );
703 ASSERT_XGL_SUCCESS( err );
704
705 // this command buffer only uses the vertex buffer memory
706 m_numMemRefs = 0;
707// m_memRefs[0].flags = 0;
708// m_memRefs[0].mem = m_vtxBufferMemory;
709
710 // submit the command buffer to the universal queue
711 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
712 ASSERT_XGL_SUCCESS( err );
713
714 err = xglQueueWaitIdle( m_device->m_queue );
715 ASSERT_XGL_SUCCESS( err );
716
717 // Wait for work to finish before cleaning up.
718 xglDeviceWaitIdle(m_device->device());
719
720 RecordImage(m_renderTarget);
721
722}
Cody Northrop722ff402014-10-20 09:22:42 -0600723
724void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText)
725{
726 XGL_PIPELINE pipeline;
727 XGL_SHADER vs, ps;
728 XGL_RESULT err;
729 glm::mat4 MVP;
730 int i;
731
732 // Create identity matrix
733 glm::mat4 Model = glm::mat4(1.0f);
734
735 ASSERT_NO_FATAL_FAILURE(InitState());
736 ASSERT_NO_FATAL_FAILURE(InitViewport());
737
738 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
739 vertShaderText, &vs));
740
741 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
742 fragShaderText, &ps));
743
744 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
745
746 /*
747 * Shaders are now part of the pipeline, don't need these anymore
748 */
749 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
750 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
751
752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
753
754 const int matrixSize = 16;
755 MVP = Model;
756
757 InitConstantBuffer(matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
758
759 // Create descriptor set for a uniform resource
760 const int slotCount = 1;
761 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
762 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
763 descriptorInfo.slots = slotCount;
764
765 // create a descriptor set with a single slot
766 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
767 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
768
769 // bind memory to the descriptor set
770 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
771
772 // write the constant buffer view to the descriptor set
773 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
774 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
775 xglEndDescriptorSetUpdate( m_rsrcDescSet );
776
777 // Build command buffer
778 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
779 ASSERT_XGL_SUCCESS(err);
780
781 GenerateClearAndPrepareBufferCmds();
782 GenerateBindRenderTargetCmd();
783 GenerateBindStateAndPipelineCmds(&pipeline);
784
785// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
786// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
787
788 // render the cube
789 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
790
791 // prepare the back buffer for present
792// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
793// transitionToPresent.image = m_image;
794// transitionToPresent.oldState = m_image_state;
795// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
796// transitionToPresent.subresourceRange = srRange;
797// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
798// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
799
800 // finalize recording of the command buffer
801 err = xglEndCommandBuffer( m_cmdBuffer );
802 ASSERT_XGL_SUCCESS( err );
803
804 // this command buffer only uses the vertex buffer memory
805 m_numMemRefs = 0;
806// m_memRefs[0].flags = 0;
807// m_memRefs[0].mem = m_vtxBufferMemory;
808
809 // submit the command buffer to the universal queue
810 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
811 ASSERT_XGL_SUCCESS( err );
812
813 err = xglQueueWaitIdle( m_device->m_queue );
814 ASSERT_XGL_SUCCESS( err );
815
816 // Wait for work to finish before cleaning up.
817 xglDeviceWaitIdle(m_device->device());
818
819 RecordImage(m_renderTarget);
820
821 for (i = 0; i < 8; i++) {
822 XGL_UINT8 *pData;
823 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
824 ASSERT_XGL_SUCCESS(err);
825
826 MVP = glm::rotate(MVP, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
827 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
828
829 err = xglUnmapMemory(m_constantBufferMem);
830 ASSERT_XGL_SUCCESS(err);
831
832 // submit the command buffer to the universal queue
833 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
834 ASSERT_XGL_SUCCESS( err );
835
836 err = xglQueueWaitIdle( m_device->m_queue );
837 ASSERT_XGL_SUCCESS( err );
838
839 // Wait for work to finish before cleaning up.
840 xglDeviceWaitIdle(m_device->device());
841
842 RecordImage(m_renderTarget);
843 }
844}
845
846void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
847{
848 XGL_RESULT err;
849 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
850 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
851 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
852
853
854 // Create descriptor set for our one resource
855 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
856 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
857 descriptorInfo.slots = 1; // Vertex buffer only
858
859 // create a descriptor set with a single slot
860 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
861 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
862
863 // bind memory to the descriptor set
864 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
865
866 // write the vertex buffer view to the descriptor set
867 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
868 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
869 xglEndDescriptorSetUpdate( m_rsrcDescSet );
870
871 const int slots = 1;
872 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
873 slotInfo[0].shaderEntityIndex = 0;
874 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
875
876 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
877 vs_stage.pNext = XGL_NULL_HANDLE;
878 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
879 vs_stage.shader.shader = vs;
880 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
881 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
882 vs_stage.shader.linkConstBufferCount = 0;
883 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
884 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
885 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
886
887 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
888 ps_stage.pNext = &vs_stage;
889 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
890 ps_stage.shader.shader = ps;
891 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
892 ps_stage.shader.linkConstBufferCount = 0;
893 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
894 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
895 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
896
897 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
898 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
899 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
900 };
901
902 // this is the current description of g_vbData
903 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
904 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
905 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
906 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
907 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
908 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
909 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
910 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
911 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
912
913 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
914 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
915 &ps_stage, // pNext;
916 1, // bindingCount
917 &vi_binding, // pVertexBindingDescriptions;
918 2, // attributeCount; // number of attributes
919 vi_attribs // pVertexAttributeDescriptions;
920 };
921
922 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
923 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
924 &vi_state, // pNext
925 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
926 XGL_FALSE, // disableVertexReuse
927 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
928 XGL_FALSE, // primitiveRestartEnable
929 0 // primitiveRestartIndex
930 };
931
932 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
933 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
934 &ia_state,
935 XGL_FALSE, // depthClipEnable
936 XGL_FALSE, // rasterizerDiscardEnable
937 1.0 // pointSize
938 };
939
940 XGL_PIPELINE_CB_STATE cb_state = {
941 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
942 &rs_state,
943 XGL_FALSE, // alphaToCoverageEnable
944 XGL_FALSE, // dualSourceBlendEnable
945 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
946 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
947 {
948 XGL_FALSE, // blendEnable
949 m_render_target_fmt, // XGL_FORMAT
950 0xF // channelWriteMask
951 }
952 }
953 };
954
955 // TODO: Should take depth buffer format from queried formats
956 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
957 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
958 &cb_state,
959 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
960 };
961
962 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
963 info.pNext = &db_state;
964 info.flags = 0;
965 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
966 ASSERT_XGL_SUCCESS(err);
967
968 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
969 ASSERT_XGL_SUCCESS(err);
970}
971
972void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
973{
974 XGL_RESULT err;
975 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
976 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
977 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
978
979
980 const int vsSlots = 1; // Uniform buffer only
981
982 // Create descriptor set for our one resource
983 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
984 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
985 descriptorInfo.slots = vsSlots;
986
987 // create a descriptor set with a single slot
988 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
989 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
990
991 // bind memory to the descriptor set
992 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
993
994
995 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
996 slotInfo[0].shaderEntityIndex = 0;
997 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
998
999 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1000 vs_stage.pNext = XGL_NULL_HANDLE;
1001 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1002 vs_stage.shader.shader = vs;
1003 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1004 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
1005 vs_stage.shader.linkConstBufferCount = 0;
1006 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1007 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1008 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1009
1010 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1011 ps_stage.pNext = &vs_stage;
1012 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1013 ps_stage.shader.shader = ps;
1014 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1015 ps_stage.shader.linkConstBufferCount = 0;
1016 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1017 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1018 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1019
1020 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1021 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1022 &ps_stage, // pNext
1023 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1024 XGL_FALSE, // disableVertexReuse
1025 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1026 XGL_FALSE, // primitiveRestartEnable
1027 0 // primitiveRestartIndex
1028 };
1029
1030 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1031 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1032 &ia_state,
1033 XGL_FALSE, // depthClipEnable
1034 XGL_FALSE, // rasterizerDiscardEnable
1035 1.0 // pointSize
1036 };
1037
1038 XGL_PIPELINE_CB_STATE cb_state = {
1039 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1040 &rs_state,
1041 XGL_FALSE, // alphaToCoverageEnable
1042 XGL_FALSE, // dualSourceBlendEnable
1043 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1044 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1045 {
1046 XGL_FALSE, // blendEnable
1047 m_render_target_fmt, // XGL_FORMAT
1048 0xF // channelWriteMask
1049 }
1050 }
1051 };
1052
1053 // TODO: Should take depth buffer format from queried formats
1054 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1055 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1056 &cb_state,
1057 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1058 };
1059
1060 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1061 info.pNext = &db_state;
1062 info.flags = 0;
1063 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1064 ASSERT_XGL_SUCCESS(err);
1065
1066 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1067 ASSERT_XGL_SUCCESS(err);
1068}
1069
Cody Northropc6953d02014-10-20 11:23:32 -06001070void XglRenderTest::CreatePipelineSingleTextureAndSampler(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1071{
1072 // based on CreatePipelineVSUniform
1073
1074 XGL_RESULT err;
1075 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1076 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1077 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1078
1079 const int psSlots = 2; // One texture, one sampler
1080
1081 // Create descriptor set for single texture and sampler
1082 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1083 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1084 descriptorInfo.slots = psSlots;
1085 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1086 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1087 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1088
1089//XXXXXX
1090 // Texture must be first, followed by sampler (VALIDATED THIS BEFORE SUBMITTING COMMENT)
1091//XXXXXX
1092
1093 // Assign the slots, note that only t0 and s0 will work as of writing this test
1094 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( psSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1095 slotInfo[0].shaderEntityIndex = 0;
1096 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1097 slotInfo[1].shaderEntityIndex = 0;
1098 slotInfo[1].slotObjectType = XGL_SLOT_SHADER_SAMPLER;
1099
1100 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1101 vs_stage.pNext = XGL_NULL_HANDLE;
1102 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1103 vs_stage.shader.shader = vs;
1104 vs_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1105 vs_stage.shader.linkConstBufferCount = 0;
1106 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1107 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1108 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1109
1110 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1111 ps_stage.pNext = &vs_stage;
1112 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1113 ps_stage.shader.shader = ps;
1114 ps_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1115 ps_stage.shader.descriptorSetMapping[0].descriptorCount = psSlots;
1116 ps_stage.shader.linkConstBufferCount = 0;
1117 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1118 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1119 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1120
1121 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1122 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1123 &ps_stage, // pNext
1124 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1125 XGL_FALSE, // disableVertexReuse
1126 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1127 XGL_FALSE, // primitiveRestartEnable
1128 0 // primitiveRestartIndex
1129 };
1130
1131 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1132 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1133 &ia_state,
1134 XGL_FALSE, // depthClipEnable
1135 XGL_FALSE, // rasterizerDiscardEnable
1136 1.0 // pointSize
1137 };
1138
1139 XGL_PIPELINE_CB_STATE cb_state = {
1140 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1141 &rs_state,
1142 XGL_FALSE, // alphaToCoverageEnable
1143 XGL_FALSE, // dualSourceBlendEnable
1144 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1145 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1146 {
1147 XGL_FALSE, // blendEnable
1148 m_render_target_fmt, // XGL_FORMAT
1149 0xF // channelWriteMask
1150 }
1151 }
1152 };
1153
1154 // TODO: Should take depth buffer format from queried formats
1155 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1156 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1157 &cb_state,
1158 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1159 };
1160
1161 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1162 info.pNext = &db_state;
1163 info.flags = 0;
1164 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1165 ASSERT_XGL_SUCCESS(err);
1166
1167 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1168 ASSERT_XGL_SUCCESS(err);
1169}
1170
Cody Northrop722ff402014-10-20 09:22:42 -06001171void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
1172{
1173 XGL_PIPELINE pipeline;
1174 XGL_SHADER vs, ps;
1175 XGL_RESULT err;
1176
1177 ASSERT_NO_FATAL_FAILURE(InitState());
1178 ASSERT_NO_FATAL_FAILURE(InitViewport());
1179 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
1180
1181 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1182 vertShaderText, &vs));
1183
1184 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1185 fragShaderText, &ps));
1186
1187 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
1188
1189 /*
1190 * Shaders are now part of the pipeline, don't need these anymore
1191 */
1192 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1193 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1194
1195 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1196
1197 // Build command buffer
1198 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1199 ASSERT_XGL_SUCCESS(err);
1200
1201 GenerateClearAndPrepareBufferCmds();
1202 GenerateBindRenderTargetCmd();
1203 GenerateBindStateAndPipelineCmds(&pipeline);
1204
1205// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1206// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1207
1208 // render the cube
1209 xglCmdDraw( m_cmdBuffer, 0, 6, 0, 1 );
1210
1211 // prepare the back buffer for present
1212// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1213// transitionToPresent.image = m_image;
1214// transitionToPresent.oldState = m_image_state;
1215// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1216// transitionToPresent.subresourceRange = srRange;
1217// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1218// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1219
1220 // finalize recording of the command buffer
1221 err = xglEndCommandBuffer( m_cmdBuffer );
1222 ASSERT_XGL_SUCCESS( err );
1223
1224 // this command buffer only uses the vertex buffer memory
1225 m_numMemRefs = 0;
1226// m_memRefs[0].flags = 0;
1227// m_memRefs[0].mem = m_vtxBufferMemory;
1228
1229 // submit the command buffer to the universal queue
1230 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1231 ASSERT_XGL_SUCCESS( err );
1232
1233 err = xglQueueWaitIdle( m_device->m_queue );
1234 ASSERT_XGL_SUCCESS( err );
1235
1236 // Wait for work to finish before cleaning up.
1237 xglDeviceWaitIdle(m_device->device());
1238
1239 RecordImage(m_renderTarget);
1240
1241}
1242
1243TEST_F(XglRenderTest, GreenTriangle)
1244{
1245 static const char *vertShaderText =
1246 "#version 130\n"
1247 "vec2 vertices[3];\n"
1248 "void main() {\n"
1249 " vertices[0] = vec2(-1.0, -1.0);\n"
1250 " vertices[1] = vec2( 1.0, -1.0);\n"
1251 " vertices[2] = vec2( 0.0, 1.0);\n"
1252 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1253 "}\n";
1254
1255 static const char *fragShaderText =
1256 "#version 130\n"
1257 "void main() {\n"
1258 " gl_FragColor = vec4(0,1,0,1);\n"
1259 "}\n";
1260 DrawTriangleTest(vertShaderText, fragShaderText);
1261}
1262
1263TEST_F(XglRenderTest, BIL_GreenTriangle)
1264{
1265 bool saved_use_bil = XglTestFramework::m_use_bil;
1266
1267 static const char *vertShaderText =
1268 "#version 130\n"
1269 "vec2 vertices[3];\n"
1270 "void main() {\n"
1271 " vertices[0] = vec2(-1.0, -1.0);\n"
1272 " vertices[1] = vec2( 1.0, -1.0);\n"
1273 " vertices[2] = vec2( 0.0, 1.0);\n"
1274 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1275 "}\n";
1276
1277 static const char *fragShaderText =
1278 "#version 130\n"
1279 "void main() {\n"
1280 " gl_FragColor = vec4(0,1,0,1);\n"
1281 "}\n";
1282 XglTestFramework::m_use_bil = true;
1283 DrawTriangleTest(vertShaderText, fragShaderText);
1284 XglTestFramework::m_use_bil = saved_use_bil;
1285}
1286
1287TEST_F(XglRenderTest, TriangleFragUniform)
1288{
1289
1290 static const char *vertShaderText =
1291 "#version 130\n"
1292 "out vec4 color;\n"
1293 "out vec4 scale;\n"
1294 "vec2 vertices[3];\n"
1295 "void main() {\n"
1296 "vec2 vertices[3];\n"
1297 " vertices[0] = vec2(-0.5, -0.5);\n"
1298 " vertices[1] = vec2( 0.5, -0.5);\n"
1299 " vertices[2] = vec2( 0.5, 0.5);\n"
1300 "vec4 colors[3];\n"
1301 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1302 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1303 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1304 " color = colors[gl_VertexID % 3];\n"
1305 " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
1306 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1307 "}\n";
1308
1309 static const char *fragShaderText =
1310 "#version 130\n"
1311 "in vec4 color;\n"
1312 "in vec4 scale;\n"
1313 "uniform vec4 foo;\n"
1314 "void main() {\n"
1315 " gl_FragColor = color * scale + foo;\n"
1316 "}\n";
1317
1318 DrawTriangleTest(vertShaderText, fragShaderText);
1319}
1320
1321TEST_F(XglRenderTest, YellowTriangle)
1322{
1323 static const char *vertShaderText =
1324 "#version 130\n"
1325 "void main() {\n"
1326 " vec2 vertices[3];"
1327 " vertices[0] = vec2(-0.5, -0.5);\n"
1328 " vertices[1] = vec2( 0.5, -0.5);\n"
1329 " vertices[2] = vec2( 0.5, 0.5);\n"
1330 " vec4 colors[3];\n"
1331 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1332 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1333 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1334 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1335 "}\n";
1336
1337 static const char *fragShaderText =
1338 "#version 130\n"
1339 "void main() {\n"
1340 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
1341 "}\n";
1342
1343 DrawTriangleTest(vertShaderText, fragShaderText);
1344}
1345
1346TEST_F(XglRenderTest, RotatedTriangle) {
1347 DrawRotatedTriangleTest();
1348}
1349
1350TEST_F(XglRenderTest, TriangleTwoFSUniforms)
1351{
1352 static const char *vertShaderText =
1353 "#version 130\n"
1354 "out vec4 color;\n"
1355 "out vec4 scale;\n"
1356 "out vec2 samplePos;\n"
1357 "void main() {\n"
1358 " vec2 vertices[3];"
1359 " vertices[0] = vec2(-0.5, -0.5);\n"
1360 " vertices[1] = vec2( 0.5, -0.5);\n"
1361 " vertices[2] = vec2( 0.5, 0.5);\n"
1362 " vec4 colors[3];\n"
1363 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1364 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1365 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1366 " color = colors[gl_VertexID % 3];\n"
1367 " vec2 positions[3];"
1368 " positions[0] = vec2( 0.0, 0.0);\n"
1369 " positions[1] = vec2( 1.0, 0.0);\n"
1370 " positions[2] = vec2( 1.0, 1.0);\n"
1371 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
1372 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1373 "}\n";
1374
1375
1376 static const char *fragShaderText =
1377 "#version 430\n"
1378 "in vec4 color;\n"
1379 "in vec4 scale;\n"
1380 "uniform vec4 foo;\n"
1381 "uniform vec4 bar;\n"
1382 "void main() {\n"
1383 // by default, with no location or blocks
1384 // the compiler will read them from buffer
1385 // in reverse order of first use in shader
1386 // The buffer contains red, followed by blue,
1387 // so foo should be blue, bar should be red
1388 " gl_FragColor = color * scale * foo * bar + foo;\n"
1389 "}\n";
1390
1391 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
1392}
1393
1394TEST_F(XglRenderTest, TriangleWithVertexFetch)
1395{
1396 static const char *vertShaderText =
1397 "#version 130\n"
1398 //XYZ1( -1, -1, -1 )
1399 "in vec4 pos;\n"
1400 //XYZ1( 0.f, 0.f, 0.f )
1401 "in vec4 inColor;\n"
1402 "out vec4 outColor;\n"
1403 "void main() {\n"
1404 " outColor = inColor;\n"
1405 " gl_Position = pos;\n"
1406 "}\n";
1407
1408
1409 static const char *fragShaderText =
1410 "#version 430\n"
1411 "in vec4 color;\n"
1412 "void main() {\n"
1413 " gl_FragColor = color;\n"
1414 "}\n";
1415
1416 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
1417}
1418
1419TEST_F(XglRenderTest, TriangleVSUniform)
1420{
1421 static const char *vertShaderText =
1422 "#version 130\n"
1423 "uniform mat4 mvp;\n"
1424 "void main() {\n"
1425 " vec2 vertices[3];"
1426 " vertices[0] = vec2(-0.5, -0.5);\n"
1427 " vertices[1] = vec2( 0.5, -0.5);\n"
1428 " vertices[2] = vec2( 0.5, 0.5);\n"
1429 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0) * mvp;\n"
1430 "}\n";
1431
1432 static const char *fragShaderText =
1433 "#version 430\n"
1434 "void main() {\n"
1435 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
1436 "}\n";
1437
1438 // Create identity matrix
1439 glm::mat4 Model = glm::mat4(1.0f);
1440 DrawTriangleVSUniform(vertShaderText, fragShaderText);
1441
1442// Model = glm::rotate(Model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
1443// DrawTriangleVSUniform(vertShaderText, fragShaderText, Model);
1444}
1445
Cody Northropc6953d02014-10-20 11:23:32 -06001446TEST_F(XglRenderTest, TexturedTriangle)
1447{
1448 static const char *vertShaderText =
1449 "#version 130\n"
1450 "out vec2 samplePos;\n"
1451 "void main() {\n"
1452 " vec2 vertices[3];"
1453 " vertices[0] = vec2(-0.5, -0.5);\n"
1454 " vertices[1] = vec2( 0.5, -0.5);\n"
1455 " vertices[2] = vec2( 0.5, 0.5);\n"
1456 " vec2 positions[3];"
1457 " positions[0] = vec2( 0.0, 0.0);\n"
1458 " positions[1] = vec2( 1.0, 0.0);\n"
1459 " positions[2] = vec2( 1.0, 1.0);\n"
1460 " samplePos = positions[gl_VertexID % 3];\n"
1461 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1462 "}\n";
1463
1464 static const char *fragShaderText =
1465 "#version 130\n"
1466 "in vec2 samplePos;\n"
1467 "uniform sampler2D surface;\n"
1468 "void main() {\n"
1469 " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
1470 " gl_FragColor = texColor;\n"
1471 "}\n";
1472 DrawTexturedTriangle(vertShaderText, fragShaderText);
1473}
1474
Cody Northrop722ff402014-10-20 09:22:42 -06001475int main(int argc, char **argv) {
1476 int result;
1477
1478 ::testing::InitGoogleTest(&argc, argv);
1479 XglTestFramework::InitArgs(&argc, argv);
1480
1481 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
1482
1483 result = RUN_ALL_TESTS();
1484
1485 XglTestFramework::Finish();
1486 return result;
1487}