blob: 902746fe27c15ec1f0e51c479305113e3cc2b178 [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 Ehlis791a49c2014-11-10 12:29:12 -070064#ifdef DEBUG_CALLBACK
65#include <xglDbg.h>
66#endif
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060067#include "gtest-1.7.0/include/gtest/gtest.h"
68
69#include "xgldevice.h"
Courtney Goeltzenleuchter04814f82014-09-01 16:37:18 -060070#include "xglimage.h"
Chia-I Wu4115c892014-08-28 11:56:29 +080071#include "icd-bil.h"
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060072
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -060073#define GLM_FORCE_RADIANS
74#include "glm/glm.hpp"
75#include <glm/gtc/matrix_transform.hpp>
76
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -060077#include "xglrenderframework.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070078#ifdef DEBUG_CALLBACK
79XGL_VOID XGLAPI myDbgFunc(
80 XGL_DBG_MSG_TYPE msgType,
81 XGL_VALIDATION_LEVEL validationLevel,
82 XGL_BASE_OBJECT srcObject,
83 XGL_SIZE location,
84 XGL_INT msgCode,
85 const XGL_CHAR* pMsg,
86 XGL_VOID* pUserData)
87{
88 printf("DEBUG : %s\n", pMsg);
89}
90#endif
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -060091//--------------------------------------------------------------------------------------
92// Mesh and VertexFormat Data
93//--------------------------------------------------------------------------------------
94struct Vertex
95{
96 XGL_FLOAT posX, posY, posZ, posW; // Position data
97 XGL_FLOAT r, g, b, a; // Color
98};
99
100#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
101
102static const Vertex g_vbData[] =
103{
104 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
105 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
106 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
107 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
108 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
109 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
110
111 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
112 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
113 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
114 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
115 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
116 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
117
118 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
119 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
120 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
121 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
122 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
123 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
124
125 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
126 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
127 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
128 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
129 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
130 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
131
132 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
133 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
134 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
135 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
136 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
137 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
138
139 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
140 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
141 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
142 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
143 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
144 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
145};
146
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600147static const Vertex g_vb_solid_face_colors_Data[] =
148{
149 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
150 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
151 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
152 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
153 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
154 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
155
156 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
157 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
158 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
159 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
160 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
161 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
162
163 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
164 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
165 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
166 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
167 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
168 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
169
170 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
171 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
172 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
173 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
174 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
175 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
176
177 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
178 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
179 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
180 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
181 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
182 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
183
184 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
185 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
186 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
187 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
188 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
189 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
190};
191
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600192class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600193{
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600194public:
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600195 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600196 void UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Cody Northrop350727b2014-10-06 15:42:00 -0600197 void InitTexture();
198 void InitSampler();
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600199 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600200 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600201 void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600202 void RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model);
203 void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText, int numTris);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600204 void DrawTriangleWithVertexFetchAndMVP(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600205
206 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600207 void CreatePipelineWithVertexFetchAndMVP(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600208 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600209 void ClearDepthStencil(XGL_FLOAT value);
210 void ClearRenderBuffer(XGL_UINT32 clear_color);
211 void InitDepthStencil();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600212 void DrawRotatedTriangleTest();
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600213 void GenerateClearAndPrepareBufferCmds();
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -0600214 void XGLTriangleTest(const char *vertShaderText, const char *fragShaderText);
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600215
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600216
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600217protected:
Cody Northrop350727b2014-10-06 15:42:00 -0600218 XGL_IMAGE m_texture;
219 XGL_IMAGE_VIEW m_textureView;
220 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
221 XGL_GPU_MEMORY m_textureMem;
222
223 XGL_SAMPLER m_sampler;
224
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600225 XGL_FORMAT m_depth_stencil_fmt;
226 XGL_IMAGE m_depthStencilImage;
227 XGL_GPU_MEMORY m_depthStencilMem;
228 XGL_DEPTH_STENCIL_VIEW m_depthStencilView;
229
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600230// XGL_APPLICATION_INFO app_info;
231// XGL_PHYSICAL_GPU objs[MAX_GPUS];
232// XGL_UINT gpu_count;
233// XGL_GPU_MEMORY m_descriptor_set_mem;
234// XGL_GPU_MEMORY m_pipe_mem;
235// XglDevice *m_device;
236// XGL_CMD_BUFFER m_cmdBuffer;
237// XGL_UINT32 m_numVertices;
238// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
239// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
240// XGL_GPU_MEMORY m_vtxBufferMem;
241// XGL_GPU_MEMORY m_constantBufferMem;
242// XGL_UINT32 m_numMemRefs;
243// XGL_MEMORY_REF m_memRefs[5];
244// XGL_RASTER_STATE_OBJECT m_stateRaster;
245// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
246// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
247// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
248// XGL_MSAA_STATE_OBJECT m_stateMsaa;
249// XGL_DESCRIPTOR_SET m_rsrcDescSet;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600250
251 virtual void SetUp() {
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600252
253 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
254 this->app_info.pNext = NULL;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600255 this->app_info.pAppName = (const XGL_CHAR *) "render_tests";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600256 this->app_info.appVersion = 1;
257 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
258 this->app_info.engineVersion = 1;
259 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
260
Cody Northrop350727b2014-10-06 15:42:00 -0600261 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
262 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
263
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600264 InitFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600265 }
266
267 virtual void TearDown() {
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600268 // Clean up resources before we reset
269 ShutdownFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600270 }
271};
272
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600273// this function will create the vertex buffer and fill it with the mesh data
274void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
275 const void* vertices )
276{
277 XGL_RESULT err = XGL_SUCCESS;
278
279 assert( numVertices * vbStride > 0 );
280 m_numVertices = numVertices;
281
282 XGL_MEMORY_ALLOC_INFO alloc_info = {};
283 XGL_UINT8 *pData;
284
285 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
286 alloc_info.allocationSize = numVertices * vbStride;
287 alloc_info.alignment = 0;
288 alloc_info.heapCount = 1;
289 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
290
291 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
292 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
293
294 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
295 ASSERT_XGL_SUCCESS(err);
296
297 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
298 ASSERT_XGL_SUCCESS(err);
299
300 memcpy(pData, vertices, alloc_info.allocationSize);
301
302 err = xglUnmapMemory(m_vtxBufferMem);
303 ASSERT_XGL_SUCCESS(err);
304
305 // set up the memory view for the vertex buffer
306 this->m_vtxBufferView.stride = vbStride;
307 this->m_vtxBufferView.range = numVertices * vbStride;
308 this->m_vtxBufferView.offset = 0;
309 this->m_vtxBufferView.mem = m_vtxBufferMem;
310 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
311 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
312
313 // open the command buffer
314 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
315 ASSERT_XGL_SUCCESS(err);
316
317 XGL_MEMORY_STATE_TRANSITION transition = {};
318 transition.mem = m_vtxBufferMem;
319 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
320 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
321 transition.offset = 0;
322 transition.regionSize = numVertices * vbStride;
323
324 // write transition to the command buffer
325 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
326 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
327
328 // finish recording the command buffer
329 err = xglEndCommandBuffer( m_cmdBuffer );
330 ASSERT_XGL_SUCCESS(err);
331
332 // this command buffer only uses the vertex buffer memory
333 m_numMemRefs = 1;
334 m_memRefs[0].flags = 0;
335 m_memRefs[0].mem = m_vtxBufferMem;
336
337 // submit the command buffer to the universal queue
338 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
339 ASSERT_XGL_SUCCESS(err);
340}
341
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600342// this function will create the vertex buffer and fill it with the mesh data
343void XglRenderTest::UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
344 const void* vertices )
345{
346 XGL_UINT8 *pData;
347 XGL_RESULT err = XGL_SUCCESS;
348
349 assert( numVertices * vbStride > 0 );
350 m_numVertices = numVertices;
351
352 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
353 ASSERT_XGL_SUCCESS(err);
354
355 memcpy(pData, vertices, numVertices * vbStride);
356
357 err = xglUnmapMemory(m_vtxBufferMem);
358 ASSERT_XGL_SUCCESS(err);
359}
360
Cody Northrop350727b2014-10-06 15:42:00 -0600361void XglRenderTest::InitTexture()
362{
Cody Northrop904742c2014-10-07 16:25:00 -0600363#define DEMO_TEXTURE_COUNT 1
364
365 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
366 const XGL_INT tex_width = 16;
367 const XGL_INT tex_height = 16;
368 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
369 { 0xffff0000, 0xff00ff00 },
370 };
Cody Northrop350727b2014-10-06 15:42:00 -0600371 XGL_RESULT err;
Cody Northrop904742c2014-10-07 16:25:00 -0600372 XGL_UINT i;
Cody Northrop350727b2014-10-06 15:42:00 -0600373
Cody Northrop904742c2014-10-07 16:25:00 -0600374 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
375 const XGL_SAMPLER_CREATE_INFO sampler = {
376 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
377 .pNext = NULL,
378 .magFilter = XGL_TEX_FILTER_NEAREST,
379 .minFilter = XGL_TEX_FILTER_NEAREST,
380 .mipMode = XGL_TEX_MIPMAP_BASE,
381 .addressU = XGL_TEX_ADDRESS_WRAP,
382 .addressV = XGL_TEX_ADDRESS_WRAP,
383 .addressW = XGL_TEX_ADDRESS_WRAP,
384 .mipLodBias = 0.0f,
385 .maxAnisotropy = 0,
386 .compareFunc = XGL_COMPARE_NEVER,
387 .minLod = 0.0f,
388 .maxLod = 0.0f,
389 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
390 };
391 const XGL_IMAGE_CREATE_INFO image = {
392 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
393 .pNext = NULL,
394 .imageType = XGL_IMAGE_2D,
395 .format = tex_format,
396 .extent = { tex_width, tex_height, 1 },
397 .mipLevels = 1,
398 .arraySize = 1,
399 .samples = 1,
400 .tiling = XGL_LINEAR_TILING,
401 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
402 .flags = 0,
403 };
404 XGL_MEMORY_ALLOC_INFO mem_alloc;
405 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
406 mem_alloc.pNext = NULL;
407 mem_alloc.allocationSize = 0;
408 mem_alloc.alignment = 0;
409 mem_alloc.flags = 0;
410 mem_alloc.heapCount = 0;
411 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
412 XGL_IMAGE_VIEW_CREATE_INFO view;
413 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
414 view.pNext = NULL;
415 view.image = XGL_NULL_HANDLE;
416 view.viewType = XGL_IMAGE_VIEW_2D;
417 view.format = image.format;
418 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
419 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
420 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
421 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
422 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
423 view.subresourceRange.baseMipLevel = 0;
424 view.subresourceRange.mipLevels = 1;
425 view.subresourceRange.baseArraySlice = 0;
426 view.subresourceRange.arraySize = 1;
427 view.minLod = 0.0f;
Cody Northrop350727b2014-10-06 15:42:00 -0600428
Cody Northrop904742c2014-10-07 16:25:00 -0600429 XGL_MEMORY_REQUIREMENTS mem_reqs;
430 XGL_SIZE mem_reqs_size;
Cody Northrop350727b2014-10-06 15:42:00 -0600431
Cody Northrop904742c2014-10-07 16:25:00 -0600432 /* create sampler */
433 err = xglCreateSampler(device(), &sampler, &m_sampler);
434 assert(!err);
435
436 /* create image */
437 err = xglCreateImage(device(), &image, &m_texture);
438 assert(!err);
439
440 err = xglGetObjectInfo(m_texture,
441 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
442 &mem_reqs_size, &mem_reqs);
443 assert(!err && mem_reqs_size == sizeof(mem_reqs));
444
445 mem_alloc.allocationSize = mem_reqs.size;
446 mem_alloc.alignment = mem_reqs.alignment;
447 mem_alloc.heapCount = mem_reqs.heapCount;
448 memcpy(mem_alloc.heaps, mem_reqs.heaps,
449 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
450
451 /* allocate memory */
452 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
453 assert(!err);
454
455 /* bind memory */
456 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
457 assert(!err);
458
459 /* create image view */
460 view.image = m_texture;
461 err = xglCreateImageView(device(), &view, &m_textureView);
462 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600463 }
464
Cody Northrop904742c2014-10-07 16:25:00 -0600465 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
466 const XGL_IMAGE_SUBRESOURCE subres = {
467 .aspect = XGL_IMAGE_ASPECT_COLOR,
468 .mipLevel = 0,
469 .arraySlice = 0,
470 };
471 XGL_SUBRESOURCE_LAYOUT layout;
472 XGL_SIZE layout_size;
473 XGL_VOID *data;
474 XGL_INT x, y;
Cody Northrop350727b2014-10-06 15:42:00 -0600475
Cody Northrop904742c2014-10-07 16:25:00 -0600476 err = xglGetImageSubresourceInfo(m_texture, &subres,
477 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
478 assert(!err && layout_size == sizeof(layout));
Cody Northrop350727b2014-10-06 15:42:00 -0600479
Cody Northrop904742c2014-10-07 16:25:00 -0600480 err = xglMapMemory(m_textureMem, 0, &data);
481 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600482
Cody Northrop904742c2014-10-07 16:25:00 -0600483 for (y = 0; y < tex_height; y++) {
484 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
485 for (x = 0; x < tex_width; x++)
486 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
Cody Northrop350727b2014-10-06 15:42:00 -0600487 }
Cody Northrop904742c2014-10-07 16:25:00 -0600488
489 err = xglUnmapMemory(m_textureMem);
490 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600491 }
492
Cody Northrop350727b2014-10-06 15:42:00 -0600493 m_textureViewInfo.view = m_textureView;
494}
495
496void XglRenderTest::InitSampler()
497{
498 XGL_RESULT err;
499
500 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
501 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
502 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
503 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
504 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
505 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
506 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
507 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
508 samplerCreateInfo.mipLodBias = 0.0;
509 samplerCreateInfo.maxAnisotropy = 0.0;
510 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
511 samplerCreateInfo.minLod = 0.0;
512 samplerCreateInfo.maxLod = 0.0;
513 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
514
515 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
516 ASSERT_XGL_SUCCESS(err);
517}
518
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600519void XglRenderTest::DrawRotatedTriangleTest()
520{
521 // TODO : This test will pass a matrix into VS to affect triangle orientation.
522}
523
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600524void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600525{
526 XGL_PIPELINE pipeline;
527 XGL_SHADER vs, ps;
528 XGL_RESULT err;
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600529
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600530 ASSERT_NO_FATAL_FAILURE(InitState());
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600531 ASSERT_NO_FATAL_FAILURE(InitViewport());
532
533 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
534 vertShaderText, &vs));
535
536 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
537 fragShaderText, &ps));
538
539 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600540
541 /*
542 * Shaders are now part of the pipeline, don't need these anymore
543 */
544 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
545 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
546
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600548
Cody Northrop342912c2014-10-01 14:03:25 -0600549 const int constantCount = 4;
550 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
551 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
552
553 // Create descriptor set for a uniform resource
554 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
555 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
556 descriptorInfo.slots = 1;
557
558 // create a descriptor set with a single slot
559 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
560 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
561
562 // bind memory to the descriptor set
563 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
564
565 // write the constant buffer view to the descriptor set
566 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
567 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
568 xglEndDescriptorSetUpdate( m_rsrcDescSet );
569
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600570 // Build command buffer
571 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
572 ASSERT_XGL_SUCCESS(err);
573
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600574 GenerateClearAndPrepareBufferCmds();
575 GenerateBindRenderTargetCmd();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600576 GenerateBindStateAndPipelineCmds(&pipeline);
577
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600578// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
579// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
580
581 // render the cube
582 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
583
584 // prepare the back buffer for present
585// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
586// transitionToPresent.image = m_image;
587// transitionToPresent.oldState = m_image_state;
588// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
589// transitionToPresent.subresourceRange = srRange;
590// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
591// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
592
593 // finalize recording of the command buffer
594 err = xglEndCommandBuffer( m_cmdBuffer );
595 ASSERT_XGL_SUCCESS( err );
596
597 // this command buffer only uses the vertex buffer memory
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700598 m_numMemRefs = 1;
599 m_memRefs[0].flags = 0;
600 m_memRefs[0].mem = m_renderTarget->memory();
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600601// m_memRefs[0].flags = 0;
602// m_memRefs[0].mem = m_vtxBufferMemory;
603
604 // submit the command buffer to the universal queue
605 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
606 ASSERT_XGL_SUCCESS( err );
607
Chia-I Wuf34ac502014-08-27 14:58:05 +0800608 err = xglQueueWaitIdle( m_device->m_queue );
609 ASSERT_XGL_SUCCESS( err );
610
Courtney Goeltzenleuchter68cfe612014-08-26 18:16:41 -0600611 // Wait for work to finish before cleaning up.
612 xglDeviceWaitIdle(m_device->device());
613
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600614 RecordImage(m_renderTarget);
Chia-I Wuf070ec12014-08-30 23:58:36 +0800615
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600616}
617
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600618void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600619{
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600620 XGL_PIPELINE pipeline;
621 XGL_SHADER vs, ps;
622 XGL_RESULT err;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600623
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600624 ASSERT_NO_FATAL_FAILURE(InitState());
625 ASSERT_NO_FATAL_FAILURE(InitViewport());
626
627 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
628 vertShaderText, &vs));
629
630 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
631 fragShaderText, &ps));
632
633 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
634
635 /*
636 * Shaders are now part of the pipeline, don't need these anymore
637 */
638 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
639 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
640
641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
642
643 const int constantCount = 8;
644 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
645 0.0, 0.0, 1.0, 1.0 };
646
647 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
648
649 // Create descriptor set for a uniform resource
650 const int slotCount = 1;
651 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
652 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
653 descriptorInfo.slots = slotCount;
654
655 // create a descriptor set with a single slot
656 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
657 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
658
659 // bind memory to the descriptor set
660 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
661
662 // write the constant buffer view to the descriptor set
663 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
664 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
665 xglEndDescriptorSetUpdate( m_rsrcDescSet );
666
667 // Build command buffer
668 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
669 ASSERT_XGL_SUCCESS(err);
670
671 GenerateClearAndPrepareBufferCmds();
672 GenerateBindRenderTargetCmd();
673 GenerateBindStateAndPipelineCmds(&pipeline);
674
675// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
676// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
677
678 // render the cube
679 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
680
681 // prepare the back buffer for present
682// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
683// transitionToPresent.image = m_image;
684// transitionToPresent.oldState = m_image_state;
685// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
686// transitionToPresent.subresourceRange = srRange;
687// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
688// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
689
690 // finalize recording of the command buffer
691 err = xglEndCommandBuffer( m_cmdBuffer );
692 ASSERT_XGL_SUCCESS( err );
693
694 // this command buffer only uses the vertex buffer memory
695 m_numMemRefs = 0;
696// m_memRefs[0].flags = 0;
697// m_memRefs[0].mem = m_vtxBufferMemory;
698
699 // submit the command buffer to the universal queue
700 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
701 ASSERT_XGL_SUCCESS( err );
702
703 err = xglQueueWaitIdle( m_device->m_queue );
704 ASSERT_XGL_SUCCESS( err );
705
706 // Wait for work to finish before cleaning up.
707 xglDeviceWaitIdle(m_device->device());
708
709 RecordImage(m_renderTarget);
710
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600711}
712
Cody Northrop7a1f0462014-10-10 14:49:36 -0600713
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600714void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText, int numTris)
Cody Northrop7a1f0462014-10-10 14:49:36 -0600715{
716 XGL_PIPELINE pipeline;
717 XGL_SHADER vs, ps;
718 XGL_RESULT err;
719
720 ASSERT_NO_FATAL_FAILURE(InitState());
721 ASSERT_NO_FATAL_FAILURE(InitViewport());
722
723 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
724 vertShaderText, &vs));
725
726 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
727 fragShaderText, &ps));
728
729 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
730
731 /*
732 * Shaders are now part of the pipeline, don't need these anymore
733 */
734 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
735 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
736
737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
738
Cody Northrop7a1f0462014-10-10 14:49:36 -0600739 // Create descriptor set for a uniform resource
740 const int slotCount = 1;
741 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
742 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
743 descriptorInfo.slots = slotCount;
744
745 // create a descriptor set with a single slot
746 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
747 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
748
749 // bind memory to the descriptor set
750 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
751
752 // write the constant buffer view to the descriptor set
753 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
754 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
755 xglEndDescriptorSetUpdate( m_rsrcDescSet );
756
757 // Build command buffer
758 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
759 ASSERT_XGL_SUCCESS(err);
760
761 GenerateClearAndPrepareBufferCmds();
762 GenerateBindRenderTargetCmd();
763 GenerateBindStateAndPipelineCmds(&pipeline);
764
765// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
766// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
767
768 // render the cube
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600769 xglCmdDraw( m_cmdBuffer, 0, numTris*3, 0, 1 );
Cody Northrop7a1f0462014-10-10 14:49:36 -0600770
771 // prepare the back buffer for present
772// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
773// transitionToPresent.image = m_image;
774// transitionToPresent.oldState = m_image_state;
775// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
776// transitionToPresent.subresourceRange = srRange;
777// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
778// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
779
780 // finalize recording of the command buffer
781 err = xglEndCommandBuffer( m_cmdBuffer );
782 ASSERT_XGL_SUCCESS( err );
783
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -0600784 // this command buffer only uses a data buffer for the MVP
785 m_numMemRefs = 1;
786 m_memRefs[0].flags = 0;
787 m_memRefs[0].mem = m_constantBufferMem;
Cody Northrop7a1f0462014-10-10 14:49:36 -0600788
789 // submit the command buffer to the universal queue
790 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
791 ASSERT_XGL_SUCCESS( err );
792
793 err = xglQueueWaitIdle( m_device->m_queue );
794 ASSERT_XGL_SUCCESS( err );
795
796 // Wait for work to finish before cleaning up.
797 xglDeviceWaitIdle(m_device->device());
798
799 RecordImage(m_renderTarget);
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600800}
801
802
803void XglRenderTest::RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model)
804{
805 int i;
806 glm::mat4 MVP;
807 int matrixSize = sizeof(MVP);
808 XGL_RESULT err;
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600809
810 for (i = 0; i < 8; i++) {
811 XGL_UINT8 *pData;
812 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
813 ASSERT_XGL_SUCCESS(err);
814
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -0600815 Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
816 MVP = Projection * View * Model;
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600817 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
818
819 err = xglUnmapMemory(m_constantBufferMem);
820 ASSERT_XGL_SUCCESS(err);
821
822 // submit the command buffer to the universal queue
823 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
824 ASSERT_XGL_SUCCESS( err );
825
826 err = xglQueueWaitIdle( m_device->m_queue );
827 ASSERT_XGL_SUCCESS( err );
828
829 // Wait for work to finish before cleaning up.
830 xglDeviceWaitIdle(m_device->device());
831
832 RecordImage(m_renderTarget);
833 }
Cody Northrop7a1f0462014-10-10 14:49:36 -0600834}
835
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600836void dumpMatrix(const char *note, glm::mat4 MVP)
837{
838 int i,j;
839
840 printf("%s: \n", note);
841 for (i=0; i<4; i++) {
842 printf("%f, %f, %f, %f\n", MVP[i][0], MVP[i][1], MVP[i][2], MVP[i][3]);
843 }
844 printf("\n");
845 fflush(stdout);
846}
847
848void dumpVec4(const char *note, glm::vec4 vector)
849{
850 printf("%s: \n", note);
851 printf("%f, %f, %f, %f\n", vector[0], vector[1], vector[2], vector[3]);
852 printf("\n");
853 fflush(stdout);
854}
855
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600856void XglRenderTest::GenerateClearAndPrepareBufferCmds()
857{
858 XglRenderFramework::GenerateClearAndPrepareBufferCmds();
859
860 if (0) {
861// if (m_depthStencilImage) {
862 XGL_IMAGE_SUBRESOURCE_RANGE dsRange = {};
863 dsRange.aspect = XGL_IMAGE_ASPECT_DEPTH;
864 dsRange.baseMipLevel = 0;
865 dsRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
866 dsRange.baseArraySlice = 0;
867 dsRange.arraySize = XGL_LAST_MIP_OR_SLICE;
868
869 // prepare the depth buffer for clear
870 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
871 transitionToClear.image = m_depthStencilImage;
872 transitionToClear.oldState = m_depthStencilBinding.depthState;
873 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
874 transitionToClear.subresourceRange = dsRange;
875 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
876 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
877
878 xglCmdClearDepthStencil(m_cmdBuffer, m_depthStencilImage, 1.0f, 0, 1, &dsRange);
879
880 // prepare depth buffer for rendering
881 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
882 transitionToRender.image = m_renderTarget->image();
883 transitionToRender.oldState = XGL_IMAGE_STATE_CLEAR;
884 transitionToRender.newState = m_depthStencilBinding.depthState;
885 transitionToRender.subresourceRange = dsRange;
886 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
887 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
888 }
889}
890
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600891void XglRenderTest::DrawTriangleWithVertexFetchAndMVP(const char *vertShaderText, const char *fragShaderText)
892{
893 XGL_PIPELINE pipeline;
894 XGL_SHADER vs, ps;
895 XGL_RESULT err;
896 int i, loop;
897
898 // Projection matrix : 45° Field of View, 1:1 ratio, display range : 0.1 unit <-> 100 units
899 glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
900// dumpMatrix("Projection", Projection);
901
902 // Camera matrix
903 glm::mat4 View = glm::lookAt(
904 glm::vec3(0,3,10), // Camera is at (0,3,10), in World Space
905 glm::vec3(0,0,0), // and looks at the origin
906 glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
907 );
908// dumpMatrix("View", View);
909
910 // Model matrix : an identity matrix (model will be at the origin)
911 glm::mat4 Model = glm::mat4(1.0f);
912// dumpMatrix("Model", Model);
913
914 // Our ModelViewProjection : multiplication of our 3 matrices
915// Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 4.0f));
916// Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
917 glm::mat4 MVP = Projection * View * Model;
918
919 ASSERT_NO_FATAL_FAILURE(InitState());
920 ASSERT_NO_FATAL_FAILURE(InitViewport());
921 ASSERT_NO_FATAL_FAILURE(InitDepthStencil());
922 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]),
923 sizeof(g_vb_solid_face_colors_Data[0]), g_vb_solid_face_colors_Data));
924
925 const int buf_size = sizeof(MVP) / sizeof(XGL_FLOAT);
926
927 InitConstantBuffer(buf_size, sizeof(MVP[0][0]), (const void*) &MVP[0][0]);
928
929 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
930 vertShaderText, &vs));
931
932 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
933 fragShaderText, &ps));
934
935 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetchAndMVP(&pipeline, vs, ps));
936
937 /*
938 * Shaders are now part of the pipeline, don't need these anymore
939 */
940 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
941 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
942
943 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
944
945 // Build command buffer
946 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
947 ASSERT_XGL_SUCCESS(err);
948
949 GenerateClearAndPrepareBufferCmds();
950 ClearDepthStencil(1.0f); // HACK for now
951 GenerateBindRenderTargetCmd();
952 GenerateBindStateAndPipelineCmds(&pipeline);
953
954 // render the cube
955 xglCmdDraw( m_cmdBuffer, 0, 12*3, 0, 1 );
956
957 // prepare the back buffer for present
958// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
959// transitionToPresent.image = m_image;
960// transitionToPresent.oldState = m_image_state;
961// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
962// transitionToPresent.subresourceRange = srRange;
963// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
964// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
965
966 // finalize recording of the command buffer
967 err = xglEndCommandBuffer( m_cmdBuffer );
968 ASSERT_XGL_SUCCESS( err );
969
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -0600970 // this command buffer uses the vertex buffer memory and a data buffer (for MVP)
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600971 m_numMemRefs = 2;
972 m_memRefs[0].flags = 0;
973 m_memRefs[0].mem = m_vtxBufferMem;
974 m_memRefs[1].flags = 0;
975 m_memRefs[1].mem = m_constantBufferMem;
976
977 // submit the command buffer to the universal queue
978 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
979 ASSERT_XGL_SUCCESS( err );
980
981 err = xglQueueWaitIdle( m_device->m_queue );
982 ASSERT_XGL_SUCCESS( err );
983
984 // Wait for work to finish before cleaning up.
985 xglDeviceWaitIdle(m_device->device());
986
987 RecordImage(m_renderTarget);
988
989 for (loop = 0; loop < 16; loop++) {
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600990// ClearRenderBuffer(0x80); // HACK
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600991 ClearDepthStencil(1.0f); // HACK for now
992
993 // TODO: Do we need to transition the constant buffer?
994 XGL_UINT8 *pData;
995 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
996 ASSERT_XGL_SUCCESS(err);
997
998 Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600999// dumpMatrix("Model", Model);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001000 glm::mat4 MVP = Projection * View * Model;
1001// dumpMatrix("MVP", MVP);
1002
1003 memcpy(pData, (const void*) &MVP[0][0], buf_size * sizeof(XGL_FLOAT));
1004
1005 err = xglUnmapMemory(m_constantBufferMem);
1006 ASSERT_XGL_SUCCESS(err);
1007
1008 // submit the command buffer to the universal queue
1009 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1010 ASSERT_XGL_SUCCESS( err );
1011
1012 err = xglQueueWaitIdle( m_device->m_queue );
1013 ASSERT_XGL_SUCCESS( err );
1014
1015 // Wait for work to finish before cleaning up.
1016 xglDeviceWaitIdle(m_device->device());
1017
1018 RecordImage(m_renderTarget);
1019 }
1020}
1021
Cody Northrop4e6b4762014-10-09 21:25:22 -06001022void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1023{
1024 XGL_RESULT err;
1025 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1026 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1027 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1028
1029
1030 // Create descriptor set for our one resource
1031 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1032 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1033 descriptorInfo.slots = 1; // Vertex buffer only
1034
1035 // create a descriptor set with a single slot
1036 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1037 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1038
1039 // bind memory to the descriptor set
1040 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1041
1042 // write the vertex buffer view to the descriptor set
1043 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1044 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
1045 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1046
1047 const int slots = 1;
1048 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1049 slotInfo[0].shaderEntityIndex = 0;
1050 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
1051
1052 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1053 vs_stage.pNext = XGL_NULL_HANDLE;
1054 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1055 vs_stage.shader.shader = vs;
1056 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1057 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1058 vs_stage.shader.linkConstBufferCount = 0;
1059 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1060 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1061 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1062
1063 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1064 ps_stage.pNext = &vs_stage;
1065 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1066 ps_stage.shader.shader = ps;
1067 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1068 ps_stage.shader.linkConstBufferCount = 0;
1069 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1070 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1071 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1072
1073 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1074 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1075 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1076 };
1077
1078 // this is the current description of g_vbData
1079 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1080 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1081 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1082 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1083 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1084 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1085 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1086 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1087 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1088
1089 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
1090 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
1091 &ps_stage, // pNext;
1092 1, // bindingCount
1093 &vi_binding, // pVertexBindingDescriptions;
1094 2, // attributeCount; // number of attributes
1095 vi_attribs // pVertexAttributeDescriptions;
1096 };
1097
1098 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1099 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1100 &vi_state, // pNext
1101 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1102 XGL_FALSE, // disableVertexReuse
1103 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1104 XGL_FALSE, // primitiveRestartEnable
1105 0 // primitiveRestartIndex
1106 };
1107
1108 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1109 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1110 &ia_state,
1111 XGL_FALSE, // depthClipEnable
1112 XGL_FALSE, // rasterizerDiscardEnable
1113 1.0 // pointSize
1114 };
1115
1116 XGL_PIPELINE_CB_STATE cb_state = {
1117 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1118 &rs_state,
1119 XGL_FALSE, // alphaToCoverageEnable
1120 XGL_FALSE, // dualSourceBlendEnable
1121 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1122 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1123 {
1124 XGL_FALSE, // blendEnable
1125 m_render_target_fmt, // XGL_FORMAT
1126 0xF // channelWriteMask
1127 }
1128 }
1129 };
1130
1131 // TODO: Should take depth buffer format from queried formats
1132 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1133 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1134 &cb_state,
1135 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1136 };
1137
1138 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1139 info.pNext = &db_state;
1140 info.flags = 0;
1141 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1142 ASSERT_XGL_SUCCESS(err);
1143
1144 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1145 ASSERT_XGL_SUCCESS(err);
1146}
1147
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001148/*
1149 * Based on CreatePipelineWithVertexFetch and CreatePipelineVSUniform
1150 */
1151void XglRenderTest::CreatePipelineWithVertexFetchAndMVP(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1152{
1153 XGL_RESULT err;
1154 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1155 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1156 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1157
1158 // Create descriptor set for our two resources
1159 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1160 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1161 descriptorInfo.slots = 2; // Vertex buffer and Model View Matrix
1162
1163 // create a descriptor set with a single slot
1164 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1165 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1166
1167 // bind memory to the descriptor set
1168 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1169
1170 // write the vertex buffer view to the descriptor set
1171 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1172 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
1173 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 1, 1, &m_constantBufferView );
1174 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1175
1176 const int slots = 2;
1177 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1178 slotInfo[0].shaderEntityIndex = 0;
1179 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
1180 slotInfo[1].shaderEntityIndex = 0;
1181 slotInfo[1].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1182
1183 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1184 vs_stage.pNext = XGL_NULL_HANDLE;
1185 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1186 vs_stage.shader.shader = vs;
1187 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1188 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1189 vs_stage.shader.linkConstBufferCount = 0;
1190 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1191 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1192 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1193
1194 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1195 ps_stage.pNext = &vs_stage;
1196 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1197 ps_stage.shader.shader = ps;
1198 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1199 ps_stage.shader.linkConstBufferCount = 0;
1200 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1201 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1202 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1203
1204 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1205 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1206 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1207 };
1208
1209 // this is the current description of g_vbData
1210 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1211 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1212 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1213 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1214 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1215 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1216 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1217 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1218 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1219
1220 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
1221 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
1222 &ps_stage, // pNext;
1223 1, // bindingCount
1224 &vi_binding, // pVertexBindingDescriptions;
1225 2, // attributeCount; // number of attributes
1226 vi_attribs // pVertexAttributeDescriptions;
1227 };
1228
1229 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1230 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1231 &vi_state, // pNext
1232 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1233 XGL_FALSE, // disableVertexReuse
1234 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1235 XGL_FALSE, // primitiveRestartEnable
1236 0 // primitiveRestartIndex
1237 };
1238
1239 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1240 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1241 &ia_state,
1242 XGL_FALSE, // depthClipEnable
1243 XGL_FALSE, // rasterizerDiscardEnable
1244 1.0 // pointSize
1245 };
1246
1247 XGL_PIPELINE_CB_STATE cb_state = {
1248 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1249 &rs_state,
1250 XGL_FALSE, // alphaToCoverageEnable
1251 XGL_FALSE, // dualSourceBlendEnable
1252 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1253 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1254 {
1255 XGL_FALSE, // blendEnable
1256 m_render_target_fmt, // XGL_FORMAT
1257 0xF // channelWriteMask
1258 }
1259 }
1260 };
1261
1262 // TODO: Should take depth buffer format from queried formats
1263 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1264 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1265 &cb_state,
1266 m_depth_stencil_fmt // XGL_FORMAT
1267 };
1268
1269 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1270 info.pNext = &db_state;
1271 info.flags = 0;
1272 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1273 ASSERT_XGL_SUCCESS(err);
1274
1275 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1276 ASSERT_XGL_SUCCESS(err);
1277}
1278
Cody Northrop7a1f0462014-10-10 14:49:36 -06001279void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1280{
1281 XGL_RESULT err;
1282 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1283 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1284 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1285
1286
1287 const int vsSlots = 1; // Uniform buffer only
1288
1289 // Create descriptor set for our one resource
1290 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1291 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1292 descriptorInfo.slots = vsSlots;
1293
1294 // create a descriptor set with a single slot
1295 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1296 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1297
1298 // bind memory to the descriptor set
1299 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1300
1301
1302 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1303 slotInfo[0].shaderEntityIndex = 0;
1304 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1305
1306 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1307 vs_stage.pNext = XGL_NULL_HANDLE;
1308 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1309 vs_stage.shader.shader = vs;
1310 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1311 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
1312 vs_stage.shader.linkConstBufferCount = 0;
1313 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1314 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1315 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1316
1317 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1318 ps_stage.pNext = &vs_stage;
1319 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1320 ps_stage.shader.shader = ps;
1321 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1322 ps_stage.shader.linkConstBufferCount = 0;
1323 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1324 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1325 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1326
1327 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1328 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1329 &ps_stage, // pNext
1330 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1331 XGL_FALSE, // disableVertexReuse
1332 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1333 XGL_FALSE, // primitiveRestartEnable
1334 0 // primitiveRestartIndex
1335 };
1336
1337 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1338 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1339 &ia_state,
1340 XGL_FALSE, // depthClipEnable
1341 XGL_FALSE, // rasterizerDiscardEnable
1342 1.0 // pointSize
1343 };
1344
1345 XGL_PIPELINE_CB_STATE cb_state = {
1346 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1347 &rs_state,
1348 XGL_FALSE, // alphaToCoverageEnable
1349 XGL_FALSE, // dualSourceBlendEnable
1350 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1351 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1352 {
1353 XGL_FALSE, // blendEnable
1354 m_render_target_fmt, // XGL_FORMAT
1355 0xF // channelWriteMask
1356 }
1357 }
1358 };
1359
1360 // TODO: Should take depth buffer format from queried formats
1361 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1362 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1363 &cb_state,
1364 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1365 };
1366
1367 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1368 info.pNext = &db_state;
1369 info.flags = 0;
1370 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1371 ASSERT_XGL_SUCCESS(err);
1372
1373 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1374 ASSERT_XGL_SUCCESS(err);
1375}
1376
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001377void XglRenderTest::ClearDepthStencil(XGL_FLOAT value)
1378/* clear the buffer */
1379{
1380 XGL_RESULT err;
1381 const uint16_t depth_value = (uint16_t) (value * 65535);
1382 const XGL_INT tw = 128 / sizeof(uint16_t);
1383 const XGL_INT th = 32;
1384 XGL_INT i, j, w, h;
1385 XGL_VOID *data;
1386
1387 w = (m_width + tw - 1) / tw;
1388 h = (m_height + th - 1) / th;
1389
1390 err = xglMapMemory(m_depthStencilMem, 0, &data);
1391 ASSERT_XGL_SUCCESS(err);
1392
1393 for (i = 0; i < w * h; i++) {
1394 uint16_t *tile = (uint16_t *) ((char *) data + 4096 * i);
1395
1396 for (j = 0; j < 2048; j++)
1397 tile[j] = depth_value;
1398 }
1399
1400 err = xglUnmapMemory(m_depthStencilMem);
1401 ASSERT_XGL_SUCCESS(err);
1402}
1403
1404void XglRenderTest::ClearRenderBuffer(XGL_UINT32 clear_color)
1405/* clear the buffer */
1406{
1407 XGL_RESULT err;
1408 const XGL_IMAGE_SUBRESOURCE sr = {
1409 XGL_IMAGE_ASPECT_COLOR, 0, 0
1410 };
1411 XGL_SUBRESOURCE_LAYOUT sr_layout;
1412 XGL_UINT data_size = sizeof(sr_layout);
1413 XGL_VOID *ptr;
1414
1415 err = xglGetImageSubresourceInfo( m_renderTarget->image(),
1416 &sr, XGL_INFO_TYPE_SUBRESOURCE_LAYOUT,
1417 &data_size, &sr_layout);
1418 ASSERT_XGL_SUCCESS( err );
1419 ASSERT_EQ(data_size, sizeof(sr_layout));
1420
1421 err = m_renderTarget->MapMemory( &ptr );
1422 ASSERT_XGL_SUCCESS( err );
1423
1424 ptr = (void *) ((char *) ptr + sr_layout.offset);
1425
1426 memset(ptr, clear_color, m_width * m_height *sizeof(XGL_UINT32));
1427
1428 err = m_renderTarget->UnmapMemory();
1429 ASSERT_XGL_SUCCESS(err);
1430}
1431
1432void XglRenderTest::InitDepthStencil()
1433{
1434 XGL_RESULT err;
1435 XGL_IMAGE_CREATE_INFO image;
1436 XGL_MEMORY_ALLOC_INFO mem_alloc;
1437 XGL_DEPTH_STENCIL_VIEW_CREATE_INFO view;
1438 XGL_MEMORY_REQUIREMENTS mem_reqs;
1439 XGL_SIZE mem_reqs_size;
1440
1441 // Clean up default state created by framework
1442 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
1443
1444 m_depth_stencil_fmt.channelFormat = XGL_CH_FMT_R16;
1445 m_depth_stencil_fmt.numericFormat = XGL_NUM_FMT_DS;
1446
1447 image.sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1448 image.pNext = NULL;
1449 image.imageType = XGL_IMAGE_2D;
1450 image.format = m_depth_stencil_fmt;
1451 image.extent.width = m_width;
1452 image.extent.height = m_height;
1453 image.extent.depth = 1;
1454 image.mipLevels = 1;
1455 image.arraySize = 1;
1456 image.samples = 1;
1457 image.tiling = XGL_OPTIMAL_TILING;
1458 image.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT;
1459 image.flags = 0;
1460
1461 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1462 mem_alloc.pNext = NULL;
1463 mem_alloc.allocationSize = 0;
1464 mem_alloc.alignment = 0;
1465 mem_alloc.flags = 0;
1466 mem_alloc.heapCount = 0;
1467 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
1468
1469 /* create image */
1470 err = xglCreateImage(device(), &image,
1471 &m_depthStencilImage);
1472 ASSERT_XGL_SUCCESS(err);
1473
1474 err = xglGetObjectInfo(m_depthStencilImage,
1475 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
1476 &mem_reqs_size, &mem_reqs);
1477 ASSERT_XGL_SUCCESS(err);
1478 ASSERT_EQ(mem_reqs_size, sizeof(mem_reqs));
1479
1480 mem_alloc.allocationSize = mem_reqs.size;
1481 mem_alloc.alignment = mem_reqs.alignment;
1482 mem_alloc.heapCount = mem_reqs.heapCount;
1483 memcpy(mem_alloc.heaps, mem_reqs.heaps,
1484 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
1485
1486 /* allocate memory */
1487 err = xglAllocMemory(device(), &mem_alloc, &m_depthStencilMem);
1488 ASSERT_XGL_SUCCESS(err);
1489
1490 /* bind memory */
1491 err = xglBindObjectMemory(m_depthStencilImage, m_depthStencilMem, 0);
1492 ASSERT_XGL_SUCCESS(err);
1493
1494 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depthStencil = {};
1495 depthStencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
1496 depthStencil.depthTestEnable = XGL_TRUE;
1497 depthStencil.depthWriteEnable = XGL_TRUE;
1498 depthStencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
1499 depthStencil.depthBoundsEnable = XGL_FALSE;
1500 depthStencil.minDepth = 0.f;
1501 depthStencil.maxDepth = 1.f;
1502 depthStencil.back.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
1503 depthStencil.back.stencilFailOp = XGL_STENCIL_OP_KEEP;
1504 depthStencil.back.stencilPassOp = XGL_STENCIL_OP_KEEP;
1505 depthStencil.back.stencilRef = 0x00;
1506 depthStencil.back.stencilFunc = XGL_COMPARE_ALWAYS;
1507 depthStencil.front = depthStencil.back;
1508
1509 err = xglCreateDepthStencilState( device(), &depthStencil, &m_stateDepthStencil );
1510 ASSERT_XGL_SUCCESS( err );
1511
1512 /* create image view */
1513 view.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
1514 view.pNext = NULL;
1515 view.image = XGL_NULL_HANDLE;
1516 view.mipLevel = 0;
1517 view.baseArraySlice = 0;
1518 view.arraySize = 1;
1519 view.flags = 0;
1520 view.image = m_depthStencilImage;
1521 err = xglCreateDepthStencilView(device(), &view, &m_depthStencilView);
1522 ASSERT_XGL_SUCCESS(err);
1523
1524 m_depthStencilBinding.view = m_depthStencilView;
1525 m_depthStencilBinding.depthState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1526 m_depthStencilBinding.stencilState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1527}
1528
Cody Northrop4e6b4762014-10-09 21:25:22 -06001529void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
1530{
1531 XGL_PIPELINE pipeline;
1532 XGL_SHADER vs, ps;
1533 XGL_RESULT err;
1534
1535 ASSERT_NO_FATAL_FAILURE(InitState());
1536 ASSERT_NO_FATAL_FAILURE(InitViewport());
1537 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
1538
1539 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1540 vertShaderText, &vs));
1541
1542 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1543 fragShaderText, &ps));
1544
1545 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
1546
1547 /*
1548 * Shaders are now part of the pipeline, don't need these anymore
1549 */
1550 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1551 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1552
1553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1554
1555 // Build command buffer
1556 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1557 ASSERT_XGL_SUCCESS(err);
1558
1559 GenerateClearAndPrepareBufferCmds();
1560 GenerateBindRenderTargetCmd();
1561 GenerateBindStateAndPipelineCmds(&pipeline);
1562
1563// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1564// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1565
1566 // render the cube
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001567 xglCmdDraw( m_cmdBuffer, 0, 12*3, 0, 1 );
Cody Northrop4e6b4762014-10-09 21:25:22 -06001568
1569 // prepare the back buffer for present
1570// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1571// transitionToPresent.image = m_image;
1572// transitionToPresent.oldState = m_image_state;
1573// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1574// transitionToPresent.subresourceRange = srRange;
1575// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1576// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1577
1578 // finalize recording of the command buffer
1579 err = xglEndCommandBuffer( m_cmdBuffer );
1580 ASSERT_XGL_SUCCESS( err );
1581
1582 // this command buffer only uses the vertex buffer memory
1583 m_numMemRefs = 0;
1584// m_memRefs[0].flags = 0;
1585// m_memRefs[0].mem = m_vtxBufferMemory;
1586
1587 // submit the command buffer to the universal queue
1588 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1589 ASSERT_XGL_SUCCESS( err );
1590
1591 err = xglQueueWaitIdle( m_device->m_queue );
1592 ASSERT_XGL_SUCCESS( err );
1593
1594 // Wait for work to finish before cleaning up.
1595 xglDeviceWaitIdle(m_device->device());
1596
1597 RecordImage(m_renderTarget);
1598
1599}
1600
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -06001601struct xgltriangle_vs_uniform {
1602 // Must start with MVP
1603 XGL_FLOAT mvp[4][4];
1604 XGL_FLOAT position[3][4];
1605 XGL_FLOAT color[3][4];
1606};
1607
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -06001608void XglRenderTest::XGLTriangleTest(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -06001609{
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001610#ifdef DEBUG_CALLBACK
1611 xglDbgRegisterMsgCallback(myDbgFunc, NULL);
1612#endif
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -06001613 // Create identity matrix
1614 int i;
1615 struct xgltriangle_vs_uniform data;
1616
1617 glm::mat4 Projection = glm::mat4(1.0f);
1618 glm::mat4 View = glm::mat4(1.0f);
1619 glm::mat4 Model = glm::mat4(1.0f);
1620 glm::mat4 MVP = Projection * View * Model;
1621 const int matrixSize = sizeof(MVP);
1622 const int bufSize = sizeof(xgltriangle_vs_uniform) / sizeof(XGL_FLOAT);
1623 memcpy(&data.mvp, &MVP[0][0], matrixSize);
1624
1625 static const Vertex tri_data[] =
1626 {
1627 { XYZ1( -1, -1, 0 ), XYZ1( 1.f, 0.f, 0.f ) },
1628 { XYZ1( 1, -1, 0 ), XYZ1( 0.f, 1.f, 0.f ) },
1629 { XYZ1( 0, 1, 0 ), XYZ1( 0.f, 0.f, 1.f ) },
1630 };
1631
1632 for (i=0; i<3; i++) {
1633 data.position[i][0] = tri_data[i].posX;
1634 data.position[i][1] = tri_data[i].posY;
1635 data.position[i][2] = tri_data[i].posZ;
1636 data.position[i][3] = tri_data[i].posW;
1637 data.color[i][0] = tri_data[i].r;
1638 data.color[i][1] = tri_data[i].g;
1639 data.color[i][2] = tri_data[i].b;
1640 data.color[i][3] = tri_data[i].a;
1641 }
1642
Courtney Goeltzenleuchter05a80a72014-10-31 14:16:09 -06001643 InitConstantBuffer(bufSize, sizeof(XGL_FLOAT), (const void*) &data);
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -06001644
1645 DrawTriangleVSUniform(vertShaderText, fragShaderText, 1);
1646 RotateTriangleVSUniform(Projection, View, Model);
1647}
1648
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -06001649TEST_F(XglRenderTest, XGLTriangle_FragColor)
1650{
1651 static const char *vertShaderText =
1652 "#version 140\n"
1653 "#extension GL_ARB_separate_shader_objects : enable\n"
1654 "#extension GL_ARB_shading_language_420pack : enable\n"
1655 "\n"
1656 "layout(binding = 0) uniform buf {\n"
1657 " mat4 MVP;\n"
1658 " vec4 position[3];\n"
1659 " vec4 color[3];\n"
1660 "} ubuf;\n"
1661 "\n"
1662 "layout (location = 0) out vec4 outColor;\n"
1663 "\n"
1664 "void main() \n"
1665 "{\n"
1666 " outColor = ubuf.color[gl_VertexID];\n"
1667 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
1668 "}\n";
1669
1670 static const char *fragShaderText =
1671 "#version 140\n"
1672 "#extension GL_ARB_separate_shader_objects : enable\n"
1673 "#extension GL_ARB_shading_language_420pack : enable\n"
1674 "\n"
1675 "layout (location = 0) in vec4 inColor;\n"
1676 "\n"
1677 "void main()\n"
1678 "{\n"
1679 " gl_FragColor = inColor;\n"
1680 "}\n";
1681
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -06001682 TEST_DESCRIPTION("XGL-style shaders where fragment shader outputs to GLSL built-in gl_FragColor");
Courtney Goeltzenleuchter6acb8022014-10-27 13:08:55 -06001683 XGLTriangleTest(vertShaderText, fragShaderText);
1684}
1685
1686TEST_F(XglRenderTest, XGLTriangle_OutputLocation)
1687{
1688 static const char *vertShaderText =
1689 "#version 140\n"
1690 "#extension GL_ARB_separate_shader_objects : enable\n"
1691 "#extension GL_ARB_shading_language_420pack : enable\n"
1692 "\n"
1693 "layout(binding = 0) uniform buf {\n"
1694 " mat4 MVP;\n"
1695 " vec4 position[3];\n"
1696 " vec4 color[3];\n"
1697 "} ubuf;\n"
1698 "\n"
1699 "layout (location = 0) out vec4 outColor;\n"
1700 "\n"
1701 "void main() \n"
1702 "{\n"
1703 " outColor = ubuf.color[gl_VertexID];\n"
1704 " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
1705 "}\n";
1706
1707 static const char *fragShaderText =
1708 "#version 140\n"
1709 "#extension GL_ARB_separate_shader_objects : enable\n"
1710 "#extension GL_ARB_shading_language_420pack : enable\n"
1711 "\n"
1712 "layout (location = 0) in vec4 inColor;\n"
1713 "layout (location = 0) out vec4 outColor;\n"
1714 "\n"
1715 "void main()\n"
1716 "{\n"
1717 " outColor = inColor;\n"
1718 "}\n";
1719
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -06001720 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 -06001721
1722 XGLTriangleTest(vertShaderText, fragShaderText);
1723}
1724
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001725TEST_F(XglRenderTest, GreenTriangle)
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001726{
1727 static const char *vertShaderText =
1728 "#version 130\n"
1729 "vec2 vertices[3];\n"
1730 "void main() {\n"
1731 " vertices[0] = vec2(-1.0, -1.0);\n"
1732 " vertices[1] = vec2( 1.0, -1.0);\n"
1733 " vertices[2] = vec2( 0.0, 1.0);\n"
1734 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1735 "}\n";
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -06001736
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001737 static const char *fragShaderText =
1738 "#version 130\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001739 "void main() {\n"
Steve K10b32512014-10-10 08:54:29 -06001740 " gl_FragColor = vec4(0,1,0,1);\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001741 "}\n";
Courtney Goeltzenleuchter7bbb4202014-10-24 16:26:12 -06001742
Courtney Goeltzenleuchtereab90102014-10-27 13:09:23 -06001743 TEST_DESCRIPTION("Basic shader that renders a fixed Green triangle coded as part of the vertex shader.");
1744
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001745 DrawTriangleTest(vertShaderText, fragShaderText);
1746}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001747
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001748TEST_F(XglRenderTest, RotatedTriangle) {
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001749 DrawRotatedTriangleTest();
1750}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001751
Cody Northrop4e6b4762014-10-09 21:25:22 -06001752
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001753TEST_F(XglRenderTest, TriangleWithVertexFetch)
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001754{
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -06001755 static const char *vertShaderText =
Courtney Goeltzenleuchter05a80a72014-10-31 14:16:09 -06001756 "#version 140\n"
1757 "#extension GL_ARB_separate_shader_objects : enable\n"
1758 "#extension GL_ARB_shading_language_420pack : enable\n"
1759 "layout(location = 0) in vec4 pos;\n"
1760 "layout(location = 1) in vec4 inColor;\n"
1761 "layout(location = 0) out vec4 outColor;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001762 "void main() {\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001763 " outColor = inColor;\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001764 " gl_Position = pos;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001765 "}\n";
1766
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001767
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001768 static const char *fragShaderText =
Courtney Goeltzenleuchter05a80a72014-10-31 14:16:09 -06001769 "#version 140\n"
1770 "#extension GL_ARB_separate_shader_objects : enable\n"
1771 "#extension GL_ARB_shading_language_420pack : enable\n"
1772 "layout(location = 0) in vec4 color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001773 "void main() {\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001774 " gl_FragColor = color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001775 "}\n";
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001776
Cody Northrop4e6b4762014-10-09 21:25:22 -06001777 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
Tobin Ehlis34e0e442014-10-07 14:41:29 -06001778}
1779
Courtney Goeltzenleuchter3d10c9c2014-10-27 13:06:08 -06001780TEST_F(XglRenderTest, TriangleVSUniform)
Cody Northrop7a1f0462014-10-10 14:49:36 -06001781{
1782 static const char *vertShaderText =
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001783 "#version 140\n"
1784 "#extension GL_ARB_separate_shader_objects : enable\n"
1785 "#extension GL_ARB_shading_language_420pack : enable\n"
1786 "\n"
1787 "layout(binding = 0) uniform buf {\n"
1788 " mat4 MVP;\n"
1789 "} ubuf;\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001790 "void main() {\n"
1791 " vec2 vertices[3];"
1792 " vertices[0] = vec2(-0.5, -0.5);\n"
1793 " vertices[1] = vec2( 0.5, -0.5);\n"
1794 " vertices[2] = vec2( 0.5, 0.5);\n"
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001795 " gl_Position = ubuf.MVP * vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001796 "}\n";
1797
1798 static const char *fragShaderText =
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001799 "#version 130\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001800 "void main() {\n"
Cody Northrop78eac042014-10-10 15:45:00 -06001801 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001802 "}\n";
1803
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -06001804 // Create identity matrix
Courtney Goeltzenleuchterc3f4ac82014-10-27 09:48:52 -06001805 glm::mat4 Projection = glm::mat4(1.0f);
1806 glm::mat4 View = glm::mat4(1.0f);
1807 glm::mat4 Model = glm::mat4(1.0f);
1808 glm::mat4 MVP = Projection * View * Model;
1809 const int matrixSize = sizeof(MVP) / sizeof(MVP[0]);
1810
1811 InitConstantBuffer(matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
1812
1813 DrawTriangleVSUniform(vertShaderText, fragShaderText, 1);
1814 RotateTriangleVSUniform(Projection, View, Model);
1815}
1816
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001817TEST_F(XglRenderTest, TriangleWithVertexFetchAndMVP)
1818{
1819 static const char *vertShaderText =
1820 "#version 140\n"
1821 "layout (std140) uniform bufferVals {\n"
1822 " mat4 mvp;\n"
1823 "} myBufferVals;\n"
1824 "in vec4 pos;\n"
1825 "in vec4 inColor;\n"
1826 "out vec4 outColor;\n"
1827 "void main() {\n"
1828 " outColor = inColor;\n"
1829 " gl_Position = myBufferVals.mvp * pos;\n"
1830 "}\n";
1831
1832 static const char *fragShaderText =
1833 "#version 130\n"
1834 "in vec4 color;\n"
1835 "void main() {\n"
1836 " gl_FragColor = color;\n"
1837 "}\n";
1838
1839 DrawTriangleWithVertexFetchAndMVP(vertShaderText, fragShaderText);
1840}
1841
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001842int main(int argc, char **argv) {
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001843 int result;
1844
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001845 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001846 XglTestFramework::InitArgs(&argc, argv);
1847
Courtney Goeltzenleuchterf12c7762014-10-08 08:46:51 -06001848 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
1849
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001850 result = RUN_ALL_TESTS();
1851
1852 XglTestFramework::Finish();
1853 return result;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001854}