blob: 3cda530cf15d1ba0570b9dedfe3df62aa02aa555 [file] [log] [blame]
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001// Copyright 2005, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
31// XGL tests
32//
33// Copyright (C) 2014 LunarG, Inc.
34//
35// Permission is hereby granted, free of charge, to any person obtaining a
36// copy of this software and associated documentation files (the "Software"),
37// to deal in the Software without restriction, including without limitation
38// the rights to use, copy, modify, merge, publish, distribute, sublicense,
39// and/or sell copies of the Software, and to permit persons to whom the
40// Software is furnished to do so, subject to the following conditions:
41//
42// The above copyright notice and this permission notice shall be included
43// in all copies or substantial portions of the Software.
44//
45// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
48// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
50// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
51// DEALINGS IN THE SOFTWARE.
52
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060053// Basic rendering tests
54
55#include <stdlib.h>
56#include <stdio.h>
57#include <stdbool.h>
58#include <string.h>
Courtney Goeltzenleuchter76a643b2014-08-21 17:34:22 -060059#include <iostream>
60#include <fstream>
61using namespace std;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060062
63#include <xgl.h>
Tobin Ehlis31446e52014-11-28 11:17:19 -070064#ifdef DUMP_STATE_DOT
65#include "../layers/draw_state.h"
66#endif
Tobin Ehlis3c26a542014-11-18 11:28:33 -070067#ifdef PRINT_OBJECTS
68#include "../layers/object_track.h"
69#endif
Tobin Ehlis791a49c2014-11-10 12:29:12 -070070#ifdef DEBUG_CALLBACK
71#include <xglDbg.h>
72#endif
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060073#include "gtest-1.7.0/include/gtest/gtest.h"
74
Chia-I Wu4115c892014-08-28 11:56:29 +080075#include "icd-bil.h"
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060076
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -060077#define GLM_FORCE_RADIANS
78#include "glm/glm.hpp"
79#include <glm/gtc/matrix_transform.hpp>
80
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -060081#include "xglrenderframework.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070082#ifdef DEBUG_CALLBACK
83XGL_VOID XGLAPI myDbgFunc(
84 XGL_DBG_MSG_TYPE msgType,
85 XGL_VALIDATION_LEVEL validationLevel,
86 XGL_BASE_OBJECT srcObject,
87 XGL_SIZE location,
88 XGL_INT msgCode,
89 const XGL_CHAR* pMsg,
90 XGL_VOID* pUserData)
91{
Tobin Ehlis3c26a542014-11-18 11:28:33 -070092 switch (msgType)
93 {
94 case XGL_DBG_MSG_WARNING:
95 printf("CALLBACK WARNING : %s\n", pMsg);
96 break;
97 case XGL_DBG_MSG_ERROR:
98 printf("CALLBACK ERROR : %s\n", pMsg);
99 break;
100 default:
101 printf("EATING Msg of type %u\n", msgType);
102 break;
103 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700104}
105#endif
Tony Barbourf43b6982014-11-25 13:18:32 -0700106
107
108#undef ASSERT_NO_FATAL_FAILURE
109#define ASSERT_NO_FATAL_FAILURE(x) x
110
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600111//--------------------------------------------------------------------------------------
112// Mesh and VertexFormat Data
113//--------------------------------------------------------------------------------------
114struct Vertex
115{
116 XGL_FLOAT posX, posY, posZ, posW; // Position data
117 XGL_FLOAT r, g, b, a; // Color
118};
119
120#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
121
122static const Vertex g_vbData[] =
123{
124 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
125 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
126 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
127 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
128 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
129 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
130
131 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
132 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
133 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
134 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
135 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
136 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
137
138 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
139 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
140 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
141 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
142 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
143 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
144
145 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
146 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
147 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
148 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
149 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
150 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
151
152 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
153 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
154 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
155 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
156 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
157 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
158
159 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
160 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
161 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
162 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
163 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
164 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
165};
166
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600167static const Vertex g_vb_solid_face_colors_Data[] =
168{
169 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
170 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
171 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
172 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
173 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
174 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
175
176 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
177 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
178 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
179 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
180 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
181 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
182
183 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
184 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
185 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
186 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
187 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
188 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
189
190 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
191 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
192 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
193 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
194 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
195 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
196
197 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
198 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
199 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
200 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
201 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
202 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
203
204 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
205 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
206 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
207 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
208 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
209 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
210};
211
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600212class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600213{
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600214public:
Cody Northrop4e6b4762014-10-09 21:25:22 -0600215
Tony Barbourf43b6982014-11-25 13:18:32 -0700216 void RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model,
Tony Barbourdd4c9642015-01-09 12:55:14 -0700217 XglConstantBufferObj *constantBuffer, XglCommandBufferObj *cmdBuffer);
Tony Barbour02472db2015-01-08 17:08:28 -0700218 void GenericDrawPreparation(XglCommandBufferObj *cmdBuffer, XglPipelineObj *pipelineobj, XglDescriptorSetObj *descriptorSet);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600219 void InitDepthStencil();
Tony Barbourae442072015-01-12 13:27:11 -0700220 void XGLTriangleTest(const char *vertShaderText, const char *fragShaderText, const bool rotate);
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600221
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600222
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600223protected:
Cody Northrop350727b2014-10-06 15:42:00 -0600224 XGL_IMAGE m_texture;
225 XGL_IMAGE_VIEW m_textureView;
226 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
227 XGL_GPU_MEMORY m_textureMem;
228
229 XGL_SAMPLER m_sampler;
230
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600231 XGL_FORMAT m_depth_stencil_fmt;
232 XGL_IMAGE m_depthStencilImage;
233 XGL_GPU_MEMORY m_depthStencilMem;
234 XGL_DEPTH_STENCIL_VIEW m_depthStencilView;
Tony Barbourf43b6982014-11-25 13:18:32 -0700235 XglMemoryRefManager m_memoryRefManager;
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600236
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600237
238 virtual void SetUp() {
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600239
240 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
241 this->app_info.pNext = NULL;
Chia-I Wu7461fcf2014-12-27 15:16:07 +0800242 this->app_info.pAppName = "render_tests";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600243 this->app_info.appVersion = 1;
Chia-I Wu7461fcf2014-12-27 15:16:07 +0800244 this->app_info.pEngineName = "unittest";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600245 this->app_info.engineVersion = 1;
246 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
247
Cody Northrop350727b2014-10-06 15:42:00 -0600248 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
249 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
Tony Barbour97a36232014-12-04 17:14:45 -0700250 memset(&m_depthStencilImage, 0, sizeof(m_depthStencilImage));
Cody Northrop350727b2014-10-06 15:42:00 -0600251
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600252 InitFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600253 }
254
255 virtual void TearDown() {
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600256 // Clean up resources before we reset
257 ShutdownFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600258 }
259};
260
Tony Barbour02472db2015-01-08 17:08:28 -0700261void XglRenderTest::GenericDrawPreparation(XglCommandBufferObj *cmdBuffer, XglPipelineObj *pipelineobj, XglDescriptorSetObj *descriptorSet)
262{
263 cmdBuffer->ClearAllBuffers(&m_depthStencilBinding, m_depthStencilImage);
264 cmdBuffer->BindAttachments(&m_depthStencilBinding);
265 cmdBuffer->BindStateObject(XGL_STATE_BIND_RASTER, m_stateRaster);
266 cmdBuffer->BindStateObject(XGL_STATE_BIND_VIEWPORT, m_stateViewport);
267 cmdBuffer->BindStateObject(XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
268 cmdBuffer->BindStateObject(XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil);
269 cmdBuffer->BindStateObject(XGL_STATE_BIND_MSAA, m_stateMsaa);
270 pipelineobj->CreateXGLPipeline(descriptorSet);
271 cmdBuffer->BindPipeline(pipelineobj->GetPipelineHandle());
272 descriptorSet->CreateXGLDescriptorSet();
273 cmdBuffer->BindDescriptorSet(descriptorSet->GetDescriptorSetHandle());
274}
Tony Barbourf43b6982014-11-25 13:18:32 -0700275
Tony Barbourf43b6982014-11-25 13:18:32 -0700276void XglRenderTest::RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model,
Tony Barbourdd4c9642015-01-09 12:55:14 -0700277 XglConstantBufferObj *constantBuffer, XglCommandBufferObj *cmdBuffer)
278{
279 int i;
280 glm::mat4 MVP;
281 int matrixSize = sizeof(MVP);
282 XGL_RESULT err;
283
284 for (i = 0; i < 8; i++) {
285 void *pData = constantBuffer->map();
286
287 Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
288 MVP = Projection * View * Model;
289 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
290
291 constantBuffer->unmap();
292
293 // submit the command buffer to the universal queue
294 cmdBuffer->QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
295
Tony Barbourdd4c9642015-01-09 12:55:14 -0700296 err = xglQueueWaitIdle( m_device->m_queue );
297 ASSERT_XGL_SUCCESS( err );
298
299 // Wait for work to finish before cleaning up.
300 xglDeviceWaitIdle(m_device->device());
301
302 assert(m_renderTargetCount == 1);
303 RecordImage(m_renderTargets[0]);
304 }
305}
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600306
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600307void dumpMatrix(const char *note, glm::mat4 MVP)
308{
Chia-I Wu7133fdc2014-12-15 23:57:34 +0800309 int i;
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600310
311 printf("%s: \n", note);
312 for (i=0; i<4; i++) {
313 printf("%f, %f, %f, %f\n", MVP[i][0], MVP[i][1], MVP[i][2], MVP[i][3]);
314 }
315 printf("\n");
316 fflush(stdout);
317}
318
319void dumpVec4(const char *note, glm::vec4 vector)
320{
321 printf("%s: \n", note);
322 printf("%f, %f, %f, %f\n", vector[0], vector[1], vector[2], vector[3]);
323 printf("\n");
324 fflush(stdout);
325}
326
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600327void XglRenderTest::InitDepthStencil()
328{
329 XGL_RESULT err;
330 XGL_IMAGE_CREATE_INFO image;
331 XGL_MEMORY_ALLOC_INFO mem_alloc;
332 XGL_DEPTH_STENCIL_VIEW_CREATE_INFO view;
333 XGL_MEMORY_REQUIREMENTS mem_reqs;
Jon Ashburn6317c492014-11-21 11:33:20 -0700334 XGL_SIZE mem_reqs_size=sizeof(XGL_MEMORY_REQUIREMENTS);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600335
336 // Clean up default state created by framework
337 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
338
339 m_depth_stencil_fmt.channelFormat = XGL_CH_FMT_R16;
340 m_depth_stencil_fmt.numericFormat = XGL_NUM_FMT_DS;
341
342 image.sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
343 image.pNext = NULL;
344 image.imageType = XGL_IMAGE_2D;
345 image.format = m_depth_stencil_fmt;
346 image.extent.width = m_width;
347 image.extent.height = m_height;
348 image.extent.depth = 1;
349 image.mipLevels = 1;
350 image.arraySize = 1;
351 image.samples = 1;
352 image.tiling = XGL_OPTIMAL_TILING;
353 image.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT;
354 image.flags = 0;
355
356 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
357 mem_alloc.pNext = NULL;
358 mem_alloc.allocationSize = 0;
359 mem_alloc.alignment = 0;
360 mem_alloc.flags = 0;
361 mem_alloc.heapCount = 0;
362 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
363
364 /* create image */
365 err = xglCreateImage(device(), &image,
366 &m_depthStencilImage);
367 ASSERT_XGL_SUCCESS(err);
368
369 err = xglGetObjectInfo(m_depthStencilImage,
370 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
371 &mem_reqs_size, &mem_reqs);
372 ASSERT_XGL_SUCCESS(err);
373 ASSERT_EQ(mem_reqs_size, sizeof(mem_reqs));
374
375 mem_alloc.allocationSize = mem_reqs.size;
376 mem_alloc.alignment = mem_reqs.alignment;
377 mem_alloc.heapCount = mem_reqs.heapCount;
378 memcpy(mem_alloc.heaps, mem_reqs.heaps,
379 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
380
381 /* allocate memory */
382 err = xglAllocMemory(device(), &mem_alloc, &m_depthStencilMem);
383 ASSERT_XGL_SUCCESS(err);
384
385 /* bind memory */
386 err = xglBindObjectMemory(m_depthStencilImage, m_depthStencilMem, 0);
387 ASSERT_XGL_SUCCESS(err);
388
389 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depthStencil = {};
390 depthStencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
391 depthStencil.depthTestEnable = XGL_TRUE;
392 depthStencil.depthWriteEnable = XGL_TRUE;
393 depthStencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
394 depthStencil.depthBoundsEnable = XGL_FALSE;
395 depthStencil.minDepth = 0.f;
396 depthStencil.maxDepth = 1.f;
397 depthStencil.back.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
398 depthStencil.back.stencilFailOp = XGL_STENCIL_OP_KEEP;
399 depthStencil.back.stencilPassOp = XGL_STENCIL_OP_KEEP;
400 depthStencil.back.stencilRef = 0x00;
401 depthStencil.back.stencilFunc = XGL_COMPARE_ALWAYS;
402 depthStencil.front = depthStencil.back;
403
404 err = xglCreateDepthStencilState( device(), &depthStencil, &m_stateDepthStencil );
405 ASSERT_XGL_SUCCESS( err );
406
407 /* create image view */
408 view.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
409 view.pNext = NULL;
410 view.image = XGL_NULL_HANDLE;
411 view.mipLevel = 0;
412 view.baseArraySlice = 0;
413 view.arraySize = 1;
414 view.flags = 0;
415 view.image = m_depthStencilImage;
416 err = xglCreateDepthStencilView(device(), &view, &m_depthStencilView);
417 ASSERT_XGL_SUCCESS(err);
418
419 m_depthStencilBinding.view = m_depthStencilView;
420 m_depthStencilBinding.depthState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
421 m_depthStencilBinding.stencilState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
422}
423
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600424struct xgltriangle_vs_uniform {
425 // Must start with MVP
426 XGL_FLOAT mvp[4][4];
427 XGL_FLOAT position[3][4];
428 XGL_FLOAT color[3][4];
429};
430
Tony Barbourae442072015-01-12 13:27:11 -0700431void XglRenderTest::XGLTriangleTest(const char *vertShaderText, const char *fragShaderText, const bool rotate)
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600432{
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700433#ifdef DEBUG_CALLBACK
434 xglDbgRegisterMsgCallback(myDbgFunc, NULL);
435#endif
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600436 // Create identity matrix
437 int i;
438 struct xgltriangle_vs_uniform data;
439
440 glm::mat4 Projection = glm::mat4(1.0f);
441 glm::mat4 View = glm::mat4(1.0f);
442 glm::mat4 Model = glm::mat4(1.0f);
443 glm::mat4 MVP = Projection * View * Model;
444 const int matrixSize = sizeof(MVP);
445 const int bufSize = sizeof(xgltriangle_vs_uniform) / sizeof(XGL_FLOAT);
446 memcpy(&data.mvp, &MVP[0][0], matrixSize);
447
448 static const Vertex tri_data[] =
449 {
450 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
451 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
452 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
453 };
454
455 for (i=0; i<3; i++) {
456 data.position[i][0] = tri_data[i].posX;
457 data.position[i][1] = tri_data[i].posY;
458 data.position[i][2] = tri_data[i].posZ;
459 data.position[i][3] = tri_data[i].posW;
460 data.color[i][0] = tri_data[i].r;
461 data.color[i][1] = tri_data[i].g;
462 data.color[i][2] = tri_data[i].b;
463 data.color[i][3] = tri_data[i].a;
464 }
465
Tony Barbourf43b6982014-11-25 13:18:32 -0700466 ASSERT_NO_FATAL_FAILURE(InitState());
467 ASSERT_NO_FATAL_FAILURE(InitViewport());
468
469 XglConstantBufferObj constantBuffer(m_device, bufSize*2, sizeof(XGL_FLOAT), (const void*) &data);
470
471 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
472 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
473 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &constantBuffer);
474
475 XglPipelineObj pipelineobj(m_device);
476 pipelineobj.AddShader(&vs);
477 pipelineobj.AddShader(&ps);
478
479 XglDescriptorSetObj descriptorSet(m_device);
480 descriptorSet.AttachMemoryView(&constantBuffer);
481 m_memoryRefManager.AddMemoryRef(&constantBuffer);
482
Tony Barbour71ba3612015-01-09 16:12:35 -0700483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
484 XglCommandBufferObj cmdBuffer(m_device);
485 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -0700486
Tony Barbour71ba3612015-01-09 16:12:35 -0700487 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
488
489 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
490
491 cmdBuffer.BindVertexBuffer(&constantBuffer, 0, 0);
492#ifdef DUMP_STATE_DOT
493 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
494 pDSDumpDot((char*)"triTest2.dot");
495#endif
496 // render triangle
497 cmdBuffer.Draw(0, 3, 0, 1);
498
499 // finalize recording of the command buffer
500 cmdBuffer.EndCommandBuffer();
501 cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
502
503 for (int i = 0; i < m_renderTargetCount; i++)
504 RecordImage(m_renderTargets[i]);
505
506 if (rotate)
507 RotateTriangleVSUniform(Projection, View, Model, &constantBuffer, &cmdBuffer);
508
Tobin Ehlis3c26a542014-11-18 11:28:33 -0700509#ifdef PRINT_OBJECTS
510 //XGL_UINT64 objTrackGetObjectCount(XGL_OBJECT_TYPE type)
511 OBJ_TRACK_GET_OBJECT_COUNT pObjTrackGetObjectCount = (OBJ_TRACK_GET_OBJECT_COUNT)xglGetProcAddr(gpu(), (XGL_CHAR*)"objTrackGetObjectCount");
512 XGL_UINT64 numObjects = pObjTrackGetObjectCount(XGL_OBJECT_TYPE_ANY);
513 //OBJ_TRACK_GET_OBJECTS pGetObjsFunc = xglGetProcAddr(gpu(), (XGL_CHAR*)"objTrackGetObjects");
514 printf("DEBUG : Number of Objects : %lu\n", numObjects);
515 OBJ_TRACK_GET_OBJECTS pObjTrackGetObjs = (OBJ_TRACK_GET_OBJECTS)xglGetProcAddr(gpu(), (XGL_CHAR*)"objTrackGetObjects");
516 OBJTRACK_NODE* pObjNodeArray = (OBJTRACK_NODE*)malloc(sizeof(OBJTRACK_NODE)*numObjects);
517 pObjTrackGetObjs(XGL_OBJECT_TYPE_ANY, numObjects, pObjNodeArray);
518 for (i=0; i < numObjects; i++) {
519 printf("Object %i of type %s has objID (%p) and %lu uses\n", i, string_XGL_OBJECT_TYPE(pObjNodeArray[i].objType), pObjNodeArray[i].pObj, pObjNodeArray[i].numUses);
520 }
521 free(pObjNodeArray);
522#endif
Tony Barbourf43b6982014-11-25 13:18:32 -0700523
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600524}
525
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -0600526TEST_F(XglRenderTest, XGLTriangle_FragColor)
527{
528 static const char *vertShaderText =
529 "#version 140\n"
530 "#extension GL_ARB_separate_shader_objects : enable\n"
531 "#extension GL_ARB_shading_language_420pack : enable\n"
532 "\n"
533 "layout(binding = 0) uniform buf {\n"
534 " mat4 MVP;\n"
535 " vec4 position[3];\n"
536 " vec4 color[3];\n"
537 "} ubuf;\n"
538 "\n"
539 "layout (location = 0) out vec4 outColor;\n"
540 "\n"
541 "void main() \n"
542 "{\n"
543 " outColor = ubuf.color[gl_VertexID];\n"
544 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
545 "}\n";
546
547 static const char *fragShaderText =
548 "#version 140\n"
549 "#extension GL_ARB_separate_shader_objects : enable\n"
550 "#extension GL_ARB_shading_language_420pack : enable\n"
551 "\n"
552 "layout (location = 0) in vec4 inColor;\n"
553 "\n"
554 "void main()\n"
555 "{\n"
556 " gl_FragColor = inColor;\n"
557 "}\n";
558
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -0600559 TEST_DESCRIPTION("XGL-style shaders where fragment shader outputs to GLSL built-in gl_FragColor");
Tony Barbourae442072015-01-12 13:27:11 -0700560 XGLTriangleTest(vertShaderText, fragShaderText, true);
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -0600561}
562
563TEST_F(XglRenderTest, XGLTriangle_OutputLocation)
564{
565 static const char *vertShaderText =
566 "#version 140\n"
567 "#extension GL_ARB_separate_shader_objects : enable\n"
568 "#extension GL_ARB_shading_language_420pack : enable\n"
569 "\n"
570 "layout(binding = 0) uniform buf {\n"
571 " mat4 MVP;\n"
572 " vec4 position[3];\n"
573 " vec4 color[3];\n"
574 "} ubuf;\n"
575 "\n"
576 "layout (location = 0) out vec4 outColor;\n"
577 "\n"
578 "void main() \n"
579 "{\n"
580 " outColor = ubuf.color[gl_VertexID];\n"
581 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
582 "}\n";
583
584 static const char *fragShaderText =
585 "#version 140\n"
586 "#extension GL_ARB_separate_shader_objects : enable\n"
587 "#extension GL_ARB_shading_language_420pack : enable\n"
588 "\n"
589 "layout (location = 0) in vec4 inColor;\n"
590 "layout (location = 0) out vec4 outColor;\n"
591 "\n"
592 "void main()\n"
593 "{\n"
594 " outColor = inColor;\n"
595 "}\n";
596
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -0600597 TEST_DESCRIPTION("XGL-style shaders where fragment shader outputs to output location 0, which should be the same as gl_FragColor");
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -0600598
Tony Barbourae442072015-01-12 13:27:11 -0700599 XGLTriangleTest(vertShaderText, fragShaderText, true);
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -0600600}
601
Tony Barbourf43b6982014-11-25 13:18:32 -0700602TEST_F(XglRenderTest, BIL_XGLTriangle)
603{
604 bool saved_use_bil = XglTestFramework::m_use_bil;
605
606 static const char *vertShaderText =
607 "#version 140\n"
608 "#extension GL_ARB_separate_shader_objects : enable\n"
609 "#extension GL_ARB_shading_language_420pack : enable\n"
610 "\n"
611 "layout(binding = 0) uniform buf {\n"
612 " mat4 MVP;\n"
613 " vec4 position[3];\n"
614 " vec4 color[3];\n"
615 "} ubuf;\n"
616 "\n"
617 "layout (location = 0) out vec4 outColor;\n"
618 "\n"
619 "void main() \n"
620 "{\n"
621 " outColor = ubuf.color[gl_VertexID];\n"
622 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
623 "}\n";
624
625 static const char *fragShaderText =
626 "#version 140\n"
627 "#extension GL_ARB_separate_shader_objects : enable\n"
628 "#extension GL_ARB_shading_language_420pack : enable\n"
629 "\n"
630 "layout (location = 0) in vec4 inColor;\n"
631 "\n"
632 "void main()\n"
633 "{\n"
634 " gl_FragColor = inColor;\n"
635 "}\n";
636
637 TEST_DESCRIPTION("XGL-style shaders, but force test framework to compile shader to BIL and pass BIL to driver.");
638
639 XglTestFramework::m_use_bil = true;
640
Tony Barbourae442072015-01-12 13:27:11 -0700641 XGLTriangleTest(vertShaderText, fragShaderText, true);
Tony Barbourf43b6982014-11-25 13:18:32 -0700642
643 XglTestFramework::m_use_bil = saved_use_bil;
644}
645
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -0600646TEST_F(XglRenderTest, GreenTriangle)
Cody Northrop5b7d85a2014-10-09 21:26:47 -0600647{
648 static const char *vertShaderText =
649 "#version 130\n"
650 "vec2 vertices[3];\n"
651 "void main() {\n"
652 " vertices[0] = vec2(-1.0, -1.0);\n"
653 " vertices[1] = vec2( 1.0, -1.0);\n"
654 " vertices[2] = vec2( 0.0, 1.0);\n"
655 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
656 "}\n";
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600657
Cody Northrop5b7d85a2014-10-09 21:26:47 -0600658 static const char *fragShaderText =
659 "#version 130\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -0600660 "void main() {\n"
Steve K10b32512014-10-10 08:54:29 -0600661 " gl_FragColor = vec4(0,1,0,1);\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -0600662 "}\n";
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600663
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -0600664 TEST_DESCRIPTION("Basic shader that renders a fixed Green triangle coded as part of the vertex shader.");
665
Tony Barbourae442072015-01-12 13:27:11 -0700666 XGLTriangleTest(vertShaderText, fragShaderText, false);
Cody Northrop5b7d85a2014-10-09 21:26:47 -0600667}
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600668
Tony Barbourf43b6982014-11-25 13:18:32 -0700669TEST_F(XglRenderTest, BIL_GreenTriangle)
670{
671 bool saved_use_bil = XglTestFramework::m_use_bil;
672
673 static const char *vertShaderText =
674 "#version 130\n"
675 "vec2 vertices[3];\n"
676 "void main() {\n"
677 " vertices[0] = vec2(-1.0, -1.0);\n"
678 " vertices[1] = vec2( 1.0, -1.0);\n"
679 " vertices[2] = vec2( 0.0, 1.0);\n"
680 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
681 "}\n";
682
683 static const char *fragShaderText =
684 "#version 130\n"
685 "void main() {\n"
686 " gl_FragColor = vec4(0,1,0,1);\n"
687 "}\n";
688
689 TEST_DESCRIPTION("Same shader as GreenTriangle, but compiles shader to BIL and gives BIL to driver.");
690
691 XglTestFramework::m_use_bil = true;
Tony Barbourae442072015-01-12 13:27:11 -0700692 XGLTriangleTest(vertShaderText, fragShaderText, false);
Tony Barbourf43b6982014-11-25 13:18:32 -0700693 XglTestFramework::m_use_bil = saved_use_bil;
694}
695
696TEST_F(XglRenderTest, YellowTriangle)
697{
698 static const char *vertShaderText =
699 "#version 130\n"
700 "void main() {\n"
701 " vec2 vertices[3];"
702 " vertices[0] = vec2(-0.5, -0.5);\n"
703 " vertices[1] = vec2( 0.5, -0.5);\n"
704 " vertices[2] = vec2( 0.5, 0.5);\n"
705 " vec4 colors[3];\n"
706 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
707 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
708 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
709 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
710 "}\n";
711
712 static const char *fragShaderText =
713 "#version 130\n"
714 "void main() {\n"
715 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
716 "}\n";
717
Tony Barbourae442072015-01-12 13:27:11 -0700718 XGLTriangleTest(vertShaderText, fragShaderText, false);
Tony Barbourf43b6982014-11-25 13:18:32 -0700719}
720
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -0600721TEST_F(XglRenderTest, TriangleWithVertexFetch)
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600722{
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600723 static const char *vertShaderText =
Tony Barbourf43b6982014-11-25 13:18:32 -0700724 "#version 130\n"
725 //XYZ1( -1, -1, -1 )
726 "in vec4 pos;\n"
727 //XYZ1( 0.f, 0.f, 0.f )
728 "in vec4 inColor;\n"
729 "out vec4 outColor;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600730 "void main() {\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -0600731 " outColor = inColor;\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -0600732 " gl_Position = pos;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600733 "}\n";
734
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600735
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600736 static const char *fragShaderText =
Cody Northrop68a10f62014-12-05 15:44:14 -0700737 "#version 140\n"
738 "#extension GL_ARB_separate_shader_objects : enable\n"
739 "#extension GL_ARB_shading_language_420pack : enable\n"
Tony Barbourf43b6982014-11-25 13:18:32 -0700740 "in vec4 color;\n"
Cody Northrop68a10f62014-12-05 15:44:14 -0700741 "layout (location = 0) out vec4 outColor;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600742 "void main() {\n"
Cody Northrop68a10f62014-12-05 15:44:14 -0700743 " outColor = color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600744 "}\n";
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -0600745
Tony Barbourf43b6982014-11-25 13:18:32 -0700746
747
748 ASSERT_NO_FATAL_FAILURE(InitState());
749 ASSERT_NO_FATAL_FAILURE(InitViewport());
750
751 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -0700752 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Tony Barbourf43b6982014-11-25 13:18:32 -0700753
754 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
755 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
756
757 XglPipelineObj pipelineobj(m_device);
758 pipelineobj.AddShader(&vs);
759 pipelineobj.AddShader(&ps);
760
761 XglDescriptorSetObj descriptorSet(m_device);
762 descriptorSet.AttachMemoryView(&meshBuffer);
763
764 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
765 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
766 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
767 };
768
769 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
770 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
771 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
772 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
773 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
774 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
775 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
776 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
777 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
778
779 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
780 pipelineobj.AddVertexInputBindings(&vi_binding,1);
781 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
782
Tony Barboure4ed9942015-01-09 10:06:53 -0700783 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
784 XglCommandBufferObj cmdBuffer(m_device);
785 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -0700786
Tony Barboure4ed9942015-01-09 10:06:53 -0700787 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
788 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
789
Tony Barboure4ed9942015-01-09 10:06:53 -0700790 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
791
792 // render two triangles
793 cmdBuffer.Draw(0, 6, 0, 1);
794
795 // finalize recording of the command buffer
796 cmdBuffer.EndCommandBuffer();
797 cmdBuffer.QueueCommandBuffer(NULL, 0);
798
799 for (int i = 0; i < m_renderTargetCount; i++)
800 RecordImage(m_renderTargets[i]);
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600801}
802
Chia-I Wue09d1a72014-12-05 10:32:23 +0800803TEST_F(XglRenderTest, TriangleMRT)
804{
805 static const char *vertShaderText =
806 "#version 130\n"
807 "in vec4 pos;\n"
808 "void main() {\n"
809 " gl_Position = pos;\n"
810 "}\n";
811
812 static const char *fragShaderText =
813 "#version 130\n"
814 "void main() {\n"
815 " gl_FragData[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
816 " gl_FragData[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
817 "}\n";
818 const XGL_FLOAT vb_data[][2] = {
819 { -1.0f, -1.0f },
820 { 1.0f, -1.0f },
821 { -1.0f, 1.0f }
822 };
823
824 ASSERT_NO_FATAL_FAILURE(InitState());
825 ASSERT_NO_FATAL_FAILURE(InitViewport());
826
827 XglConstantBufferObj meshBuffer(m_device, sizeof(vb_data) / sizeof(vb_data[0]), sizeof(vb_data[0]), vb_data);
Tony Barboure6152042014-12-10 17:40:15 -0700828 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Chia-I Wue09d1a72014-12-05 10:32:23 +0800829
830 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
831 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
832
833 XglPipelineObj pipelineobj(m_device);
834 pipelineobj.AddShader(&vs);
835 pipelineobj.AddShader(&ps);
836
837 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
838 sizeof(vb_data[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
839 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
840 };
841
842 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attrib;
843 vi_attrib.binding = 0; // index into vertexBindingDescriptions
844 vi_attrib.format.channelFormat = XGL_CH_FMT_R32G32; // format of source data
845 vi_attrib.format.numericFormat = XGL_NUM_FMT_FLOAT;
846 vi_attrib.offsetInBytes = 0; // Offset of first element in bytes from base of vertex
847
848 pipelineobj.AddVertexInputAttribs(&vi_attrib, 1);
849 pipelineobj.AddVertexInputBindings(&vi_binding,1);
850 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
851
852 XglDescriptorSetObj descriptorSet(m_device);
853
854 m_renderTargetCount = 2;
Tony Barboure4ed9942015-01-09 10:06:53 -0700855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wue09d1a72014-12-05 10:32:23 +0800856
857 XGL_PIPELINE_CB_ATTACHMENT_STATE att = {};
858 att.blendEnable = XGL_FALSE;
859 att.format = m_render_target_fmt;
860 att.channelWriteMask = 0xf;
861 pipelineobj.SetColorAttachment(1, &att);
862
Tony Barbour5ed79702015-01-07 14:31:52 -0700863 XglCommandBufferObj cmdBuffer(m_device);
Tony Barboure4ed9942015-01-09 10:06:53 -0700864
Tony Barbour5ed79702015-01-07 14:31:52 -0700865 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
866 cmdBuffer.AddRenderTarget(m_renderTargets[1]);
Tony Barboure4ed9942015-01-09 10:06:53 -0700867
Tony Barbour5ed79702015-01-07 14:31:52 -0700868 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
Tony Barbour5ed79702015-01-07 14:31:52 -0700869
Tony Barboure4ed9942015-01-09 10:06:53 -0700870 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
871
Tony Barbour5ed79702015-01-07 14:31:52 -0700872 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
Tony Barbour5ed79702015-01-07 14:31:52 -0700873#ifdef DUMP_STATE_DOT
874 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
875 pDSDumpDot((char*)"triTest2.dot");
876#endif
877 // render triangle
878 cmdBuffer.Draw(0, 3, 0, 1);
879
880 // finalize recording of the command buffer
881 cmdBuffer.EndCommandBuffer();
882 cmdBuffer.QueueCommandBuffer(NULL, 0);
883
884 for (int i = 0; i < m_renderTargetCount; i++)
885 RecordImage(m_renderTargets[i]);
886
Chia-I Wue09d1a72014-12-05 10:32:23 +0800887}
888
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700889TEST_F(XglRenderTest, QuadWithIndexedVertexFetch)
890{
891 static const char *vertShaderText =
892 "#version 140\n"
893 "#extension GL_ARB_separate_shader_objects : enable\n"
894 "#extension GL_ARB_shading_language_420pack : enable\n"
895 "layout(location = 0) in vec4 pos;\n"
896 "layout(location = 1) in vec4 inColor;\n"
897 "layout(location = 0) out vec4 outColor;\n"
898 "void main() {\n"
899 " outColor = inColor;\n"
900 " gl_Position = pos;\n"
901 "}\n";
902
903
904 static const char *fragShaderText =
905 "#version 140\n"
906 "#extension GL_ARB_separate_shader_objects : enable\n"
907 "#extension GL_ARB_shading_language_420pack : enable\n"
908 "layout(location = 0) in vec4 color;\n"
909 "void main() {\n"
910 " gl_FragColor = color;\n"
911 "}\n";
912
913 const Vertex g_vbData[] =
914 {
915 // first tri
916 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) }, // LL: black
917 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) }, // LR: red
918 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) }, // UL: green
919
920 // second tri
921 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) }, // UL: green
922 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) }, // LR: red
923 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) }, // UR: yellow
924 };
925
926 const uint16_t g_idxData[6] = {
927 0, 1, 2,
928 3, 4, 5,
929 };
930
931 ASSERT_NO_FATAL_FAILURE(InitState());
932 ASSERT_NO_FATAL_FAILURE(InitViewport());
933
934 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -0700935 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700936
937 XglIndexBufferObj indexBuffer(m_device);
938 indexBuffer.CreateAndInitBuffer(sizeof(g_idxData)/sizeof(g_idxData[0]), XGL_INDEX_16, g_idxData);
Tony Barboure6152042014-12-10 17:40:15 -0700939 indexBuffer.SetMemoryState(XGL_MEMORY_STATE_INDEX_DATA);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700940
941 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
942 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
943
944 XglPipelineObj pipelineobj(m_device);
945 pipelineobj.AddShader(&vs);
946 pipelineobj.AddShader(&ps);
947
948 XglDescriptorSetObj descriptorSet(m_device);
949
950 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
951 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
952 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
953 };
954
955 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
956 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
957 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
958 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
959 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
960 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
961 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
962 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
963 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
964
965 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
966 pipelineobj.AddVertexInputBindings(&vi_binding,1);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700967
968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourde9cf2e2014-12-17 11:16:05 -0700969 XglCommandBufferObj cmdBuffer(m_device);
970 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
971 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
Tony Barboure4ed9942015-01-09 10:06:53 -0700972
973 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700974
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700975#ifdef DUMP_STATE_DOT
976 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
Tobin Ehlis266473d2014-12-16 17:34:50 -0700977 pDSDumpDot((char*)"triTest2.dot");
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700978#endif
Tony Barbour02472db2015-01-08 17:08:28 -0700979
Tony Barbourde9cf2e2014-12-17 11:16:05 -0700980 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
981 cmdBuffer.BindIndexBuffer(&indexBuffer,0);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700982
983 // render two triangles
Tony Barbourde9cf2e2014-12-17 11:16:05 -0700984 cmdBuffer.DrawIndexed(0, 6, 0, 0, 1);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700985
986 // finalize recording of the command buffer
Tony Barbourde9cf2e2014-12-17 11:16:05 -0700987 cmdBuffer.EndCommandBuffer();
988 cmdBuffer.QueueCommandBuffer(NULL, 0);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700989
Tony Barbourde9cf2e2014-12-17 11:16:05 -0700990 for (int i = 0; i < m_renderTargetCount; i++)
991 RecordImage(m_renderTargets[i]);
Courtney Goeltzenleuchter4d6fbeb2014-12-04 15:45:16 -0700992
993}
994
GregF6bef1212014-12-02 15:41:44 -0700995TEST_F(XglRenderTest, GreyandRedCirclesonBlue)
996{
997 // This tests gl_FragCoord
Tony Barbourf43b6982014-11-25 13:18:32 -0700998
GregF6bef1212014-12-02 15:41:44 -0700999 static const char *vertShaderText =
1000 "#version 140\n"
1001 "#extension GL_ARB_separate_shader_objects : enable\n"
1002 "#extension GL_ARB_shading_language_420pack : enable\n"
1003 "layout (location = 0) in vec4 pos;\n"
1004 "layout (location = 0) out vec4 outColor;\n"
1005 "layout (location = 1) out vec4 outColor2;\n"
1006 "void main() {\n"
1007 " gl_Position = pos;\n"
1008 " outColor = vec4(0.9, 0.9, 0.9, 1.0);\n"
1009 " outColor2 = vec4(0.2, 0.2, 0.4, 1.0);\n"
1010 "}\n";
1011
1012 static const char *fragShaderText =
1013 //"#version 140\n"
1014 "#version 330\n"
1015 "#extension GL_ARB_separate_shader_objects : enable\n"
1016 "#extension GL_ARB_shading_language_420pack : enable\n"
1017 //"#extension GL_ARB_fragment_coord_conventions : enable\n"
1018 //"layout (pixel_center_integer) in vec4 gl_FragCoord;\n"
1019 "layout (location = 0) in vec4 color;\n"
1020 "layout (location = 1) in vec4 color2;\n"
1021 "void main() {\n"
1022 " vec2 pos = mod(gl_FragCoord.xy, vec2(50.0)) - vec2(25.0);\n"
1023 " float dist_squared = dot(pos, pos);\n"
1024 " gl_FragColor = (dist_squared < 400.0)\n"
1025 " ? ((gl_FragCoord.y < 100.0) ? vec4(1.0, 0.0, 0.0, 0.0) : color)\n"
1026 " : color2;\n"
1027 "}\n";
1028
1029 ASSERT_NO_FATAL_FAILURE(InitState());
1030 ASSERT_NO_FATAL_FAILURE(InitViewport());
1031
1032 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001033 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
GregF6bef1212014-12-02 15:41:44 -07001034
1035 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1036 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1037
1038 XglPipelineObj pipelineobj(m_device);
1039 pipelineobj.AddShader(&vs);
1040 pipelineobj.AddShader(&ps);
1041
1042 XglDescriptorSetObj descriptorSet(m_device);
1043 descriptorSet.AttachMemoryView(&meshBuffer);
1044
1045 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1046 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1047 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1048 };
1049
1050 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1051 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1052 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1053 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1054 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1055 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1056 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1057 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1058 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1059
1060 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1061 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1062 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1063
Tony Barbourdd4c9642015-01-09 12:55:14 -07001064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1065 XglCommandBufferObj cmdBuffer(m_device);
1066 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1067
1068 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1069
1070 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1071
1072 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1073#ifdef DUMP_STATE_DOT
1074 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1075 pDSDumpDot((char*)"triTest2.dot");
1076#endif
1077 // render triangle
1078 cmdBuffer.Draw(0, 6, 0, 1);
1079
1080 // finalize recording of the command buffer
1081 cmdBuffer.EndCommandBuffer();
1082 cmdBuffer.QueueCommandBuffer(NULL, 0);
1083
1084 for (int i = 0; i < m_renderTargetCount; i++)
1085 RecordImage(m_renderTargets[i]);
GregF6bef1212014-12-02 15:41:44 -07001086
1087}
1088
1089TEST_F(XglRenderTest, RedCirclesonBlue)
1090{
1091 // This tests that we correctly handle unread fragment inputs
1092
1093 static const char *vertShaderText =
1094 "#version 140\n"
1095 "#extension GL_ARB_separate_shader_objects : enable\n"
1096 "#extension GL_ARB_shading_language_420pack : enable\n"
1097 "layout (location = 0) in vec4 pos;\n"
1098 "layout (location = 0) out vec4 outColor;\n"
1099 "layout (location = 1) out vec4 outColor2;\n"
1100 "void main() {\n"
1101 " gl_Position = pos;\n"
1102 " outColor = vec4(0.9, 0.9, 0.9, 1.0);\n"
1103 " outColor2 = vec4(0.2, 0.2, 0.4, 1.0);\n"
1104 "}\n";
1105
1106 static const char *fragShaderText =
1107 //"#version 140\n"
1108 "#version 330\n"
1109 "#extension GL_ARB_separate_shader_objects : enable\n"
1110 "#extension GL_ARB_shading_language_420pack : enable\n"
1111 //"#extension GL_ARB_fragment_coord_conventions : enable\n"
1112 //"layout (pixel_center_integer) in vec4 gl_FragCoord;\n"
1113 "layout (location = 0) in vec4 color;\n"
1114 "layout (location = 1) in vec4 color2;\n"
1115 "void main() {\n"
1116 " vec2 pos = mod(gl_FragCoord.xy, vec2(50.0)) - vec2(25.0);\n"
1117 " float dist_squared = dot(pos, pos);\n"
1118 " gl_FragColor = (dist_squared < 400.0)\n"
1119 " ? vec4(1.0, 0.0, 0.0, 1.0)\n"
1120 " : color2;\n"
1121 "}\n";
1122
1123 ASSERT_NO_FATAL_FAILURE(InitState());
1124 ASSERT_NO_FATAL_FAILURE(InitViewport());
1125
1126 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001127 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
GregF6bef1212014-12-02 15:41:44 -07001128
1129 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1130 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1131
1132 XglPipelineObj pipelineobj(m_device);
1133 pipelineobj.AddShader(&vs);
1134 pipelineobj.AddShader(&ps);
1135
1136 XglDescriptorSetObj descriptorSet(m_device);
1137 descriptorSet.AttachMemoryView(&meshBuffer);
1138
1139 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1140 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1141 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1142 };
1143
1144 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1145 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1146 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1147 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1148 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1149 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1150 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1151 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1152 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1153
1154 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1155 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1156 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1157
Tony Barbourdd4c9642015-01-09 12:55:14 -07001158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1159 XglCommandBufferObj cmdBuffer(m_device);
1160 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1161
1162 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1163
1164 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1165
1166 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1167#ifdef DUMP_STATE_DOT
1168 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1169 pDSDumpDot((char*)"triTest2.dot");
1170#endif
1171 // render triangle
1172 cmdBuffer.Draw(0, 6, 0, 1);
1173
1174 // finalize recording of the command buffer
1175 cmdBuffer.EndCommandBuffer();
1176 cmdBuffer.QueueCommandBuffer(NULL, 0);
1177
1178 for (int i = 0; i < m_renderTargetCount; i++)
1179 RecordImage(m_renderTargets[i]);
GregF6bef1212014-12-02 15:41:44 -07001180
1181}
1182
1183TEST_F(XglRenderTest, GreyCirclesonBlueFade)
1184{
1185 // This tests reading gl_ClipDistance from FS
1186
1187 static const char *vertShaderText =
1188 "#version 330\n"
1189 "#extension GL_ARB_separate_shader_objects : enable\n"
1190 "#extension GL_ARB_shading_language_420pack : enable\n"
1191 "out gl_PerVertex {\n"
1192 " vec4 gl_Position;\n"
1193 " float gl_ClipDistance[1];\n"
1194 "};\n"
1195 "layout (location = 0) in vec4 pos;\n"
1196 "layout (location = 0) out vec4 outColor;\n"
1197 "layout (location = 1) out vec4 outColor2;\n"
1198 "void main() {\n"
1199 " gl_Position = pos;\n"
1200 " outColor = vec4(0.9, 0.9, 0.9, 1.0);\n"
1201 " outColor2 = vec4(0.2, 0.2, 0.4, 1.0);\n"
1202 " float dists[3];\n"
1203 " dists[0] = 0.0;\n"
1204 " dists[1] = 1.0;\n"
1205 " dists[2] = 1.0;\n"
1206 " gl_ClipDistance[0] = dists[gl_VertexID % 3];\n"
1207 "}\n";
1208
1209
1210 static const char *fragShaderText =
1211 //"#version 140\n"
1212 "#version 330\n"
1213 "#extension GL_ARB_separate_shader_objects : enable\n"
1214 "#extension GL_ARB_shading_language_420pack : enable\n"
1215 //"#extension GL_ARB_fragment_coord_conventions : enable\n"
1216 //"layout (pixel_center_integer) in vec4 gl_FragCoord;\n"
1217 "layout (location = 0) in vec4 color;\n"
1218 "layout (location = 1) in vec4 color2;\n"
1219 "void main() {\n"
1220 " vec2 pos = mod(gl_FragCoord.xy, vec2(50.0)) - vec2(25.0);\n"
1221 " float dist_squared = dot(pos, pos);\n"
1222 " gl_FragColor = (dist_squared < 400.0)\n"
1223 " ? color * gl_ClipDistance[0]\n"
1224 " : color2;\n"
1225 "}\n";
1226
1227 ASSERT_NO_FATAL_FAILURE(InitState());
1228 ASSERT_NO_FATAL_FAILURE(InitViewport());
1229
1230 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001231 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
GregF6bef1212014-12-02 15:41:44 -07001232
1233 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1234 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1235
1236 XglPipelineObj pipelineobj(m_device);
1237 pipelineobj.AddShader(&vs);
1238 pipelineobj.AddShader(&ps);
1239
1240 XglDescriptorSetObj descriptorSet(m_device);
1241 descriptorSet.AttachMemoryView(&meshBuffer);
1242
1243 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1244 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1245 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1246 };
1247
1248 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1249 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1250 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1251 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1252 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1253 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1254 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1255 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1256 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1257
1258 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1259 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1260 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1261
Tony Barbourdd4c9642015-01-09 12:55:14 -07001262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263 XglCommandBufferObj cmdBuffer(m_device);
1264 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
GregF6bef1212014-12-02 15:41:44 -07001265
Tony Barbourdd4c9642015-01-09 12:55:14 -07001266 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1267
1268 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1269
1270 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1271#ifdef DUMP_STATE_DOT
1272 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1273 pDSDumpDot((char*)"triTest2.dot");
1274#endif
1275 // render triangle
1276 cmdBuffer.Draw(0, 6, 0, 1);
1277
1278 // finalize recording of the command buffer
1279 cmdBuffer.EndCommandBuffer();
1280 cmdBuffer.QueueCommandBuffer(NULL, 0);
1281
1282 for (int i = 0; i < m_renderTargetCount; i++)
1283 RecordImage(m_renderTargets[i]);
GregF6bef1212014-12-02 15:41:44 -07001284}
Tony Barbourf43b6982014-11-25 13:18:32 -07001285
GregF7a23c792014-12-02 17:19:34 -07001286TEST_F(XglRenderTest, GreyCirclesonBlueDiscard)
1287{
1288 static const char *vertShaderText =
1289 "#version 140\n"
1290 "#extension GL_ARB_separate_shader_objects : enable\n"
1291 "#extension GL_ARB_shading_language_420pack : enable\n"
1292 "layout (location = 0) in vec4 pos;\n"
1293 "layout (location = 0) out vec4 outColor;\n"
1294 "layout (location = 1) out vec4 outColor2;\n"
1295 "void main() {\n"
1296 " gl_Position = pos;\n"
1297 " outColor = vec4(0.9, 0.9, 0.9, 1.0);\n"
1298 " outColor2 = vec4(0.2, 0.2, 0.4, 1.0);\n"
1299 "}\n";
1300
1301
1302 static const char *fragShaderText =
1303 //"#version 140\n"
1304 "#version 330\n"
1305 "#extension GL_ARB_separate_shader_objects : enable\n"
1306 "#extension GL_ARB_shading_language_420pack : enable\n"
1307 //"#extension GL_ARB_fragment_coord_conventions : enable\n"
1308 //"layout (pixel_center_integer) in vec4 gl_FragCoord;\n"
1309 "layout (location = 0) in vec4 color;\n"
1310 "layout (location = 1) in vec4 color2;\n"
1311 "void main() {\n"
1312 " vec2 pos = mod(gl_FragCoord.xy, vec2(50.0)) - vec2(25.0);\n"
1313 " float dist_squared = dot(pos, pos);\n"
1314 " if (dist_squared < 100.0)\n"
1315 " discard;\n"
1316 " gl_FragColor = (dist_squared < 400.0)\n"
1317 " ? color\n"
1318 " : color2;\n"
1319 "}\n";
1320
1321 ASSERT_NO_FATAL_FAILURE(InitState());
1322 ASSERT_NO_FATAL_FAILURE(InitViewport());
1323
1324 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001325 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
GregF7a23c792014-12-02 17:19:34 -07001326
1327 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1328 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1329
1330 XglPipelineObj pipelineobj(m_device);
1331 pipelineobj.AddShader(&vs);
1332 pipelineobj.AddShader(&ps);
1333
1334 XglDescriptorSetObj descriptorSet(m_device);
1335 descriptorSet.AttachMemoryView(&meshBuffer);
1336
1337 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1338 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1339 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1340 };
1341
1342 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1343 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1344 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1345 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1346 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1347 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1348 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1349 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1350 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1351
1352 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1353 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1354 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1355
Tony Barbourdd4c9642015-01-09 12:55:14 -07001356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1357 XglCommandBufferObj cmdBuffer(m_device);
1358 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1359
1360 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1361
1362 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1363
1364 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1365#ifdef DUMP_STATE_DOT
1366 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1367 pDSDumpDot((char*)"triTest2.dot");
1368#endif
1369 // render triangle
1370 cmdBuffer.Draw(0, 6, 0, 1);
1371
1372 // finalize recording of the command buffer
1373 cmdBuffer.EndCommandBuffer();
1374 cmdBuffer.QueueCommandBuffer(NULL, 0);
1375
1376 for (int i = 0; i < m_renderTargetCount; i++)
1377 RecordImage(m_renderTargets[i]);
GregF7a23c792014-12-02 17:19:34 -07001378
1379}
1380
1381
Courtney Goeltzenleuchter3d10c9c2014-10-27 13:06:08 -06001382TEST_F(XglRenderTest, TriangleVSUniform)
Cody Northrop7a1f0462014-10-10 14:49:36 -06001383{
1384 static const char *vertShaderText =
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001385 "#version 140\n"
1386 "#extension GL_ARB_separate_shader_objects : enable\n"
1387 "#extension GL_ARB_shading_language_420pack : enable\n"
1388 "\n"
1389 "layout(binding = 0) uniform buf {\n"
1390 " mat4 MVP;\n"
1391 "} ubuf;\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001392 "void main() {\n"
1393 " vec2 vertices[3];"
1394 " vertices[0] = vec2(-0.5, -0.5);\n"
1395 " vertices[1] = vec2( 0.5, -0.5);\n"
1396 " vertices[2] = vec2( 0.5, 0.5);\n"
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001397 " gl_Position = ubuf.MVP * vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001398 "}\n";
1399
1400 static const char *fragShaderText =
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001401 "#version 130\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001402 "void main() {\n"
Cody Northrop78eac042014-10-10 15:45:00 -06001403 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001404 "}\n";
1405
Tony Barbourf43b6982014-11-25 13:18:32 -07001406 ASSERT_NO_FATAL_FAILURE(InitState());
1407 ASSERT_NO_FATAL_FAILURE(InitViewport());
1408
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -06001409 // Create identity matrix
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001410 glm::mat4 Projection = glm::mat4(1.0f);
1411 glm::mat4 View = glm::mat4(1.0f);
1412 glm::mat4 Model = glm::mat4(1.0f);
1413 glm::mat4 MVP = Projection * View * Model;
1414 const int matrixSize = sizeof(MVP) / sizeof(MVP[0]);
1415
Tony Barbourf43b6982014-11-25 13:18:32 -07001416 XglConstantBufferObj MVPBuffer(m_device, matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
1417 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1418 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001419
Tony Barbourf43b6982014-11-25 13:18:32 -07001420 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &MVPBuffer);
1421
1422 XglPipelineObj pipelineobj(m_device);
1423 pipelineobj.AddShader(&vs);
1424 pipelineobj.AddShader(&ps);
1425
1426 // Create descriptor set and attach the constant buffer to it
1427 XglDescriptorSetObj descriptorSet(m_device);
1428 descriptorSet.AttachMemoryView(&MVPBuffer);
1429
1430 m_memoryRefManager.AddMemoryRef(&MVPBuffer);
1431
Tony Barbourdd4c9642015-01-09 12:55:14 -07001432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1433 XglCommandBufferObj cmdBuffer(m_device);
1434 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001435
Tony Barbourdd4c9642015-01-09 12:55:14 -07001436 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1437
1438 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1439
1440 // cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1441#ifdef DUMP_STATE_DOT
1442 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1443 pDSDumpDot((char*)"triTest2.dot");
1444#endif
1445 // render triangle
1446 cmdBuffer.Draw(0, 6, 0, 1);
1447
1448 // finalize recording of the command buffer
1449 cmdBuffer.EndCommandBuffer();
1450 cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
1451
1452 for (int i = 0; i < m_renderTargetCount; i++)
1453 RecordImage(m_renderTargets[i]);
1454
1455 RotateTriangleVSUniform(Projection, View, Model, &MVPBuffer, &cmdBuffer);
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001456}
1457
Tony Barbourf43b6982014-11-25 13:18:32 -07001458TEST_F(XglRenderTest, MixTriangle)
1459{
1460 // This tests location applied to varyings. Notice that we have switched foo
1461 // and bar in the FS. The triangle should be blended with red, green and blue
1462 // corners.
1463 static const char *vertShaderText =
1464 "#version 140\n"
1465 "#extension GL_ARB_separate_shader_objects : enable\n"
1466 "#extension GL_ARB_shading_language_420pack : enable\n"
1467 "layout (location=0) out vec4 bar;\n"
1468 "layout (location=1) out vec4 foo;\n"
1469 "layout (location=2) out float scale;\n"
1470 "vec2 vertices[3];\n"
1471 "void main() {\n"
1472 " vertices[0] = vec2(-1.0, -1.0);\n"
1473 " vertices[1] = vec2( 1.0, -1.0);\n"
1474 " vertices[2] = vec2( 0.0, 1.0);\n"
1475 "vec4 colors[3];\n"
1476 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1477 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1478 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1479 " foo = colors[gl_VertexID % 3];\n"
1480 " bar = vec4(1.0, 1.0, 1.0, 1.0);\n"
1481 " scale = 1.0;\n"
1482 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1483 "}\n";
1484
1485 static const char *fragShaderText =
1486 "#version 140\n"
1487 "#extension GL_ARB_separate_shader_objects : enable\n"
1488 "#extension GL_ARB_shading_language_420pack : enable\n"
1489 "layout (location = 1) in vec4 bar;\n"
1490 "layout (location = 0) in vec4 foo;\n"
1491 "layout (location = 2) in float scale;\n"
1492 "void main() {\n"
1493 " gl_FragColor = bar * scale + foo * (1.0-scale);\n"
1494 "}\n";
1495
1496 ASSERT_NO_FATAL_FAILURE(InitState());
1497 ASSERT_NO_FATAL_FAILURE(InitViewport());
1498
1499 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1500 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1501
1502 XglPipelineObj pipelineobj(m_device);
1503 pipelineobj.AddShader(&vs);
1504 pipelineobj.AddShader(&ps);
1505
1506 XglDescriptorSetObj descriptorSet(m_device);
1507
Tony Barbourdd4c9642015-01-09 12:55:14 -07001508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1509 XglCommandBufferObj cmdBuffer(m_device);
1510 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1511
1512 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1513
1514 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1515
1516#ifdef DUMP_STATE_DOT
1517 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1518 pDSDumpDot((char*)"triTest2.dot");
1519#endif
1520 // render triangle
1521 cmdBuffer.Draw(0, 3, 0, 1);
1522
1523 // finalize recording of the command buffer
1524 cmdBuffer.EndCommandBuffer();
1525 cmdBuffer.QueueCommandBuffer(NULL, 0);
1526
1527 for (int i = 0; i < m_renderTargetCount; i++)
1528 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001529}
1530
1531TEST_F(XglRenderTest, TriVertFetchAndVertID)
1532{
1533 // This tests that attributes work in the presence of gl_VertexID
1534
1535 static const char *vertShaderText =
1536 "#version 140\n"
1537 "#extension GL_ARB_separate_shader_objects : enable\n"
1538 "#extension GL_ARB_shading_language_420pack : enable\n"
1539 //XYZ1( -1, -1, -1 )
1540 "layout (location = 0) in vec4 pos;\n"
1541 //XYZ1( 0.f, 0.f, 0.f )
1542 "layout (location = 1) in vec4 inColor;\n"
1543 "layout (location = 0) out vec4 outColor;\n"
1544 "void main() {\n"
1545 " outColor = inColor;\n"
1546 " vec4 vertices[3];"
1547 " vertices[gl_VertexID % 3] = pos;\n"
1548 " gl_Position = vertices[(gl_VertexID + 3) % 3];\n"
1549 "}\n";
1550
1551
1552 static const char *fragShaderText =
1553 "#version 140\n"
1554 "#extension GL_ARB_separate_shader_objects : enable\n"
1555 "#extension GL_ARB_shading_language_420pack : enable\n"
1556 "layout (location = 0) in vec4 color;\n"
1557 "void main() {\n"
1558 " gl_FragColor = color;\n"
1559 "}\n";
1560
1561 ASSERT_NO_FATAL_FAILURE(InitState());
1562 ASSERT_NO_FATAL_FAILURE(InitViewport());
1563
1564 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001565 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Tony Barbourf43b6982014-11-25 13:18:32 -07001566
1567 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1568 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1569
1570 XglPipelineObj pipelineobj(m_device);
1571 pipelineobj.AddShader(&vs);
1572 pipelineobj.AddShader(&ps);
1573
1574 XglDescriptorSetObj descriptorSet(m_device);
1575 descriptorSet.AttachMemoryView(&meshBuffer);
1576
1577 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1578 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1579 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1580 };
1581
1582 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1583 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1584 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1585 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1586 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1587 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1588 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1589 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1590 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1591
1592 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1593 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1594 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1595
Tony Barbourdd4c9642015-01-09 12:55:14 -07001596 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1597 XglCommandBufferObj cmdBuffer(m_device);
1598 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1599
1600 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1601
1602 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1603
1604 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1605#ifdef DUMP_STATE_DOT
1606 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1607 pDSDumpDot((char*)"triTest2.dot");
1608#endif
1609 // render triangle
1610 cmdBuffer.Draw(0, 6, 0, 1);
1611
1612 // finalize recording of the command buffer
1613 cmdBuffer.EndCommandBuffer();
1614 cmdBuffer.QueueCommandBuffer(NULL, 0);
1615
1616 for (int i = 0; i < m_renderTargetCount; i++)
1617 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001618}
1619
1620TEST_F(XglRenderTest, TriVertFetchDeadAttr)
1621{
1622 // This tests that attributes work in the presence of gl_VertexID
1623 // and a dead attribute in position 0. Draws a triangle with yellow,
1624 // red and green corners, starting at top and going clockwise.
1625
1626 static const char *vertShaderText =
1627 "#version 140\n"
1628 "#extension GL_ARB_separate_shader_objects : enable\n"
1629 "#extension GL_ARB_shading_language_420pack : enable\n"
1630 //XYZ1( -1, -1, -1 )
1631 "layout (location = 0) in vec4 pos;\n"
1632 //XYZ1( 0.f, 0.f, 0.f )
1633 "layout (location = 1) in vec4 inColor;\n"
1634 "layout (location = 0) out vec4 outColor;\n"
1635 "void main() {\n"
1636 " outColor = inColor;\n"
1637 " vec2 vertices[3];"
1638 " vertices[0] = vec2(-1.0, -1.0);\n"
1639 " vertices[1] = vec2( 1.0, -1.0);\n"
1640 " vertices[2] = vec2( 0.0, 1.0);\n"
1641 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1642 "}\n";
1643
1644
1645 static const char *fragShaderText =
1646 "#version 140\n"
1647 "#extension GL_ARB_separate_shader_objects : enable\n"
1648 "#extension GL_ARB_shading_language_420pack : enable\n"
1649 "layout (location = 0) in vec4 color;\n"
1650 "void main() {\n"
1651 " gl_FragColor = color;\n"
1652 "}\n";
1653
1654 ASSERT_NO_FATAL_FAILURE(InitState());
1655 ASSERT_NO_FATAL_FAILURE(InitViewport());
1656
1657 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
Tony Barboure6152042014-12-10 17:40:15 -07001658 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Tony Barbourf43b6982014-11-25 13:18:32 -07001659
1660 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1661 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1662
1663 XglPipelineObj pipelineobj(m_device);
1664 pipelineobj.AddShader(&vs);
1665 pipelineobj.AddShader(&ps);
1666
1667 XglDescriptorSetObj descriptorSet(m_device);
1668 descriptorSet.AttachMemoryView(&meshBuffer);
1669
1670 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1671 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1672 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1673 };
1674
1675 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1676 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1677 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1678 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1679 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1680 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1681 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1682 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1683 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1684
1685 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1686 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1687 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1688
Tony Barbourdd4c9642015-01-09 12:55:14 -07001689 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1690 XglCommandBufferObj cmdBuffer(m_device);
1691 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001692
Tony Barbourdd4c9642015-01-09 12:55:14 -07001693 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1694
1695 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1696
1697 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1698#ifdef DUMP_STATE_DOT
1699 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1700 pDSDumpDot((char*)"triTest2.dot");
1701#endif
1702 // render triangle
1703 cmdBuffer.Draw(0, 6, 0, 1);
1704
1705 // finalize recording of the command buffer
1706 cmdBuffer.EndCommandBuffer();
1707 cmdBuffer.QueueCommandBuffer(NULL, 0);
1708
1709 for (int i = 0; i < m_renderTargetCount; i++)
1710 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001711}
1712
1713TEST_F(XglRenderTest, CubeWithVertexFetchAndMVP)
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001714{
1715 static const char *vertShaderText =
1716 "#version 140\n"
1717 "layout (std140) uniform bufferVals {\n"
1718 " mat4 mvp;\n"
1719 "} myBufferVals;\n"
1720 "in vec4 pos;\n"
1721 "in vec4 inColor;\n"
1722 "out vec4 outColor;\n"
1723 "void main() {\n"
1724 " outColor = inColor;\n"
1725 " gl_Position = myBufferVals.mvp * pos;\n"
1726 "}\n";
1727
1728 static const char *fragShaderText =
1729 "#version 130\n"
1730 "in vec4 color;\n"
1731 "void main() {\n"
1732 " gl_FragColor = color;\n"
1733 "}\n";
Tony Barbourf43b6982014-11-25 13:18:32 -07001734 glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001735
Tony Barbourf43b6982014-11-25 13:18:32 -07001736 glm::mat4 View = glm::lookAt(
1737 glm::vec3(0,3,10), // Camera is at (0,3,10), in World Space
1738 glm::vec3(0,0,0), // and looks at the origin
1739 glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
1740 );
1741
1742 glm::mat4 Model = glm::mat4(1.0f);
1743
1744 glm::mat4 MVP = Projection * View * Model;
1745
1746 ASSERT_NO_FATAL_FAILURE(InitState());
1747 ASSERT_NO_FATAL_FAILURE(InitViewport());
1748 ASSERT_NO_FATAL_FAILURE(InitDepthStencil());
1749
1750 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]),
1751 sizeof(g_vb_solid_face_colors_Data[0]), g_vb_solid_face_colors_Data);
1752
1753 const int buf_size = sizeof(MVP) / sizeof(XGL_FLOAT);
1754
1755 XglConstantBufferObj MVPBuffer(m_device, buf_size, sizeof(MVP[0]), (const void*) &MVP[0][0]);
1756 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1757 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1758
1759 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &MVPBuffer);
1760
1761 XglPipelineObj pipelineobj(m_device);
1762 pipelineobj.AddShader(&vs);
1763 pipelineobj.AddShader(&ps);
1764
1765 XglDescriptorSetObj descriptorSet(m_device);
1766 descriptorSet.AttachMemoryView(&MVPBuffer);
1767
1768 m_memoryRefManager.AddMemoryRef(&meshBuffer);
1769 m_memoryRefManager.AddMemoryRef(&MVPBuffer);
1770
1771 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1772 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1773 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1774 };
1775
1776 // this is the current description of g_vbData
1777 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1778 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1779 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1780 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1781 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1782 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1783 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1784 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1785 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1786
1787 pipelineobj.AddVertexInputBindings(&vi_binding,1);
1788 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
1789 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
1790
Tony Barboure4ed9942015-01-09 10:06:53 -07001791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1792 XglCommandBufferObj cmdBuffer(m_device);
1793 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001794
Tony Barboure4ed9942015-01-09 10:06:53 -07001795 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1796 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
Tony Barbourf43b6982014-11-25 13:18:32 -07001797
Tony Barboure4ed9942015-01-09 10:06:53 -07001798 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
1799#ifdef DUMP_STATE_DOT
1800 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1801 pDSDumpDot((char*)"triTest2.dot");
1802#endif
1803 // render triangle
1804 cmdBuffer.Draw(0, 36, 0, 1);
1805
1806 // finalize recording of the command buffer
1807 cmdBuffer.EndCommandBuffer();
Tony Barbourdd4c9642015-01-09 12:55:14 -07001808 cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
Tony Barboure4ed9942015-01-09 10:06:53 -07001809
1810 for (int i = 0; i < m_renderTargetCount; i++)
1811 RecordImage(m_renderTargets[i]);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001812}
1813
Tony Barbourf43b6982014-11-25 13:18:32 -07001814TEST_F(XglRenderTest, VSTexture)
1815{
1816 // The expected result from this test is a green and red triangle;
1817 // one red vertex on the left, two green vertices on the right.
1818 static const char *vertShaderText =
1819 "#version 130\n"
1820 "out vec4 texColor;\n"
1821 "uniform sampler2D surface;\n"
1822 "void main() {\n"
1823 " vec2 vertices[3];"
1824 " vertices[0] = vec2(-0.5, -0.5);\n"
1825 " vertices[1] = vec2( 0.5, -0.5);\n"
1826 " vertices[2] = vec2( 0.5, 0.5);\n"
1827 " vec2 positions[3];"
1828 " positions[0] = vec2( 0.0, 0.0);\n"
1829 " positions[1] = vec2( 0.25, 0.1);\n"
1830 " positions[2] = vec2( 0.1, 0.25);\n"
1831 " vec2 samplePos = positions[gl_VertexID % 3];\n"
1832 " texColor = textureLod(surface, samplePos, 0.0);\n"
1833 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1834 "}\n";
1835
1836 static const char *fragShaderText =
1837 "#version 130\n"
1838 "in vec4 texColor;\n"
1839 "void main() {\n"
1840 " gl_FragColor = texColor;\n"
1841 "}\n";
1842
1843 ASSERT_NO_FATAL_FAILURE(InitState());
1844 ASSERT_NO_FATAL_FAILURE(InitViewport());
1845
1846 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1847 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1848 XglSamplerObj sampler(m_device);
1849 XglTextureObj texture(m_device);
1850
Cody Northrop5fcacbc2014-12-09 19:08:54 -07001851 vs.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
Tony Barbourf43b6982014-11-25 13:18:32 -07001852 vs.BindShaderEntitySlotToSampler(0, &sampler);
1853
1854 XglPipelineObj pipelineobj(m_device);
1855 pipelineobj.AddShader(&vs);
1856 pipelineobj.AddShader(&ps);
1857
1858 XglDescriptorSetObj descriptorSet(m_device);
1859 descriptorSet.AttachImageView(&texture);
1860 descriptorSet.AttachSampler(&sampler);
1861
1862 m_memoryRefManager.AddMemoryRef(&texture);
1863
Tony Barbourdd4c9642015-01-09 12:55:14 -07001864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1865 XglCommandBufferObj cmdBuffer(m_device);
1866 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001867
Tony Barbourdd4c9642015-01-09 12:55:14 -07001868 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1869
1870 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1871
1872#ifdef DUMP_STATE_DOT
1873 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1874 pDSDumpDot((char*)"triTest2.dot");
1875#endif
1876 // render triangle
1877 cmdBuffer.Draw(0, 3, 0, 1);
1878
1879 // finalize recording of the command buffer
1880 cmdBuffer.EndCommandBuffer();
1881 cmdBuffer.QueueCommandBuffer(NULL, 0);
1882
1883 for (int i = 0; i < m_renderTargetCount; i++)
1884 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001885}
1886TEST_F(XglRenderTest, TexturedTriangle)
1887{
1888 // The expected result from this test is a red and green checkered triangle
1889 static const char *vertShaderText =
1890 "#version 140\n"
1891 "#extension GL_ARB_separate_shader_objects : enable\n"
1892 "#extension GL_ARB_shading_language_420pack : enable\n"
1893 "layout (location = 0) out vec2 samplePos;\n"
1894 "void main() {\n"
1895 " vec2 vertices[3];"
1896 " vertices[0] = vec2(-0.5, -0.5);\n"
1897 " vertices[1] = vec2( 0.5, -0.5);\n"
1898 " vertices[2] = vec2( 0.5, 0.5);\n"
1899 " vec2 positions[3];"
1900 " positions[0] = vec2( 0.0, 0.0);\n"
1901 " positions[1] = vec2( 1.0, 0.0);\n"
1902 " positions[2] = vec2( 1.0, 1.0);\n"
1903 " samplePos = positions[gl_VertexID % 3];\n"
1904 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1905 "}\n";
1906
1907 static const char *fragShaderText =
1908 "#version 140\n"
1909 "#extension GL_ARB_separate_shader_objects : enable\n"
1910 "#extension GL_ARB_shading_language_420pack : enable\n"
1911 "layout (location = 0) in vec2 samplePos;\n"
1912 "layout (binding = 0) uniform sampler2D surface;\n"
1913 "layout (location=0) out vec4 outColor;\n"
1914 "void main() {\n"
1915 " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
1916 " outColor = texColor;\n"
1917 "}\n";
1918
1919 ASSERT_NO_FATAL_FAILURE(InitState());
1920 ASSERT_NO_FATAL_FAILURE(InitViewport());
1921
1922 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
1923 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
1924 XglSamplerObj sampler(m_device);
1925 XglTextureObj texture(m_device);
1926
Cody Northrop5fcacbc2014-12-09 19:08:54 -07001927 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
Tony Barbourf43b6982014-11-25 13:18:32 -07001928 ps.BindShaderEntitySlotToSampler(0, &sampler);
1929
1930 XglPipelineObj pipelineobj(m_device);
1931 pipelineobj.AddShader(&vs);
1932 pipelineobj.AddShader(&ps);
1933
1934 XglDescriptorSetObj descriptorSet(m_device);
1935 descriptorSet.AttachImageView(&texture);
1936 descriptorSet.AttachSampler(&sampler);
1937
1938 m_memoryRefManager.AddMemoryRef(&texture);
1939
Tony Barbourdd4c9642015-01-09 12:55:14 -07001940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1941 XglCommandBufferObj cmdBuffer(m_device);
1942 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
1943
1944 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
1945
1946 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
1947
1948#ifdef DUMP_STATE_DOT
1949 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
1950 pDSDumpDot((char*)"triTest2.dot");
1951#endif
1952 // render triangle
1953 cmdBuffer.Draw(0, 3, 0, 1);
1954
1955 // finalize recording of the command buffer
1956 cmdBuffer.EndCommandBuffer();
1957 cmdBuffer.QueueCommandBuffer(NULL, 0);
1958
1959 for (int i = 0; i < m_renderTargetCount; i++)
1960 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07001961}
1962TEST_F(XglRenderTest, TexturedTriangleClip)
1963{
1964 // The expected result from this test is a red and green checkered triangle
1965 static const char *vertShaderText =
1966 "#version 330\n"
1967 "#extension GL_ARB_separate_shader_objects : enable\n"
1968 "#extension GL_ARB_shading_language_420pack : enable\n"
1969 "layout (location = 0) out vec2 samplePos;\n"
1970 "out gl_PerVertex {\n"
1971 " vec4 gl_Position;\n"
1972 " float gl_ClipDistance[1];\n"
1973 "};\n"
1974 "void main() {\n"
1975 " vec2 vertices[3];"
1976 " vertices[0] = vec2(-0.5, -0.5);\n"
1977 " vertices[1] = vec2( 0.5, -0.5);\n"
1978 " vertices[2] = vec2( 0.5, 0.5);\n"
1979 " vec2 positions[3];"
1980 " positions[0] = vec2( 0.0, 0.0);\n"
1981 " positions[1] = vec2( 1.0, 0.0);\n"
1982 " positions[2] = vec2( 1.0, 1.0);\n"
1983 " float dists[3];\n"
1984 " dists[0] = 1.0;\n"
1985 " dists[1] = 1.0;\n"
1986 " dists[2] = -1.0;\n"
1987 " gl_ClipDistance[0] = dists[gl_VertexID % 3];\n"
1988 " samplePos = positions[gl_VertexID % 3];\n"
1989 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1990 "}\n";
1991
1992 static const char *fragShaderText =
1993 "#version 140\n"
1994 "#extension GL_ARB_separate_shader_objects : enable\n"
1995 "#extension GL_ARB_shading_language_420pack : enable\n"
1996 "layout (location = 0) in vec2 samplePos;\n"
1997 "layout (binding = 0) uniform sampler2D surface;\n"
1998 "layout (location=0) out vec4 outColor;\n"
1999 "void main() {\n"
2000 //" vec4 texColor = textureLod(surface, samplePos, 0.0 + gl_ClipDistance[0]);\n"
2001 " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
2002 " outColor = texColor;\n"
2003 "}\n";
2004
2005
2006 ASSERT_NO_FATAL_FAILURE(InitState());
2007 ASSERT_NO_FATAL_FAILURE(InitViewport());
2008
2009 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2010 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2011 XglSamplerObj sampler(m_device);
2012 XglTextureObj texture(m_device);
2013
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002014 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
Tony Barbourf43b6982014-11-25 13:18:32 -07002015 ps.BindShaderEntitySlotToSampler(0, &sampler);
2016
2017 XglPipelineObj pipelineobj(m_device);
2018 pipelineobj.AddShader(&vs);
2019 pipelineobj.AddShader(&ps);
2020
2021 XglDescriptorSetObj descriptorSet(m_device);
2022 descriptorSet.AttachImageView(&texture);
2023 descriptorSet.AttachSampler(&sampler);
2024
2025 m_memoryRefManager.AddMemoryRef(&texture);
2026
Tony Barbourdd4c9642015-01-09 12:55:14 -07002027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2028 XglCommandBufferObj cmdBuffer(m_device);
2029 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2030
2031 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2032
2033 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2034
2035#ifdef DUMP_STATE_DOT
2036 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2037 pDSDumpDot((char*)"triTest2.dot");
2038#endif
2039 // render triangle
2040 cmdBuffer.Draw(0, 3, 0, 1);
2041
2042 // finalize recording of the command buffer
2043 cmdBuffer.EndCommandBuffer();
2044 cmdBuffer.QueueCommandBuffer(NULL, 0);
2045
2046 for (int i = 0; i < m_renderTargetCount; i++)
2047 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002048}
2049TEST_F(XglRenderTest, FSTriangle)
2050{
2051 // The expected result from this test is a red and green checkered triangle
2052 static const char *vertShaderText =
2053 "#version 140\n"
2054 "#extension GL_ARB_separate_shader_objects : enable\n"
2055 "#extension GL_ARB_shading_language_420pack : enable\n"
2056 "layout (location = 0) out vec2 samplePos;\n"
2057 "void main() {\n"
2058 " vec2 vertices[3];"
2059 " vertices[0] = vec2(-0.5, -0.5);\n"
2060 " vertices[1] = vec2( 0.5, -0.5);\n"
2061 " vertices[2] = vec2( 0.5, 0.5);\n"
2062 " vec2 positions[3];"
2063 " positions[0] = vec2( 0.0, 0.0);\n"
2064 " positions[1] = vec2( 1.0, 0.0);\n"
2065 " positions[2] = vec2( 1.0, 1.0);\n"
2066 " samplePos = positions[gl_VertexID % 3];\n"
2067 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2068 "}\n";
2069
2070 static const char *fragShaderText =
2071 "#version 140\n"
2072 "#extension GL_ARB_separate_shader_objects : enable\n"
2073 "#extension GL_ARB_shading_language_420pack : enable\n"
2074 "layout (location = 0) in vec2 samplePos;\n"
2075 "layout (binding = 0) uniform sampler2D surface;\n"
2076 "layout (location=0) out vec4 outColor;\n"
2077 "void main() {\n"
2078 " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
2079 " outColor = texColor;\n"
2080 "}\n";
2081
2082 ASSERT_NO_FATAL_FAILURE(InitState());
2083 ASSERT_NO_FATAL_FAILURE(InitViewport());
2084
2085 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2086 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2087 XglSamplerObj sampler(m_device);
2088 XglTextureObj texture(m_device);
2089
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002090 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
Tony Barbourf43b6982014-11-25 13:18:32 -07002091 ps.BindShaderEntitySlotToSampler(0, &sampler);
2092
2093 XglPipelineObj pipelineobj(m_device);
2094 pipelineobj.AddShader(&vs);
2095 pipelineobj.AddShader(&ps);
2096
2097 XglDescriptorSetObj descriptorSet(m_device);
2098 descriptorSet.AttachImageView(&texture);
2099 descriptorSet.AttachSampler(&sampler);
2100
2101 m_memoryRefManager.AddMemoryRef(&texture);
2102
Tony Barbourdd4c9642015-01-09 12:55:14 -07002103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2104 XglCommandBufferObj cmdBuffer(m_device);
2105 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2106
2107 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2108
2109 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2110
2111#ifdef DUMP_STATE_DOT
2112 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2113 pDSDumpDot((char*)"triTest2.dot");
2114#endif
2115 // render triangle
2116 cmdBuffer.Draw(0, 3, 0, 1);
2117
2118 // finalize recording of the command buffer
2119 cmdBuffer.EndCommandBuffer();
2120 cmdBuffer.QueueCommandBuffer(NULL, 0);
2121
2122 for (int i = 0; i < m_renderTargetCount; i++)
2123 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002124}
2125TEST_F(XglRenderTest, SamplerBindingsTriangle)
2126{
2127 // This test sets bindings on the samplers
2128 // For now we are asserting that sampler and texture pairs
2129 // march in lock step, and are set via GLSL binding. This can
2130 // and will probably change.
2131 // The sampler bindings should match the sampler and texture slot
2132 // number set up by the application.
2133 // This test will result in a blue triangle
2134 static const char *vertShaderText =
2135 "#version 140\n"
2136 "#extension GL_ARB_separate_shader_objects : enable\n"
2137 "#extension GL_ARB_shading_language_420pack : enable\n"
2138 "layout (location = 0) out vec4 samplePos;\n"
2139 "void main() {\n"
2140 " vec2 vertices[3];"
2141 " vertices[0] = vec2(-0.5, -0.5);\n"
2142 " vertices[1] = vec2( 0.5, -0.5);\n"
2143 " vertices[2] = vec2( 0.5, 0.5);\n"
2144 " vec2 positions[3];"
2145 " positions[0] = vec2( 0.0, 0.0);\n"
2146 " positions[1] = vec2( 1.0, 0.0);\n"
2147 " positions[2] = vec2( 1.0, 1.0);\n"
2148 " samplePos = vec4(positions[gl_VertexID % 3], 0.0, 0.0);\n"
2149 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2150 "}\n";
2151
2152 static const char *fragShaderText =
2153 "#version 140\n"
2154 "#extension GL_ARB_separate_shader_objects : enable\n"
2155 "#extension GL_ARB_shading_language_420pack : enable\n"
2156 "layout (location = 0) in vec4 samplePos;\n"
2157 "layout (binding = 0) uniform sampler2D surface0;\n"
2158 "layout (binding = 1) uniform sampler2D surface1;\n"
2159 "layout (binding = 12) uniform sampler2D surface2;\n"
2160 "void main() {\n"
2161 " gl_FragColor = textureLod(surface2, samplePos.xy, 0.0);\n"
2162 "}\n";
2163
2164 ASSERT_NO_FATAL_FAILURE(InitState());
2165 ASSERT_NO_FATAL_FAILURE(InitViewport());
2166
2167 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2168 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2169
2170 XglSamplerObj sampler1(m_device);
2171 XglSamplerObj sampler2(m_device);
2172 XglSamplerObj sampler3(m_device);
2173
2174 XglTextureObj texture1(m_device); // Red
2175 texture1.ChangeColors(0xffff0000,0xffff0000);
2176 XglTextureObj texture2(m_device); // Green
2177 texture2.ChangeColors(0xff00ff00,0xff00ff00);
2178 XglTextureObj texture3(m_device); // Blue
2179 texture3.ChangeColors(0xff0000ff,0xff0000ff);
2180
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002181 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture1);
Tony Barbourf43b6982014-11-25 13:18:32 -07002182 ps.BindShaderEntitySlotToSampler(0, &sampler1);
2183
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002184 ps.BindShaderEntitySlotToImage(1, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
Tony Barbourf43b6982014-11-25 13:18:32 -07002185 ps.BindShaderEntitySlotToSampler(1, &sampler2);
2186
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002187 ps.BindShaderEntitySlotToImage(12, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture3);
Tony Barbourf43b6982014-11-25 13:18:32 -07002188 ps.BindShaderEntitySlotToSampler(12, &sampler3);
2189
2190 XglPipelineObj pipelineobj(m_device);
2191 pipelineobj.AddShader(&vs);
2192 pipelineobj.AddShader(&ps);
2193
2194 XglDescriptorSetObj descriptorSet(m_device);
2195 descriptorSet.AttachImageView(&texture1);
2196 descriptorSet.AttachSampler(&sampler1);
2197 descriptorSet.AttachImageView(&texture2);
2198 descriptorSet.AttachSampler(&sampler2);
2199 descriptorSet.AttachImageView(&texture3);
2200 descriptorSet.AttachSampler(&sampler3);
2201
2202 m_memoryRefManager.AddMemoryRef(&texture1);
2203 m_memoryRefManager.AddMemoryRef(&texture2);
2204 m_memoryRefManager.AddMemoryRef(&texture3);
2205
Tony Barbourdd4c9642015-01-09 12:55:14 -07002206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2207 XglCommandBufferObj cmdBuffer(m_device);
2208 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2209
2210 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2211
2212 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2213
2214#ifdef DUMP_STATE_DOT
2215 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2216 pDSDumpDot((char*)"triTest2.dot");
2217#endif
2218 // render triangle
2219 cmdBuffer.Draw(0, 3, 0, 1);
2220
2221 // finalize recording of the command buffer
2222 cmdBuffer.EndCommandBuffer();
2223 cmdBuffer.QueueCommandBuffer(NULL, 0);
2224
2225 for (int i = 0; i < m_renderTargetCount; i++)
2226 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002227
2228}
2229
2230TEST_F(XglRenderTest, TriangleVSUniformBlock)
2231{
2232 // The expected result from this test is a blue triangle
2233
2234 static const char *vertShaderText =
2235 "#version 140\n"
2236 "#extension GL_ARB_separate_shader_objects : enable\n"
2237 "#extension GL_ARB_shading_language_420pack : enable\n"
2238 "layout (location = 0) out vec4 outColor;\n"
2239 "layout (std140, binding = 0) uniform bufferVals {\n"
2240 " vec4 red;\n"
2241 " vec4 green;\n"
2242 " vec4 blue;\n"
2243 " vec4 white;\n"
2244 "} myBufferVals;\n"
2245 "void main() {\n"
2246 " vec2 vertices[3];"
2247 " vertices[0] = vec2(-0.5, -0.5);\n"
2248 " vertices[1] = vec2( 0.5, -0.5);\n"
2249 " vertices[2] = vec2( 0.5, 0.5);\n"
2250 " outColor = myBufferVals.blue;\n"
2251 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2252 "}\n";
2253
2254 static const char *fragShaderText =
2255 "#version 140\n"
2256 "#extension GL_ARB_separate_shader_objects : enable\n"
2257 "#extension GL_ARB_shading_language_420pack : enable\n"
2258 "layout (location = 0) in vec4 inColor;\n"
2259 "void main() {\n"
2260 " gl_FragColor = inColor;\n"
2261 "}\n";
2262
2263 ASSERT_NO_FATAL_FAILURE(InitState());
2264 ASSERT_NO_FATAL_FAILURE(InitViewport());
2265
2266 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2267 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2268
2269 // Let's populate our buffer with the following:
2270 // vec4 red;
2271 // vec4 green;
2272 // vec4 blue;
2273 // vec4 white;
2274 const int valCount = 4 * 4;
2275 const float bufferVals[valCount] = { 1.0, 0.0, 0.0, 1.0,
2276 0.0, 1.0, 0.0, 1.0,
2277 0.0, 0.0, 1.0, 1.0,
2278 1.0, 1.0, 1.0, 1.0 };
2279
2280 XglConstantBufferObj colorBuffer(m_device, valCount, sizeof(bufferVals[0]), (const void*) bufferVals);
2281 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &colorBuffer);
2282
2283 XglPipelineObj pipelineobj(m_device);
2284 pipelineobj.AddShader(&vs);
2285 pipelineobj.AddShader(&ps);
2286
2287 XglDescriptorSetObj descriptorSet(m_device);
2288 descriptorSet.AttachMemoryView(&colorBuffer);
2289
Tony Barbourdd4c9642015-01-09 12:55:14 -07002290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2291 XglCommandBufferObj cmdBuffer(m_device);
2292 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2293
2294 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2295
2296 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2297
2298#ifdef DUMP_STATE_DOT
2299 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2300 pDSDumpDot((char*)"triTest2.dot");
2301#endif
2302 // render triangle
2303 cmdBuffer.Draw(0, 3, 0, 1);
2304
2305 // finalize recording of the command buffer
2306 cmdBuffer.EndCommandBuffer();
2307 cmdBuffer.QueueCommandBuffer(NULL, 0);
2308
2309 for (int i = 0; i < m_renderTargetCount; i++)
2310 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002311
2312}
2313
2314TEST_F(XglRenderTest, TriangleFSUniformBlockBinding)
2315{
2316 // This test allows the shader to select which buffer it is
2317 // pulling from using layout binding qualifier.
2318 // There are corresponding changes in the compiler stack that
2319 // will select the buffer using binding directly.
2320 // The binding number should match the slot number set up by
2321 // the application.
2322 // The expected result from this test is a purple triangle
2323
2324 static const char *vertShaderText =
2325 "#version 140\n"
2326 "#extension GL_ARB_separate_shader_objects : enable\n"
2327 "#extension GL_ARB_shading_language_420pack : enable\n"
2328 "void main() {\n"
2329 " vec2 vertices[3];"
2330 " vertices[0] = vec2(-0.5, -0.5);\n"
2331 " vertices[1] = vec2( 0.5, -0.5);\n"
2332 " vertices[2] = vec2( 0.5, 0.5);\n"
2333 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2334 "}\n";
2335
2336 static const char *fragShaderText =
2337 "#version 140\n"
2338 "#extension GL_ARB_separate_shader_objects : enable\n"
2339 "#extension GL_ARB_shading_language_420pack : enable\n"
2340 "layout (std140, binding = 0) uniform redVal { vec4 color; } myRedVal\n;"
2341 "layout (std140, binding = 1) uniform greenVal { vec4 color; } myGreenVal\n;"
2342 "layout (std140, binding = 2) uniform blueVal { vec4 color; } myBlueVal\n;"
2343 "layout (std140, binding = 18) uniform whiteVal { vec4 color; } myWhiteVal\n;"
2344 "void main() {\n"
2345 " gl_FragColor = myBlueVal.color;\n"
2346 " gl_FragColor += myRedVal.color;\n"
2347 "}\n";
2348
2349 ASSERT_NO_FATAL_FAILURE(InitState());
2350 ASSERT_NO_FATAL_FAILURE(InitViewport());
2351
2352 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2353 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2354
2355 // We're going to create a number of uniform buffers, and then allow
2356 // the shader to select which it wants to read from with a binding
2357
2358 // Let's populate the buffers with a single color each:
2359 // layout (std140, binding = 0) uniform bufferVals { vec4 red; } myRedVal;
2360 // layout (std140, binding = 1) uniform bufferVals { vec4 green; } myGreenVal;
2361 // layout (std140, binding = 2) uniform bufferVals { vec4 blue; } myBlueVal;
2362 // layout (std140, binding = 18) uniform bufferVals { vec4 white; } myWhiteVal;
2363
2364 const float redVals[4] = { 1.0, 0.0, 0.0, 1.0 };
2365 const float greenVals[4] = { 0.0, 1.0, 0.0, 1.0 };
2366 const float blueVals[4] = { 0.0, 0.0, 1.0, 1.0 };
2367 const float whiteVals[4] = { 1.0, 1.0, 1.0, 1.0 };
2368
2369 const int redCount = sizeof(redVals) / sizeof(float);
2370 const int greenCount = sizeof(greenVals) / sizeof(float);
2371 const int blueCount = sizeof(blueVals) / sizeof(float);
2372 const int whiteCount = sizeof(whiteVals) / sizeof(float);
2373
2374 XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
2375 ps.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
2376
2377 XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
2378 ps.BindShaderEntitySlotToMemory(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
2379
2380 XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
2381 ps.BindShaderEntitySlotToMemory(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
2382
2383 XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
2384 ps.BindShaderEntitySlotToMemory(18, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
2385
2386 XglPipelineObj pipelineobj(m_device);
2387 pipelineobj.AddShader(&vs);
2388 pipelineobj.AddShader(&ps);
2389
2390 XglDescriptorSetObj descriptorSet(m_device);
2391 descriptorSet.AttachMemoryView(&redBuffer);
2392 descriptorSet.AttachMemoryView(&greenBuffer);
2393 descriptorSet.AttachMemoryView(&blueBuffer);
2394 descriptorSet.AttachMemoryView(&whiteBuffer);
2395
Tony Barbourdd4c9642015-01-09 12:55:14 -07002396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2397 XglCommandBufferObj cmdBuffer(m_device);
2398 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002399
Tony Barbourdd4c9642015-01-09 12:55:14 -07002400 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2401
2402 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2403
2404#ifdef DUMP_STATE_DOT
2405 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2406 pDSDumpDot((char*)"triTest2.dot");
2407#endif
2408 // render triangle
2409 cmdBuffer.Draw(0, 3, 0, 1);
2410
2411 // finalize recording of the command buffer
2412 cmdBuffer.EndCommandBuffer();
2413 cmdBuffer.QueueCommandBuffer(NULL, 0);
2414
2415 for (int i = 0; i < m_renderTargetCount; i++)
2416 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002417}
2418
2419TEST_F(XglRenderTest, TriangleFSAnonymousUniformBlockBinding)
2420{
2421 // This test is the same as TriangleFSUniformBlockBinding, but
2422 // it does not provide an instance name.
2423 // The expected result from this test is a purple triangle
2424
2425 static const char *vertShaderText =
2426 "#version 140\n"
2427 "#extension GL_ARB_separate_shader_objects : enable\n"
2428 "#extension GL_ARB_shading_language_420pack : enable\n"
2429 "void main() {\n"
2430 " vec2 vertices[3];"
2431 " vertices[0] = vec2(-0.5, -0.5);\n"
2432 " vertices[1] = vec2( 0.5, -0.5);\n"
2433 " vertices[2] = vec2( 0.5, 0.5);\n"
2434 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2435 "}\n";
2436
2437 static const char *fragShaderText =
2438 "#version 430\n"
2439 "#extension GL_ARB_separate_shader_objects : enable\n"
2440 "#extension GL_ARB_shading_language_420pack : enable\n"
Tony Barbourf43b6982014-11-25 13:18:32 -07002441 "layout (std140, binding = 0) uniform redVal { vec4 red; };"
2442 "layout (std140, binding = 1) uniform greenVal { vec4 green; };"
2443 "layout (std140, binding = 2) uniform blueVal { vec4 blue; };"
2444 "layout (std140, binding = 18) uniform whiteVal { vec4 white; };"
Cody Northrop68a10f62014-12-05 15:44:14 -07002445 "layout (location = 0) out vec4 outColor;\n"
Tony Barbourf43b6982014-11-25 13:18:32 -07002446 "void main() {\n"
Cody Northrop68a10f62014-12-05 15:44:14 -07002447 " outColor = blue;\n"
2448 " outColor += red;\n"
Tony Barbourf43b6982014-11-25 13:18:32 -07002449 "}\n";
2450 ASSERT_NO_FATAL_FAILURE(InitState());
2451 ASSERT_NO_FATAL_FAILURE(InitViewport());
2452
2453 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2454 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2455
2456 // We're going to create a number of uniform buffers, and then allow
2457 // the shader to select which it wants to read from with a binding
2458
2459 // Let's populate the buffers with a single color each:
2460 // layout (std140, binding = 0) uniform bufferVals { vec4 red; } myRedVal;
2461 // layout (std140, binding = 1) uniform bufferVals { vec4 green; } myGreenVal;
2462 // layout (std140, binding = 2) uniform bufferVals { vec4 blue; } myBlueVal;
2463 // layout (std140, binding = 3) uniform bufferVals { vec4 white; } myWhiteVal;
2464
2465 const float redVals[4] = { 1.0, 0.0, 0.0, 1.0 };
2466 const float greenVals[4] = { 0.0, 1.0, 0.0, 1.0 };
2467 const float blueVals[4] = { 0.0, 0.0, 1.0, 1.0 };
2468 const float whiteVals[4] = { 1.0, 1.0, 1.0, 1.0 };
2469
2470 const int redCount = sizeof(redVals) / sizeof(float);
2471 const int greenCount = sizeof(greenVals) / sizeof(float);
2472 const int blueCount = sizeof(blueVals) / sizeof(float);
2473 const int whiteCount = sizeof(whiteVals) / sizeof(float);
2474
2475 XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
2476 ps.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
2477
2478 XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
2479 ps.BindShaderEntitySlotToMemory(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
2480
2481 XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
2482 ps.BindShaderEntitySlotToMemory(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
2483
2484 XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
Cody Northropd1ce7842014-12-09 11:17:01 -07002485 ps.BindShaderEntitySlotToMemory(18, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
Tony Barbourf43b6982014-11-25 13:18:32 -07002486
2487 XglPipelineObj pipelineobj(m_device);
2488 pipelineobj.AddShader(&vs);
2489 pipelineobj.AddShader(&ps);
2490
2491 XglDescriptorSetObj descriptorSet(m_device);
2492 descriptorSet.AttachMemoryView(&redBuffer);
2493 descriptorSet.AttachMemoryView(&greenBuffer);
2494 descriptorSet.AttachMemoryView(&blueBuffer);
2495 descriptorSet.AttachMemoryView(&whiteBuffer);
2496
Tony Barbourdd4c9642015-01-09 12:55:14 -07002497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2498 XglCommandBufferObj cmdBuffer(m_device);
2499 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
2500
2501 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2502
2503 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2504
2505#ifdef DUMP_STATE_DOT
2506 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2507 pDSDumpDot((char*)"triTest2.dot");
2508#endif
2509 // render triangle
2510 cmdBuffer.Draw(0, 3, 0, 1);
2511
2512 // finalize recording of the command buffer
2513 cmdBuffer.EndCommandBuffer();
2514 cmdBuffer.QueueCommandBuffer(NULL, 0);
2515
2516 for (int i = 0; i < m_renderTargetCount; i++)
2517 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002518
2519}
2520
2521TEST_F(XglRenderTest, CubeWithVertexFetchAndMVPAndTexture)
2522{
2523 static const char *vertShaderText =
2524 "#version 140\n"
2525 "#extension GL_ARB_separate_shader_objects : enable\n"
2526 "#extension GL_ARB_shading_language_420pack : enable\n"
2527 "layout (std140, binding=0) uniform bufferVals {\n"
2528 " mat4 mvp;\n"
2529 "} myBufferVals;\n"
2530 "layout (location=0) in vec4 pos;\n"
2531 "layout (location=0) out vec2 UV;\n"
2532 "void main() {\n"
2533 " vec2 positions[3];"
2534 " positions[0] = vec2( 0.0, 0.0);\n"
2535 " positions[1] = vec2( 0.25, 0.1);\n"
2536 " positions[2] = vec2( 0.1, 0.25);\n"
2537 " UV = positions[gl_VertexID % 3];\n"
2538 " gl_Position = myBufferVals.mvp * pos;\n"
2539 "}\n";
2540
2541 static const char *fragShaderText =
2542 "#version 140\n"
2543 "#extension GL_ARB_separate_shader_objects : enable\n"
2544 "#extension GL_ARB_shading_language_420pack : enable\n"
2545 "layout (binding=0) uniform sampler2D surface;\n"
2546 "layout (location=0) out vec4 outColor;\n"
2547 "layout (location=0) in vec2 UV;\n"
2548 "void main() {\n"
2549 " outColor= textureLod(surface, UV, 0.0);\n"
2550 "}\n";
2551 glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
2552
2553 glm::mat4 View = glm::lookAt(
2554 glm::vec3(0,3,10), // Camera is at (0,3,10), in World Space
2555 glm::vec3(0,0,0), // and looks at the origin
2556 glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
2557 );
2558
2559 glm::mat4 Model = glm::mat4(1.0f);
2560
2561 glm::mat4 MVP = Projection * View * Model;
2562
2563
2564 ASSERT_NO_FATAL_FAILURE(InitState());
2565 ASSERT_NO_FATAL_FAILURE(InitViewport());
2566 ASSERT_NO_FATAL_FAILURE(InitDepthStencil());
2567
2568 XglConstantBufferObj meshBuffer(m_device,sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]),
2569 sizeof(g_vb_solid_face_colors_Data[0]), g_vb_solid_face_colors_Data);
Tony Barboure6152042014-12-10 17:40:15 -07002570 meshBuffer.SetMemoryState(XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
Tony Barbourf43b6982014-11-25 13:18:32 -07002571
2572
2573 const int buf_size = sizeof(MVP) / sizeof(XGL_FLOAT);
2574
2575 XglConstantBufferObj mvpBuffer(m_device, buf_size, sizeof(MVP[0]), (const void*) &MVP[0][0]);
2576 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2577 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2578 XglSamplerObj sampler(m_device);
2579 XglTextureObj texture(m_device);
2580
2581 // vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_VERTEX_INPUT, (XGL_OBJECT) &meshBuffer.m_constantBufferView);
2582 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &mvpBuffer);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002583 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
Tony Barbourf43b6982014-11-25 13:18:32 -07002584 ps.BindShaderEntitySlotToSampler(0, &sampler);
2585
2586 XglPipelineObj pipelineobj(m_device);
2587 pipelineobj.AddShader(&vs);
2588 pipelineobj.AddShader(&ps);
2589
2590 XglDescriptorSetObj descriptorSet(m_device);
2591
2592 descriptorSet.AttachMemoryView(&mvpBuffer);
2593 descriptorSet.AttachImageView(&texture);
2594 descriptorSet.AttachSampler(&sampler);
2595
2596 m_memoryRefManager.AddMemoryRef(&meshBuffer);
2597 m_memoryRefManager.AddMemoryRef(&mvpBuffer);
2598 m_memoryRefManager.AddMemoryRef(&texture);
2599
2600 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
2601 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
2602 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
2603 };
2604
2605 // this is the current description of g_vbData
2606 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
2607 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
2608 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
2609 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
2610 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
2611 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
2612 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
2613 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
2614 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
2615
2616 pipelineobj.AddVertexInputBindings(&vi_binding,1);
2617 pipelineobj.AddVertexInputAttribs(vi_attribs,2);
2618 pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
2619
Tony Barbourdd4c9642015-01-09 12:55:14 -07002620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2621 XglCommandBufferObj cmdBuffer(m_device);
2622 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002623
Tony Barbourdd4c9642015-01-09 12:55:14 -07002624 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2625 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2626
2627 cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
2628#ifdef DUMP_STATE_DOT
2629 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2630 pDSDumpDot((char*)"triTest2.dot");
2631#endif
2632 // render triangle
2633 cmdBuffer.Draw(0, 36, 0, 1);
2634
2635 // finalize recording of the command buffer
2636 cmdBuffer.EndCommandBuffer();
2637 cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
2638
2639 for (int i = 0; i < m_renderTargetCount; i++)
2640 RecordImage(m_renderTargets[i]);
Tony Barbourf43b6982014-11-25 13:18:32 -07002641
2642}
Cody Northropd1ce7842014-12-09 11:17:01 -07002643
2644TEST_F(XglRenderTest, TriangleMixedSamplerUniformBlockBinding)
2645{
2646 // This test mixes binding slots of textures and buffers, ensuring
2647 // that sparse and overlapping assignments work.
Cody Northropa0410942014-12-09 13:59:39 -07002648 // The expected result from this test is a purple triangle, although
Cody Northropd1ce7842014-12-09 11:17:01 -07002649 // you can modify it to move the desired result around.
2650
2651 static const char *vertShaderText =
2652 "#version 140\n"
2653 "#extension GL_ARB_separate_shader_objects : enable\n"
2654 "#extension GL_ARB_shading_language_420pack : enable\n"
2655 "void main() {\n"
2656 " vec2 vertices[3];"
2657 " vertices[0] = vec2(-0.5, -0.5);\n"
2658 " vertices[1] = vec2( 0.5, -0.5);\n"
2659 " vertices[2] = vec2( 0.5, 0.5);\n"
2660 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2661 "}\n";
2662
2663 static const char *fragShaderText =
2664 "#version 430\n"
2665 "#extension GL_ARB_separate_shader_objects : enable\n"
2666 "#extension GL_ARB_shading_language_420pack : enable\n"
2667 "layout (binding = 0) uniform sampler2D surface0;\n"
Courtney Goeltzenleuchter6cbffef2014-12-11 09:03:03 -07002668 "layout (binding = 9) uniform sampler2D surface1;\n"
Cody Northropd1ce7842014-12-09 11:17:01 -07002669 "layout (binding = 2) uniform sampler2D surface2;\n"
Cody Northropa0410942014-12-09 13:59:39 -07002670 "layout (binding = 4) uniform sampler2D surface3;\n"
Cody Northropd1ce7842014-12-09 11:17:01 -07002671
Cody Northropa0410942014-12-09 13:59:39 -07002672
2673 "layout (std140, binding = 10) uniform redVal { vec4 red; };"
2674 "layout (std140, binding = 15) uniform greenVal { vec4 green; };"
2675 "layout (std140, binding = 13) uniform blueVal { vec4 blue; };"
2676 "layout (std140, binding = 17) uniform whiteVal { vec4 white; };"
Cody Northropd1ce7842014-12-09 11:17:01 -07002677 "layout (location = 0) out vec4 outColor;\n"
2678 "void main() {\n"
Cody Northropa0410942014-12-09 13:59:39 -07002679 " outColor = red * vec4(0.00001);\n"
Cody Northropd1ce7842014-12-09 11:17:01 -07002680 " outColor += white * vec4(0.00001);\n"
2681 " outColor += textureLod(surface2, vec2(0.5), 0.0)* vec4(0.00001);\n"
Cody Northropa0410942014-12-09 13:59:39 -07002682 " outColor += textureLod(surface1, vec2(0.0), 0.0);//* vec4(0.00001);\n"
Cody Northropd1ce7842014-12-09 11:17:01 -07002683 "}\n";
2684 ASSERT_NO_FATAL_FAILURE(InitState());
2685 ASSERT_NO_FATAL_FAILURE(InitViewport());
2686
2687 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2688 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2689
Cody Northropd1ce7842014-12-09 11:17:01 -07002690 const float redVals[4] = { 1.0, 0.0, 0.0, 1.0 };
2691 const float greenVals[4] = { 0.0, 1.0, 0.0, 1.0 };
2692 const float blueVals[4] = { 0.0, 0.0, 1.0, 1.0 };
2693 const float whiteVals[4] = { 1.0, 1.0, 1.0, 1.0 };
2694
2695 const int redCount = sizeof(redVals) / sizeof(float);
2696 const int greenCount = sizeof(greenVals) / sizeof(float);
2697 const int blueCount = sizeof(blueVals) / sizeof(float);
2698 const int whiteCount = sizeof(whiteVals) / sizeof(float);
2699
2700 XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
Cody Northropa0410942014-12-09 13:59:39 -07002701 ps.BindShaderEntitySlotToMemory(10, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
Cody Northropd1ce7842014-12-09 11:17:01 -07002702
2703 XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
Cody Northropa0410942014-12-09 13:59:39 -07002704 ps.BindShaderEntitySlotToMemory(15, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
Cody Northropd1ce7842014-12-09 11:17:01 -07002705
2706 XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
Cody Northropa0410942014-12-09 13:59:39 -07002707 ps.BindShaderEntitySlotToMemory(13, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
Cody Northropd1ce7842014-12-09 11:17:01 -07002708
2709 XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
Cody Northropa0410942014-12-09 13:59:39 -07002710 ps.BindShaderEntitySlotToMemory(17, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
Cody Northropd1ce7842014-12-09 11:17:01 -07002711
2712 XglSamplerObj sampler0(m_device);
Cody Northropa0410942014-12-09 13:59:39 -07002713 XglTextureObj texture0(m_device); // Light Red
2714 texture0.ChangeColors(0xff800000,0xff800000);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002715 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture0);
Cody Northropd1ce7842014-12-09 11:17:01 -07002716 ps.BindShaderEntitySlotToSampler(0, &sampler0);
2717 XglSamplerObj sampler2(m_device);
Cody Northropa0410942014-12-09 13:59:39 -07002718 XglTextureObj texture2(m_device); // Light Blue
2719 texture2.ChangeColors(0xff000080,0xff000080);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002720 ps.BindShaderEntitySlotToImage(2, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
Cody Northropd1ce7842014-12-09 11:17:01 -07002721 ps.BindShaderEntitySlotToSampler(2, &sampler2);
2722 XglSamplerObj sampler4(m_device);
Cody Northropa0410942014-12-09 13:59:39 -07002723 XglTextureObj texture4(m_device); // Light Green
2724 texture4.ChangeColors(0xff008000,0xff008000);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002725 ps.BindShaderEntitySlotToImage(4, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture4);
Cody Northropd1ce7842014-12-09 11:17:01 -07002726 ps.BindShaderEntitySlotToSampler(4, &sampler4);
Cody Northropa0410942014-12-09 13:59:39 -07002727
2728 // NOTE: Bindings 1,3,5,7,8,9,11,12,14,16 work for this sampler, but 6 does not!!!
2729 // TODO: Get back here ASAP and understand why.
2730 XglSamplerObj sampler7(m_device);
2731 XglTextureObj texture7(m_device); // Red and Blue
2732 texture7.ChangeColors(0xffff00ff,0xffff00ff);
Courtney Goeltzenleuchter6cbffef2014-12-11 09:03:03 -07002733 ps.BindShaderEntitySlotToImage(9, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture7);
2734 ps.BindShaderEntitySlotToSampler(9, &sampler7);
Cody Northropd1ce7842014-12-09 11:17:01 -07002735
2736
2737 XglPipelineObj pipelineobj(m_device);
2738 pipelineobj.AddShader(&vs);
2739 pipelineobj.AddShader(&ps);
2740
2741 XglDescriptorSetObj descriptorSet(m_device);
2742 descriptorSet.AttachMemoryView(&redBuffer);
2743 descriptorSet.AttachMemoryView(&greenBuffer);
2744 descriptorSet.AttachMemoryView(&blueBuffer);
2745 descriptorSet.AttachMemoryView(&whiteBuffer);
2746 descriptorSet.AttachImageView(&texture0);
2747 descriptorSet.AttachSampler(&sampler0);
2748 descriptorSet.AttachImageView(&texture2);
2749 descriptorSet.AttachSampler(&sampler2);
2750 descriptorSet.AttachImageView(&texture4);
2751 descriptorSet.AttachSampler(&sampler4);
Cody Northropa0410942014-12-09 13:59:39 -07002752 descriptorSet.AttachImageView(&texture7);
2753 descriptorSet.AttachSampler(&sampler7);
Cody Northropd1ce7842014-12-09 11:17:01 -07002754
2755 m_memoryRefManager.AddMemoryRef(&texture0);
2756 m_memoryRefManager.AddMemoryRef(&texture2);
2757 m_memoryRefManager.AddMemoryRef(&texture4);
Cody Northropa0410942014-12-09 13:59:39 -07002758 m_memoryRefManager.AddMemoryRef(&texture7);
Cody Northropd1ce7842014-12-09 11:17:01 -07002759
Tony Barbourdd4c9642015-01-09 12:55:14 -07002760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2761 XglCommandBufferObj cmdBuffer(m_device);
2762 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Cody Northropd1ce7842014-12-09 11:17:01 -07002763
Tony Barbourdd4c9642015-01-09 12:55:14 -07002764 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2765
2766 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2767
2768#ifdef DUMP_STATE_DOT
2769 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2770 pDSDumpDot((char*)"triTest2.dot");
2771#endif
2772 // render triangle
2773 cmdBuffer.Draw(0, 3, 0, 1);
2774
2775 // finalize recording of the command buffer
2776 cmdBuffer.EndCommandBuffer();
2777 cmdBuffer.QueueCommandBuffer(NULL, 0);
2778
2779 for (int i = 0; i < m_renderTargetCount; i++)
2780 RecordImage(m_renderTargets[i]);
Cody Northropd1ce7842014-12-09 11:17:01 -07002781
2782}
2783
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002784TEST_F(XglRenderTest, TriangleMatchingSamplerUniformBlockBinding)
2785{
2786 // This test matches binding slots of textures and buffers, requiring
2787 // the driver to give them distinct number spaces.
2788 // The expected result from this test is a red triangle, although
2789 // you can modify it to move the desired result around.
2790
2791 static const char *vertShaderText =
2792 "#version 140\n"
2793 "#extension GL_ARB_separate_shader_objects : enable\n"
2794 "#extension GL_ARB_shading_language_420pack : enable\n"
2795 "void main() {\n"
2796 " vec2 vertices[3];"
2797 " vertices[0] = vec2(-0.5, -0.5);\n"
2798 " vertices[1] = vec2( 0.5, -0.5);\n"
2799 " vertices[2] = vec2( 0.5, 0.5);\n"
2800 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
2801 "}\n";
2802
2803 static const char *fragShaderText =
2804 "#version 430\n"
2805 "#extension GL_ARB_separate_shader_objects : enable\n"
2806 "#extension GL_ARB_shading_language_420pack : enable\n"
2807 "layout (binding = 0) uniform sampler2D surface0;\n"
2808 "layout (binding = 1) uniform sampler2D surface1;\n"
2809 "layout (binding = 2) uniform sampler2D surface2;\n"
2810 "layout (binding = 3) uniform sampler2D surface3;\n"
2811 "layout (std140, binding = 0) uniform redVal { vec4 red; };"
2812 "layout (std140, binding = 1) uniform greenVal { vec4 green; };"
2813 "layout (std140, binding = 2) uniform blueVal { vec4 blue; };"
2814 "layout (std140, binding = 3) uniform whiteVal { vec4 white; };"
2815 "layout (location = 0) out vec4 outColor;\n"
2816 "void main() {\n"
2817 " outColor = red;// * vec4(0.00001);\n"
2818 " outColor += white * vec4(0.00001);\n"
2819 " outColor += textureLod(surface1, vec2(0.5), 0.0)* vec4(0.00001);\n"
2820 " outColor += textureLod(surface3, vec2(0.0), 0.0)* vec4(0.00001);\n"
2821 "}\n";
2822 ASSERT_NO_FATAL_FAILURE(InitState());
2823 ASSERT_NO_FATAL_FAILURE(InitViewport());
2824
2825 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
2826 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
2827
2828 const float redVals[4] = { 1.0, 0.0, 0.0, 1.0 };
2829 const float greenVals[4] = { 0.0, 1.0, 0.0, 1.0 };
2830 const float blueVals[4] = { 0.0, 0.0, 1.0, 1.0 };
2831 const float whiteVals[4] = { 1.0, 1.0, 1.0, 1.0 };
2832
2833 const int redCount = sizeof(redVals) / sizeof(float);
2834 const int greenCount = sizeof(greenVals) / sizeof(float);
2835 const int blueCount = sizeof(blueVals) / sizeof(float);
2836 const int whiteCount = sizeof(whiteVals) / sizeof(float);
2837
2838 XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
2839 ps.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
2840
2841 XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
2842 ps.BindShaderEntitySlotToMemory(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
2843
2844 XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
2845 ps.BindShaderEntitySlotToMemory(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
2846
2847 XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
2848 ps.BindShaderEntitySlotToMemory(3, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
2849
2850 XglSamplerObj sampler0(m_device);
2851 XglTextureObj texture0(m_device); // Light Red
2852 texture0.ChangeColors(0xff800000,0xff800000);
2853 ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture0);
2854 ps.BindShaderEntitySlotToSampler(0, &sampler0);
2855 XglSamplerObj sampler2(m_device);
2856 XglTextureObj texture2(m_device); // Light Blue
2857 texture2.ChangeColors(0xff000080,0xff000080);
2858 ps.BindShaderEntitySlotToImage(1, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
2859 ps.BindShaderEntitySlotToSampler(1, &sampler2);
2860 XglSamplerObj sampler4(m_device);
2861 XglTextureObj texture4(m_device); // Light Green
2862 texture4.ChangeColors(0xff008000,0xff008000);
2863 ps.BindShaderEntitySlotToImage(2, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture4);
2864 ps.BindShaderEntitySlotToSampler(2, &sampler4);
2865 XglSamplerObj sampler7(m_device);
2866 XglTextureObj texture7(m_device); // Red and Blue
2867 texture7.ChangeColors(0xffff00ff,0xffff00ff);
2868 ps.BindShaderEntitySlotToImage(3, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture7);
2869 ps.BindShaderEntitySlotToSampler(3, &sampler7);
2870
2871
2872 XglPipelineObj pipelineobj(m_device);
2873 pipelineobj.AddShader(&vs);
2874 pipelineobj.AddShader(&ps);
2875
2876 XglDescriptorSetObj descriptorSet(m_device);
2877 descriptorSet.AttachMemoryView(&redBuffer);
2878 descriptorSet.AttachMemoryView(&greenBuffer);
2879 descriptorSet.AttachMemoryView(&blueBuffer);
2880 descriptorSet.AttachMemoryView(&whiteBuffer);
2881 descriptorSet.AttachImageView(&texture0);
2882 descriptorSet.AttachSampler(&sampler0);
2883 descriptorSet.AttachImageView(&texture2);
2884 descriptorSet.AttachSampler(&sampler2);
2885 descriptorSet.AttachImageView(&texture4);
2886 descriptorSet.AttachSampler(&sampler4);
2887 descriptorSet.AttachImageView(&texture7);
2888 descriptorSet.AttachSampler(&sampler7);
2889
2890 m_memoryRefManager.AddMemoryRef(&texture0);
2891 m_memoryRefManager.AddMemoryRef(&texture2);
2892 m_memoryRefManager.AddMemoryRef(&texture4);
2893 m_memoryRefManager.AddMemoryRef(&texture7);
2894
Tony Barbourdd4c9642015-01-09 12:55:14 -07002895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2896 XglCommandBufferObj cmdBuffer(m_device);
2897 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002898
Tony Barbourdd4c9642015-01-09 12:55:14 -07002899 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
2900
2901 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
2902
2903#ifdef DUMP_STATE_DOT
2904 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
2905 pDSDumpDot((char*)"triTest2.dot");
2906#endif
2907 // render triangle
2908 cmdBuffer.Draw(0, 3, 0, 1);
2909
2910 // finalize recording of the command buffer
2911 cmdBuffer.EndCommandBuffer();
2912 cmdBuffer.QueueCommandBuffer(NULL, 0);
2913
2914 for (int i = 0; i < m_renderTargetCount; i++)
2915 RecordImage(m_renderTargets[i]);
Cody Northrop5fcacbc2014-12-09 19:08:54 -07002916
2917}
2918
Cody Northrop02690bd2014-12-17 15:26:33 -07002919TEST_F(XglRenderTest, TriangleUniformBufferLayout)
2920{
2921 // This test populates a buffer with a variety of different data
2922 // types, then reads them out with a shader.
2923 // The expected result from this test is a green triangle
2924
2925 static const char *vertShaderText =
2926 "#version 140\n"
2927 "#extension GL_ARB_separate_shader_objects : enable\n"
2928 "#extension GL_ARB_shading_language_420pack : enable\n"
2929 "layout (std140, binding = 0) uniform mixedBuffer {\n"
2930 " vec4 fRed;\n"
2931 " vec4 fGreen;\n"
2932 " layout(row_major) mat4 worldToProj;\n"
2933 " layout(row_major) mat4 projToWorld;\n"
2934 " layout(row_major) mat4 worldToView;\n"
2935 " layout(row_major) mat4 viewToProj;\n"
2936 " layout(row_major) mat4 worldToShadow[4];\n"
2937 " float fZero;\n"
2938 " float fOne;\n"
2939 " float fTwo;\n"
2940 " float fThree;\n"
2941 " vec3 fZeroZeroZero;\n"
2942 " float fFour;\n"
2943 " vec3 fZeroZeroOne;\n"
2944 " float fFive;\n"
2945 " vec3 fZeroOneZero;\n"
2946 " float fSix;\n"
2947 " float fSeven;\n"
2948 " float fEight;\n"
2949 " float fNine;\n"
2950 " vec2 fZeroZero;\n"
2951 " vec2 fZeroOne;\n"
2952 " vec4 fBlue;\n"
2953 " vec2 fOneZero;\n"
2954 " vec2 fOneOne;\n"
2955 " vec3 fZeroOneOne;\n"
2956 " float fTen;\n"
2957 " float fEleven;\n"
2958 " float fTwelve;\n"
2959 " vec3 fOneZeroZero;\n"
2960 " vec4 uvOffsets[4];\n"
2961 "};\n"
2962 "layout (location = 0) out vec4 color;"
2963 "void main() {\n"
2964
2965 " vec4 right = vec4(0.0, 1.0, 0.0, 1.0);\n"
2966 " vec4 wrong = vec4(1.0, 0.0, 0.0, 1.0);\n"
2967 " \n"
2968
2969 // do some exact comparisons, even though we should
2970 // really have an epsilon involved.
2971 " vec4 outColor = right;\n"
2972 " if (fRed != vec4(1.0, 0.0, 0.0, 1.0))\n"
2973 " outColor = wrong;\n"
2974 " if (fGreen != vec4(0.0, 1.0, 0.0, 1.0))\n"
2975 " outColor = wrong;\n"
2976 " if (fBlue != vec4(0.0, 0.0, 1.0, 1.0))\n"
2977 " outColor = wrong;\n"
2978
2979 " color = outColor;\n"
2980
2981 // generic position stuff
2982 " vec2 vertices;\n"
2983 " int vertexSelector = gl_VertexID;\n"
2984 " if (vertexSelector == 0)\n"
2985 " vertices = vec2(-0.5, -0.5);\n"
2986 " else if (vertexSelector == 1)\n"
2987 " vertices = vec2( 0.5, -0.5);\n"
2988 " else if (vertexSelector == 2)\n"
2989 " vertices = vec2( 0.5, 0.5);\n"
2990 " else\n"
2991 " vertices = vec2( 0.0, 0.0);\n"
2992 " gl_Position = vec4(vertices, 0.0, 1.0);\n"
2993 "}\n";
2994
2995 static const char *fragShaderText =
2996 "#version 140\n"
2997 "#extension GL_ARB_separate_shader_objects : enable\n"
2998 "#extension GL_ARB_shading_language_420pack : enable\n"
2999 "layout (std140, binding = 0) uniform mixedBuffer {\n"
3000 " vec4 fRed;\n"
3001 " vec4 fGreen;\n"
3002 " layout(row_major) mat4 worldToProj;\n"
3003 " layout(row_major) mat4 projToWorld;\n"
3004 " layout(row_major) mat4 worldToView;\n"
3005 " layout(row_major) mat4 viewToProj;\n"
3006 " layout(row_major) mat4 worldToShadow[4];\n"
3007 " float fZero;\n"
3008 " float fOne;\n"
3009 " float fTwo;\n"
3010 " float fThree;\n"
3011 " vec3 fZeroZeroZero;\n"
3012 " float fFour;\n"
3013 " vec3 fZeroZeroOne;\n"
3014 " float fFive;\n"
3015 " vec3 fZeroOneZero;\n"
3016 " float fSix;\n"
3017 " float fSeven;\n"
3018 " float fEight;\n"
3019 " float fNine;\n"
3020 " vec2 fZeroZero;\n"
3021 " vec2 fZeroOne;\n"
3022 " vec4 fBlue;\n"
3023 " vec2 fOneZero;\n"
3024 " vec2 fOneOne;\n"
3025 " vec3 fZeroOneOne;\n"
3026 " float fTen;\n"
3027 " float fEleven;\n"
3028 " float fTwelve;\n"
3029 " vec3 fOneZeroZero;\n"
3030 " vec4 uvOffsets[4];\n"
3031 "};\n"
3032 "layout (location = 0) in vec4 color;\n"
3033 "void main() {\n"
3034 " vec4 right = vec4(0.0, 1.0, 0.0, 1.0);\n"
3035 " vec4 wrong = vec4(1.0, 0.0, 0.0, 1.0);\n"
3036 " \n"
3037
3038 // start with VS value to ensure it passed
3039 " vec4 outColor = color;\n"
3040
3041 // do some exact comparisons, even though we should
3042 // really have an epsilon involved.
3043 " if (fRed != vec4(1.0, 0.0, 0.0, 1.0))\n"
3044 " outColor = wrong;\n"
3045 " if (fGreen != vec4(0.0, 1.0, 0.0, 1.0))\n"
3046 " outColor = wrong;\n"
3047 " if (projToWorld[1] != vec4(0.0, 2.0, 0.0, 0.0))\n"
3048 " outColor = wrong;\n"
3049 " if (worldToShadow[2][1] != vec4(0.0, 7.0, 0.0, 0.0))\n"
3050 " outColor = wrong;\n"
3051 " if (fTwo != 2.0)\n"
3052 " outColor = wrong;\n"
3053 " if (fOneOne != vec2(1.0, 1.0))\n"
3054 " outColor = wrong;\n"
3055 " if (fTen != 10.0)\n"
3056 " outColor = wrong;\n"
3057 " if (uvOffsets[2] != vec4(0.9, 1.0, 1.1, 1.2))\n"
3058 " outColor = wrong;\n"
3059 " \n"
3060 " gl_FragColor = outColor;\n"
3061 "}\n";
3062
3063
3064 const float mixedVals[196] = { 1.0, 0.0, 0.0, 1.0, // vec4 fRed; // align
3065 0.0, 1.0, 0.0, 1.0, // vec4 fGreen; // align
3066 1.0, 0.0, 0.0, 1.0, // layout(row_major) mat4 worldToProj;
3067 0.0, 1.0, 0.0, 1.0, // align
3068 0.0, 0.0, 1.0, 1.0, // align
3069 0.0, 0.0, 0.0, 1.0, // align
3070 2.0, 0.0, 0.0, 2.0, // layout(row_major) mat4 projToWorld;
3071 0.0, 2.0, 0.0, 2.0, // align
3072 0.0, 0.0, 2.0, 2.0, // align
3073 0.0, 0.0, 0.0, 2.0, // align
3074 3.0, 0.0, 0.0, 3.0, // layout(row_major) mat4 worldToView;
3075 0.0, 3.0, 0.0, 3.0, // align
3076 0.0, 0.0, 3.0, 3.0, // align
3077 0.0, 0.0, 0.0, 3.0, // align
3078 4.0, 0.0, 0.0, 4.0, // layout(row_major) mat4 viewToProj;
3079 0.0, 4.0, 0.0, 4.0, // align
3080 0.0, 0.0, 4.0, 4.0, // align
3081 0.0, 0.0, 0.0, 4.0, // align
3082 5.0, 0.0, 0.0, 5.0, // layout(row_major) mat4 worldToShadow[4];
3083 0.0, 5.0, 0.0, 5.0, // align
3084 0.0, 0.0, 5.0, 5.0, // align
3085 0.0, 0.0, 0.0, 5.0, // align
3086 6.0, 0.0, 0.0, 6.0, // align
3087 0.0, 6.0, 0.0, 6.0, // align
3088 0.0, 0.0, 6.0, 6.0, // align
3089 0.0, 0.0, 0.0, 6.0, // align
3090 7.0, 0.0, 0.0, 7.0, // align
3091 0.0, 7.0, 0.0, 7.0, // align
3092 0.0, 0.0, 7.0, 7.0, // align
3093 0.0, 0.0, 0.0, 7.0, // align
3094 8.0, 0.0, 0.0, 8.0, // align
3095 0.0, 8.0, 0.0, 8.0, // align
3096 0.0, 0.0, 8.0, 8.0, // align
3097 0.0, 0.0, 0.0, 8.0, // align
3098 0.0, // float fZero; // align
3099 1.0, // float fOne; // pack
3100 2.0, // float fTwo; // pack
3101 3.0, // float fThree; // pack
3102 0.0, 0.0, 0.0, // vec3 fZeroZeroZero; // align
3103 4.0, // float fFour; // pack
3104 0.0, 0.0, 1.0, // vec3 fZeroZeroOne; // align
3105 5.0, // float fFive; // pack
3106 0.0, 1.0, 0.0, // vec3 fZeroOneZero; // align
3107 6.0, // float fSix; // pack
3108 7.0, // float fSeven; // align
3109 8.0, // float fEight; // pack
3110 9.0, // float fNine; // pack
3111 0.0, // BUFFER
3112 0.0, 0.0, // vec2 fZeroZero; // align
3113 0.0, 1.0, // vec2 fZeroOne; // pack
3114 0.0, 0.0, 1.0, 1.0, // vec4 fBlue; // align
3115 1.0, 0.0, // vec2 fOneZero; // align
3116 1.0, 1.0, // vec2 fOneOne; // pack
3117 0.0, 1.0, 1.0, // vec3 fZeroOneOne; // align
3118 10.0, // float fTen; // pack
3119 11.0, // float fEleven; // align
3120 12.0, // float fTwelve; // pack
3121 0.0, 0.0, // BUFFER
3122 1.0, 0.0, 0.0, // vec3 fOneZeroZero; // align
3123 0.0, // BUFFER
3124 0.1, 0.2, 0.3, 0.4, // vec4 uvOffsets[4];
3125 0.5, 0.6, 0.7, 0.8, // align
3126 0.9, 1.0, 1.1, 1.2, // align
3127 1.3, 1.4, 1.5, 1.6, // align
3128 };
3129
3130 ASSERT_NO_FATAL_FAILURE(InitState());
3131 ASSERT_NO_FATAL_FAILURE(InitViewport());
3132
3133 const int constCount = sizeof(mixedVals) / sizeof(float);
3134
3135 XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
3136 XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
3137
3138 XglConstantBufferObj mixedBuffer(m_device, constCount, sizeof(mixedVals[0]), (const void*) mixedVals);
3139 vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &mixedBuffer);
3140 ps.BindShaderEntitySlotToMemory(0, XGL_SLOT_SHADER_RESOURCE, &mixedBuffer);
3141
3142 XglPipelineObj pipelineobj(m_device);
3143 pipelineobj.AddShader(&vs);
3144 pipelineobj.AddShader(&ps);
3145
3146 XglDescriptorSetObj descriptorSet(m_device);
3147 descriptorSet.AttachMemoryView(&mixedBuffer);
3148
3149 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3150 XglCommandBufferObj cmdBuffer(m_device);
3151 cmdBuffer.AddRenderTarget(m_renderTargets[0]);
3152
3153 ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(0));
3154
3155 GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
3156
3157#ifdef DUMP_STATE_DOT
3158 DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (XGL_CHAR*)"drawStateDumpDotFile");
3159 pDSDumpDot((char*)"triTest2.dot");
3160#endif
3161 // render triangle
3162 cmdBuffer.Draw(0, 3, 0, 1);
3163
3164 // finalize recording of the command buffer
3165 cmdBuffer.EndCommandBuffer();
3166 cmdBuffer.QueueCommandBuffer(NULL, 0);
3167
3168 for (int i = 0; i < m_renderTargetCount; i++)
3169 RecordImage(m_renderTargets[i]);
3170}
3171
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06003172int main(int argc, char **argv) {
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06003173 int result;
3174
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06003175 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06003176 XglTestFramework::InitArgs(&argc, argv);
3177
Chia-I Wu7133fdc2014-12-15 23:57:34 +08003178 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Courtney Goeltzenleuchterf12c7762014-10-08 08:46:51 -06003179
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06003180 result = RUN_ALL_TESTS();
3181
3182 XglTestFramework::Finish();
3183 return result;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06003184}