blob: 8af8c8efd3dd2bf3f1abec4d42bc630df0de9465 [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>
64#include "gtest-1.7.0/include/gtest/gtest.h"
65
66#include "xgldevice.h"
Courtney Goeltzenleuchter04814f82014-09-01 16:37:18 -060067#include "xglimage.h"
Chia-I Wu4115c892014-08-28 11:56:29 +080068#include "icd-bil.h"
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -060069
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -060070#define GLM_FORCE_RADIANS
71#include "glm/glm.hpp"
72#include <glm/gtc/matrix_transform.hpp>
73
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -060074#include "xglrenderframework.h"
Courtney Goeltzenleuchter2268d1e2014-09-01 13:57:15 -060075
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -060076#undef ASSERT_NO_FATAL_FAILURE
77#define ASSERT_NO_FATAL_FAILURE(x) x
78
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -060079//--------------------------------------------------------------------------------------
80// Mesh and VertexFormat Data
81//--------------------------------------------------------------------------------------
82struct Vertex
83{
84 XGL_FLOAT posX, posY, posZ, posW; // Position data
85 XGL_FLOAT r, g, b, a; // Color
86};
87
88#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
89
90static const Vertex g_vbData[] =
91{
92 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
93 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
94 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
95 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
96 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
97 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
98
99 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
100 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
101 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
102 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
103 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
104 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
105
106 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
107 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
108 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
109 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
110 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
111 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
112
113 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
114 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
115 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
116 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
117 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
118 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
119
120 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 1.f, 1.f ) },
121 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
122 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
123 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
124 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
125 { XYZ1( -1, 1, -1 ), XYZ1( 0.f, 1.f, 0.f ) },
126
127 { XYZ1( 1, -1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
128 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
129 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
130 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
131 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
132 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 0.f, 0.f ) },
133};
134
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600135static const Vertex g_vb_solid_face_colors_Data[] =
136{
137 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
138 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
139 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
140 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
141 { XYZ1( 1, -1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
142 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 0.f ) },
143
144 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
145 { XYZ1( -1, 1, 1 ), XYZ1( 0.f, 1.f, 0.f ) },
146 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 0.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, 1.f, 0.f ) },
150
151 { XYZ1( 1, 1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
152 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
153 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
154 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 0.f, 1.f ) },
155 { XYZ1( 1, 1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
156 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 0.f, 1.f ) },
157
158 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
159 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
160 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
161 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
162 { XYZ1( -1, -1, 1 ), XYZ1( 1.f, 1.f, 0.f ) },
163 { XYZ1( -1, -1, -1 ), XYZ1( 1.f, 1.f, 0.f ) },
164
165 { XYZ1( 1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
166 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
167 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
168 { XYZ1( 1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
169 { XYZ1( -1, 1, 1 ), XYZ1( 1.f, 0.f, 1.f ) },
170 { XYZ1( -1, 1, -1 ), XYZ1( 1.f, 0.f, 1.f ) },
171
172 { XYZ1( 1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
173 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
174 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
175 { XYZ1( -1, -1, 1 ), XYZ1( 0.f, 1.f, 1.f ) },
176 { XYZ1( 1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
177 { XYZ1( -1, -1, -1 ), XYZ1( 0.f, 1.f, 1.f ) },
178};
179
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600180class XglRenderTest : public XglRenderFramework
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -0600181{
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600182public:
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600183 void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600184 void UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
Cody Northrop350727b2014-10-06 15:42:00 -0600185 void InitTexture();
186 void InitSampler();
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600187 void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600188 void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600189 void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600190 void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600191 void DrawTriangleWithVertexFetchAndMVP(const char *vertShaderText, const char *fragShaderText);
Cody Northrop4e6b4762014-10-09 21:25:22 -0600192
193 void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600194 void CreatePipelineWithVertexFetchAndMVP(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600195 void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600196 void ClearDepthStencil(XGL_FLOAT value);
197 void ClearRenderBuffer(XGL_UINT32 clear_color);
198 void InitDepthStencil();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600199 void DrawRotatedTriangleTest();
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600200 void GenerateClearAndPrepareBufferCmds();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600201
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600202
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600203protected:
Cody Northrop350727b2014-10-06 15:42:00 -0600204 XGL_IMAGE m_texture;
205 XGL_IMAGE_VIEW m_textureView;
206 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
207 XGL_GPU_MEMORY m_textureMem;
208
209 XGL_SAMPLER m_sampler;
210
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600211 XGL_FORMAT m_depth_stencil_fmt;
212 XGL_IMAGE m_depthStencilImage;
213 XGL_GPU_MEMORY m_depthStencilMem;
214 XGL_DEPTH_STENCIL_VIEW m_depthStencilView;
215
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600216// XGL_APPLICATION_INFO app_info;
217// XGL_PHYSICAL_GPU objs[MAX_GPUS];
218// XGL_UINT gpu_count;
219// XGL_GPU_MEMORY m_descriptor_set_mem;
220// XGL_GPU_MEMORY m_pipe_mem;
221// XglDevice *m_device;
222// XGL_CMD_BUFFER m_cmdBuffer;
223// XGL_UINT32 m_numVertices;
224// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
225// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
226// XGL_GPU_MEMORY m_vtxBufferMem;
227// XGL_GPU_MEMORY m_constantBufferMem;
228// XGL_UINT32 m_numMemRefs;
229// XGL_MEMORY_REF m_memRefs[5];
230// XGL_RASTER_STATE_OBJECT m_stateRaster;
231// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
232// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
233// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
234// XGL_MSAA_STATE_OBJECT m_stateMsaa;
235// XGL_DESCRIPTOR_SET m_rsrcDescSet;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600236
237 virtual void SetUp() {
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600238
239 this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
240 this->app_info.pNext = NULL;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600241 this->app_info.pAppName = (const XGL_CHAR *) "render_tests";
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600242 this->app_info.appVersion = 1;
243 this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
244 this->app_info.engineVersion = 1;
245 this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
246
Cody Northrop350727b2014-10-06 15:42:00 -0600247 memset(&m_textureViewInfo, 0, sizeof(m_textureViewInfo));
248 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
249
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600250 InitFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600251 }
252
253 virtual void TearDown() {
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600254 // Clean up resources before we reset
255 ShutdownFramework();
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -0600256 }
257};
258
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600259// this function will create the vertex buffer and fill it with the mesh data
260void XglRenderTest::InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
261 const void* vertices )
262{
263 XGL_RESULT err = XGL_SUCCESS;
264
265 assert( numVertices * vbStride > 0 );
266 m_numVertices = numVertices;
267
268 XGL_MEMORY_ALLOC_INFO alloc_info = {};
269 XGL_UINT8 *pData;
270
271 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
272 alloc_info.allocationSize = numVertices * vbStride;
273 alloc_info.alignment = 0;
274 alloc_info.heapCount = 1;
275 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
276
277 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
278 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
279
280 err = xglAllocMemory(device(), &alloc_info, &m_vtxBufferMem);
281 ASSERT_XGL_SUCCESS(err);
282
283 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
284 ASSERT_XGL_SUCCESS(err);
285
286 memcpy(pData, vertices, alloc_info.allocationSize);
287
288 err = xglUnmapMemory(m_vtxBufferMem);
289 ASSERT_XGL_SUCCESS(err);
290
291 // set up the memory view for the vertex buffer
292 this->m_vtxBufferView.stride = vbStride;
293 this->m_vtxBufferView.range = numVertices * vbStride;
294 this->m_vtxBufferView.offset = 0;
295 this->m_vtxBufferView.mem = m_vtxBufferMem;
296 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
297 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
298
299 // open the command buffer
300 err = xglBeginCommandBuffer( m_cmdBuffer, 0 );
301 ASSERT_XGL_SUCCESS(err);
302
303 XGL_MEMORY_STATE_TRANSITION transition = {};
304 transition.mem = m_vtxBufferMem;
305 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
306 transition.newState = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
307 transition.offset = 0;
308 transition.regionSize = numVertices * vbStride;
309
310 // write transition to the command buffer
311 xglCmdPrepareMemoryRegions( m_cmdBuffer, 1, &transition );
312 this->m_vtxBufferView.state = XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY;
313
314 // finish recording the command buffer
315 err = xglEndCommandBuffer( m_cmdBuffer );
316 ASSERT_XGL_SUCCESS(err);
317
318 // this command buffer only uses the vertex buffer memory
319 m_numMemRefs = 1;
320 m_memRefs[0].flags = 0;
321 m_memRefs[0].mem = m_vtxBufferMem;
322
323 // submit the command buffer to the universal queue
324 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
325 ASSERT_XGL_SUCCESS(err);
326}
327
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600328// this function will create the vertex buffer and fill it with the mesh data
329void XglRenderTest::UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
330 const void* vertices )
331{
332 XGL_UINT8 *pData;
333 XGL_RESULT err = XGL_SUCCESS;
334
335 assert( numVertices * vbStride > 0 );
336 m_numVertices = numVertices;
337
338 err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
339 ASSERT_XGL_SUCCESS(err);
340
341 memcpy(pData, vertices, numVertices * vbStride);
342
343 err = xglUnmapMemory(m_vtxBufferMem);
344 ASSERT_XGL_SUCCESS(err);
345}
346
Cody Northrop350727b2014-10-06 15:42:00 -0600347void XglRenderTest::InitTexture()
348{
Cody Northrop904742c2014-10-07 16:25:00 -0600349#define DEMO_TEXTURE_COUNT 1
350
351 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
352 const XGL_INT tex_width = 16;
353 const XGL_INT tex_height = 16;
354 const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
355 { 0xffff0000, 0xff00ff00 },
356 };
Cody Northrop350727b2014-10-06 15:42:00 -0600357 XGL_RESULT err;
Cody Northrop904742c2014-10-07 16:25:00 -0600358 XGL_UINT i;
Cody Northrop350727b2014-10-06 15:42:00 -0600359
Cody Northrop904742c2014-10-07 16:25:00 -0600360 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
361 const XGL_SAMPLER_CREATE_INFO sampler = {
362 .sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
363 .pNext = NULL,
364 .magFilter = XGL_TEX_FILTER_NEAREST,
365 .minFilter = XGL_TEX_FILTER_NEAREST,
366 .mipMode = XGL_TEX_MIPMAP_BASE,
367 .addressU = XGL_TEX_ADDRESS_WRAP,
368 .addressV = XGL_TEX_ADDRESS_WRAP,
369 .addressW = XGL_TEX_ADDRESS_WRAP,
370 .mipLodBias = 0.0f,
371 .maxAnisotropy = 0,
372 .compareFunc = XGL_COMPARE_NEVER,
373 .minLod = 0.0f,
374 .maxLod = 0.0f,
375 .borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE,
376 };
377 const XGL_IMAGE_CREATE_INFO image = {
378 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
379 .pNext = NULL,
380 .imageType = XGL_IMAGE_2D,
381 .format = tex_format,
382 .extent = { tex_width, tex_height, 1 },
383 .mipLevels = 1,
384 .arraySize = 1,
385 .samples = 1,
386 .tiling = XGL_LINEAR_TILING,
387 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
388 .flags = 0,
389 };
390 XGL_MEMORY_ALLOC_INFO mem_alloc;
391 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
392 mem_alloc.pNext = NULL;
393 mem_alloc.allocationSize = 0;
394 mem_alloc.alignment = 0;
395 mem_alloc.flags = 0;
396 mem_alloc.heapCount = 0;
397 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
398 XGL_IMAGE_VIEW_CREATE_INFO view;
399 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
400 view.pNext = NULL;
401 view.image = XGL_NULL_HANDLE;
402 view.viewType = XGL_IMAGE_VIEW_2D;
403 view.format = image.format;
404 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
405 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
406 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
407 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
408 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
409 view.subresourceRange.baseMipLevel = 0;
410 view.subresourceRange.mipLevels = 1;
411 view.subresourceRange.baseArraySlice = 0;
412 view.subresourceRange.arraySize = 1;
413 view.minLod = 0.0f;
Cody Northrop350727b2014-10-06 15:42:00 -0600414
Cody Northrop904742c2014-10-07 16:25:00 -0600415 XGL_MEMORY_REQUIREMENTS mem_reqs;
416 XGL_SIZE mem_reqs_size;
Cody Northrop350727b2014-10-06 15:42:00 -0600417
Cody Northrop904742c2014-10-07 16:25:00 -0600418 /* create sampler */
419 err = xglCreateSampler(device(), &sampler, &m_sampler);
420 assert(!err);
421
422 /* create image */
423 err = xglCreateImage(device(), &image, &m_texture);
424 assert(!err);
425
426 err = xglGetObjectInfo(m_texture,
427 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
428 &mem_reqs_size, &mem_reqs);
429 assert(!err && mem_reqs_size == sizeof(mem_reqs));
430
431 mem_alloc.allocationSize = mem_reqs.size;
432 mem_alloc.alignment = mem_reqs.alignment;
433 mem_alloc.heapCount = mem_reqs.heapCount;
434 memcpy(mem_alloc.heaps, mem_reqs.heaps,
435 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
436
437 /* allocate memory */
438 err = xglAllocMemory(device(), &mem_alloc, &m_textureMem);
439 assert(!err);
440
441 /* bind memory */
442 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
443 assert(!err);
444
445 /* create image view */
446 view.image = m_texture;
447 err = xglCreateImageView(device(), &view, &m_textureView);
448 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600449 }
450
Cody Northrop904742c2014-10-07 16:25:00 -0600451 for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
452 const XGL_IMAGE_SUBRESOURCE subres = {
453 .aspect = XGL_IMAGE_ASPECT_COLOR,
454 .mipLevel = 0,
455 .arraySlice = 0,
456 };
457 XGL_SUBRESOURCE_LAYOUT layout;
458 XGL_SIZE layout_size;
459 XGL_VOID *data;
460 XGL_INT x, y;
Cody Northrop350727b2014-10-06 15:42:00 -0600461
Cody Northrop904742c2014-10-07 16:25:00 -0600462 err = xglGetImageSubresourceInfo(m_texture, &subres,
463 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
464 assert(!err && layout_size == sizeof(layout));
Cody Northrop350727b2014-10-06 15:42:00 -0600465
Cody Northrop904742c2014-10-07 16:25:00 -0600466 err = xglMapMemory(m_textureMem, 0, &data);
467 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600468
Cody Northrop904742c2014-10-07 16:25:00 -0600469 for (y = 0; y < tex_height; y++) {
470 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
471 for (x = 0; x < tex_width; x++)
472 row[x] = tex_colors[i][(x & 1) ^ (y & 1)];
Cody Northrop350727b2014-10-06 15:42:00 -0600473 }
Cody Northrop904742c2014-10-07 16:25:00 -0600474
475 err = xglUnmapMemory(m_textureMem);
476 assert(!err);
Cody Northrop350727b2014-10-06 15:42:00 -0600477 }
478
Cody Northrop350727b2014-10-06 15:42:00 -0600479 m_textureViewInfo.view = m_textureView;
480}
481
482void XglRenderTest::InitSampler()
483{
484 XGL_RESULT err;
485
486 XGL_SAMPLER_CREATE_INFO samplerCreateInfo = {};
487 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
488 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
489 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
490 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
491 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
492 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
493 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
494 samplerCreateInfo.mipLodBias = 0.0;
495 samplerCreateInfo.maxAnisotropy = 0.0;
496 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
497 samplerCreateInfo.minLod = 0.0;
498 samplerCreateInfo.maxLod = 0.0;
499 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
500
501 err = xglCreateSampler(device(),&samplerCreateInfo, &m_sampler);
502 ASSERT_XGL_SUCCESS(err);
503}
504
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600505void XglRenderTest::DrawRotatedTriangleTest()
506{
507 // TODO : This test will pass a matrix into VS to affect triangle orientation.
508}
509
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600510void XglRenderTest::DrawTriangleTest(const char *vertShaderText, const char *fragShaderText)
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600511{
512 XGL_PIPELINE pipeline;
513 XGL_SHADER vs, ps;
514 XGL_RESULT err;
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600515
Courtney Goeltzenleuchtercb5a89c2014-10-08 12:20:26 -0600516 ASSERT_NO_FATAL_FAILURE(InitState());
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600517 ASSERT_NO_FATAL_FAILURE(InitViewport());
518
519 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
520 vertShaderText, &vs));
521
522 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
523 fragShaderText, &ps));
524
525 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600526
527 /*
528 * Shaders are now part of the pipeline, don't need these anymore
529 */
530 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
531 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
532
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600534
Cody Northrop342912c2014-10-01 14:03:25 -0600535 const int constantCount = 4;
536 const float constants[constantCount] = { 0.5, 0.5, 0.5, 1.0 };
537 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
538
539 // Create descriptor set for a uniform resource
540 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
541 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
542 descriptorInfo.slots = 1;
543
544 // create a descriptor set with a single slot
545 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
546 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
547
548 // bind memory to the descriptor set
549 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
550
551 // write the constant buffer view to the descriptor set
552 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
553 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
554 xglEndDescriptorSetUpdate( m_rsrcDescSet );
555
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600556 // Build command buffer
557 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
558 ASSERT_XGL_SUCCESS(err);
559
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600560 GenerateClearAndPrepareBufferCmds();
561 GenerateBindRenderTargetCmd();
Tobin Ehlis34e0e442014-10-07 14:41:29 -0600562 GenerateBindStateAndPipelineCmds(&pipeline);
563
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600564// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
565// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
566
567 // render the cube
568 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
569
570 // prepare the back buffer for present
571// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
572// transitionToPresent.image = m_image;
573// transitionToPresent.oldState = m_image_state;
574// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
575// transitionToPresent.subresourceRange = srRange;
576// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
577// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
578
579 // finalize recording of the command buffer
580 err = xglEndCommandBuffer( m_cmdBuffer );
581 ASSERT_XGL_SUCCESS( err );
582
583 // this command buffer only uses the vertex buffer memory
584 m_numMemRefs = 0;
585// m_memRefs[0].flags = 0;
586// m_memRefs[0].mem = m_vtxBufferMemory;
587
588 // submit the command buffer to the universal queue
589 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
590 ASSERT_XGL_SUCCESS( err );
591
Chia-I Wuf34ac502014-08-27 14:58:05 +0800592 err = xglQueueWaitIdle( m_device->m_queue );
593 ASSERT_XGL_SUCCESS( err );
594
Courtney Goeltzenleuchter68cfe612014-08-26 18:16:41 -0600595 // Wait for work to finish before cleaning up.
596 xglDeviceWaitIdle(m_device->device());
597
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600598 RecordImage(m_renderTarget);
Chia-I Wuf070ec12014-08-30 23:58:36 +0800599
Courtney Goeltzenleuchtera948d842014-08-22 16:27:58 -0600600}
601
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600602void XglRenderTest::DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText)
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -0600603{
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600604 XGL_PIPELINE pipeline;
605 XGL_SHADER vs, ps;
606 XGL_RESULT err;
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600607
Cody Northrop0dbe84f2014-10-09 19:55:56 -0600608 ASSERT_NO_FATAL_FAILURE(InitState());
609 ASSERT_NO_FATAL_FAILURE(InitViewport());
610
611 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
612 vertShaderText, &vs));
613
614 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
615 fragShaderText, &ps));
616
617 ASSERT_NO_FATAL_FAILURE(CreateDefaultPipeline(&pipeline, vs, ps));
618
619 /*
620 * Shaders are now part of the pipeline, don't need these anymore
621 */
622 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
623 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
624
625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
626
627 const int constantCount = 8;
628 const float constants[constantCount] = { 1.0, 0.0, 0.0, 1.0,
629 0.0, 0.0, 1.0, 1.0 };
630
631 InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
632
633 // Create descriptor set for a uniform resource
634 const int slotCount = 1;
635 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
636 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
637 descriptorInfo.slots = slotCount;
638
639 // create a descriptor set with a single slot
640 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
641 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
642
643 // bind memory to the descriptor set
644 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
645
646 // write the constant buffer view to the descriptor set
647 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
648 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
649 xglEndDescriptorSetUpdate( m_rsrcDescSet );
650
651 // Build command buffer
652 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
653 ASSERT_XGL_SUCCESS(err);
654
655 GenerateClearAndPrepareBufferCmds();
656 GenerateBindRenderTargetCmd();
657 GenerateBindStateAndPipelineCmds(&pipeline);
658
659// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
660// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
661
662 // render the cube
663 xglCmdDraw( m_cmdBuffer, 0, 3, 0, 1 );
664
665 // prepare the back buffer for present
666// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
667// transitionToPresent.image = m_image;
668// transitionToPresent.oldState = m_image_state;
669// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
670// transitionToPresent.subresourceRange = srRange;
671// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
672// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
673
674 // finalize recording of the command buffer
675 err = xglEndCommandBuffer( m_cmdBuffer );
676 ASSERT_XGL_SUCCESS( err );
677
678 // this command buffer only uses the vertex buffer memory
679 m_numMemRefs = 0;
680// m_memRefs[0].flags = 0;
681// m_memRefs[0].mem = m_vtxBufferMemory;
682
683 // submit the command buffer to the universal queue
684 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
685 ASSERT_XGL_SUCCESS( err );
686
687 err = xglQueueWaitIdle( m_device->m_queue );
688 ASSERT_XGL_SUCCESS( err );
689
690 // Wait for work to finish before cleaning up.
691 xglDeviceWaitIdle(m_device->device());
692
693 RecordImage(m_renderTarget);
694
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -0600695}
696
Cody Northrop7a1f0462014-10-10 14:49:36 -0600697
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600698void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText)
Cody Northrop7a1f0462014-10-10 14:49:36 -0600699{
700 XGL_PIPELINE pipeline;
701 XGL_SHADER vs, ps;
702 XGL_RESULT err;
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -0600703 glm::mat4 MVP;
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600704 int i;
705
706 // Create identity matrix
707 glm::mat4 Model = glm::mat4(1.0f);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600708
709 ASSERT_NO_FATAL_FAILURE(InitState());
710 ASSERT_NO_FATAL_FAILURE(InitViewport());
711
712 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
713 vertShaderText, &vs));
714
715 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
716 fragShaderText, &ps));
717
718 ASSERT_NO_FATAL_FAILURE(CreatePipelineVSUniform(&pipeline, vs, ps));
719
720 /*
721 * Shaders are now part of the pipeline, don't need these anymore
722 */
723 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
724 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
725
726 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
727
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600728 const int matrixSize = 16;
729 MVP = Model;
Cody Northrop7a1f0462014-10-10 14:49:36 -0600730
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -0600731 InitConstantBuffer(matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
Cody Northrop7a1f0462014-10-10 14:49:36 -0600732
733 // Create descriptor set for a uniform resource
734 const int slotCount = 1;
735 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
736 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
737 descriptorInfo.slots = slotCount;
738
739 // create a descriptor set with a single slot
740 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
741 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
742
743 // bind memory to the descriptor set
744 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
745
746 // write the constant buffer view to the descriptor set
747 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
748 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_constantBufferView );
749 xglEndDescriptorSetUpdate( m_rsrcDescSet );
750
751 // Build command buffer
752 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
753 ASSERT_XGL_SUCCESS(err);
754
755 GenerateClearAndPrepareBufferCmds();
756 GenerateBindRenderTargetCmd();
757 GenerateBindStateAndPipelineCmds(&pipeline);
758
759// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
760// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
761
762 // render the cube
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600763 xglCmdDraw( m_cmdBuffer, 0, 12*3, 0, 1 );
Cody Northrop7a1f0462014-10-10 14:49:36 -0600764
765 // prepare the back buffer for present
766// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
767// transitionToPresent.image = m_image;
768// transitionToPresent.oldState = m_image_state;
769// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
770// transitionToPresent.subresourceRange = srRange;
771// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
772// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
773
774 // finalize recording of the command buffer
775 err = xglEndCommandBuffer( m_cmdBuffer );
776 ASSERT_XGL_SUCCESS( err );
777
778 // this command buffer only uses the vertex buffer memory
779 m_numMemRefs = 0;
780// m_memRefs[0].flags = 0;
781// m_memRefs[0].mem = m_vtxBufferMemory;
782
783 // submit the command buffer to the universal queue
784 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
785 ASSERT_XGL_SUCCESS( err );
786
787 err = xglQueueWaitIdle( m_device->m_queue );
788 ASSERT_XGL_SUCCESS( err );
789
790 // Wait for work to finish before cleaning up.
791 xglDeviceWaitIdle(m_device->device());
792
793 RecordImage(m_renderTarget);
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -0600794
795 for (i = 0; i < 8; i++) {
796 XGL_UINT8 *pData;
797 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
798 ASSERT_XGL_SUCCESS(err);
799
800 MVP = glm::rotate(MVP, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
801 memcpy(pData, (const void*) &MVP[0][0], matrixSize);
802
803 err = xglUnmapMemory(m_constantBufferMem);
804 ASSERT_XGL_SUCCESS(err);
805
806 // submit the command buffer to the universal queue
807 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
808 ASSERT_XGL_SUCCESS( err );
809
810 err = xglQueueWaitIdle( m_device->m_queue );
811 ASSERT_XGL_SUCCESS( err );
812
813 // Wait for work to finish before cleaning up.
814 xglDeviceWaitIdle(m_device->device());
815
816 RecordImage(m_renderTarget);
817 }
Cody Northrop7a1f0462014-10-10 14:49:36 -0600818}
819
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600820void dumpMatrix(const char *note, glm::mat4 MVP)
821{
822 int i,j;
823
824 printf("%s: \n", note);
825 for (i=0; i<4; i++) {
826 printf("%f, %f, %f, %f\n", MVP[i][0], MVP[i][1], MVP[i][2], MVP[i][3]);
827 }
828 printf("\n");
829 fflush(stdout);
830}
831
832void dumpVec4(const char *note, glm::vec4 vector)
833{
834 printf("%s: \n", note);
835 printf("%f, %f, %f, %f\n", vector[0], vector[1], vector[2], vector[3]);
836 printf("\n");
837 fflush(stdout);
838}
839
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600840void XglRenderTest::GenerateClearAndPrepareBufferCmds()
841{
842 XglRenderFramework::GenerateClearAndPrepareBufferCmds();
843
844 if (0) {
845// if (m_depthStencilImage) {
846 XGL_IMAGE_SUBRESOURCE_RANGE dsRange = {};
847 dsRange.aspect = XGL_IMAGE_ASPECT_DEPTH;
848 dsRange.baseMipLevel = 0;
849 dsRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
850 dsRange.baseArraySlice = 0;
851 dsRange.arraySize = XGL_LAST_MIP_OR_SLICE;
852
853 // prepare the depth buffer for clear
854 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
855 transitionToClear.image = m_depthStencilImage;
856 transitionToClear.oldState = m_depthStencilBinding.depthState;
857 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
858 transitionToClear.subresourceRange = dsRange;
859 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
860 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
861
862 xglCmdClearDepthStencil(m_cmdBuffer, m_depthStencilImage, 1.0f, 0, 1, &dsRange);
863
864 // prepare depth buffer for rendering
865 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
866 transitionToRender.image = m_renderTarget->image();
867 transitionToRender.oldState = XGL_IMAGE_STATE_CLEAR;
868 transitionToRender.newState = m_depthStencilBinding.depthState;
869 transitionToRender.subresourceRange = dsRange;
870 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
871 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
872 }
873}
874
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600875void XglRenderTest::DrawTriangleWithVertexFetchAndMVP(const char *vertShaderText, const char *fragShaderText)
876{
877 XGL_PIPELINE pipeline;
878 XGL_SHADER vs, ps;
879 XGL_RESULT err;
880 int i, loop;
881
882 // Projection matrix : 45° Field of View, 1:1 ratio, display range : 0.1 unit <-> 100 units
883 glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
884// dumpMatrix("Projection", Projection);
885
886 // Camera matrix
887 glm::mat4 View = glm::lookAt(
888 glm::vec3(0,3,10), // Camera is at (0,3,10), in World Space
889 glm::vec3(0,0,0), // and looks at the origin
890 glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
891 );
892// dumpMatrix("View", View);
893
894 // Model matrix : an identity matrix (model will be at the origin)
895 glm::mat4 Model = glm::mat4(1.0f);
896// dumpMatrix("Model", Model);
897
898 // Our ModelViewProjection : multiplication of our 3 matrices
899// Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 4.0f));
900// Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
901 glm::mat4 MVP = Projection * View * Model;
902
903 ASSERT_NO_FATAL_FAILURE(InitState());
904 ASSERT_NO_FATAL_FAILURE(InitViewport());
905 ASSERT_NO_FATAL_FAILURE(InitDepthStencil());
906 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]),
907 sizeof(g_vb_solid_face_colors_Data[0]), g_vb_solid_face_colors_Data));
908
909 const int buf_size = sizeof(MVP) / sizeof(XGL_FLOAT);
910
911 InitConstantBuffer(buf_size, sizeof(MVP[0][0]), (const void*) &MVP[0][0]);
912
913 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
914 vertShaderText, &vs));
915
916 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
917 fragShaderText, &ps));
918
919 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetchAndMVP(&pipeline, vs, ps));
920
921 /*
922 * Shaders are now part of the pipeline, don't need these anymore
923 */
924 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
925 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
926
927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
928
929 // Build command buffer
930 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
931 ASSERT_XGL_SUCCESS(err);
932
933 GenerateClearAndPrepareBufferCmds();
934 ClearDepthStencil(1.0f); // HACK for now
935 GenerateBindRenderTargetCmd();
936 GenerateBindStateAndPipelineCmds(&pipeline);
937
938 // render the cube
939 xglCmdDraw( m_cmdBuffer, 0, 12*3, 0, 1 );
940
941 // prepare the back buffer for present
942// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
943// transitionToPresent.image = m_image;
944// transitionToPresent.oldState = m_image_state;
945// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
946// transitionToPresent.subresourceRange = srRange;
947// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
948// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
949
950 // finalize recording of the command buffer
951 err = xglEndCommandBuffer( m_cmdBuffer );
952 ASSERT_XGL_SUCCESS( err );
953
954 // this command buffer only uses the vertex buffer memory
955 m_numMemRefs = 2;
956 m_memRefs[0].flags = 0;
957 m_memRefs[0].mem = m_vtxBufferMem;
958 m_memRefs[1].flags = 0;
959 m_memRefs[1].mem = m_constantBufferMem;
960
961 // submit the command buffer to the universal queue
962 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
963 ASSERT_XGL_SUCCESS( err );
964
965 err = xglQueueWaitIdle( m_device->m_queue );
966 ASSERT_XGL_SUCCESS( err );
967
968 // Wait for work to finish before cleaning up.
969 xglDeviceWaitIdle(m_device->device());
970
971 RecordImage(m_renderTarget);
972
973 for (loop = 0; loop < 16; loop++) {
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600974// ClearRenderBuffer(0x80); // HACK
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600975 ClearDepthStencil(1.0f); // HACK for now
976
977 // TODO: Do we need to transition the constant buffer?
978 XGL_UINT8 *pData;
979 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
980 ASSERT_XGL_SUCCESS(err);
981
982 Model = glm::rotate(Model, glm::radians(22.5f), glm::vec3(0.0f, 1.0f, 0.0f));
Courtney Goeltzenleuchterd04e38c2014-10-22 18:02:30 -0600983// dumpMatrix("Model", Model);
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -0600984 glm::mat4 MVP = Projection * View * Model;
985// dumpMatrix("MVP", MVP);
986
987 memcpy(pData, (const void*) &MVP[0][0], buf_size * sizeof(XGL_FLOAT));
988
989 err = xglUnmapMemory(m_constantBufferMem);
990 ASSERT_XGL_SUCCESS(err);
991
992 // submit the command buffer to the universal queue
993 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
994 ASSERT_XGL_SUCCESS( err );
995
996 err = xglQueueWaitIdle( m_device->m_queue );
997 ASSERT_XGL_SUCCESS( err );
998
999 // Wait for work to finish before cleaning up.
1000 xglDeviceWaitIdle(m_device->device());
1001
1002 RecordImage(m_renderTarget);
1003 }
1004}
1005
Cody Northrop4e6b4762014-10-09 21:25:22 -06001006void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1007{
1008 XGL_RESULT err;
1009 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1010 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1011 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1012
1013
1014 // Create descriptor set for our one resource
1015 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1016 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1017 descriptorInfo.slots = 1; // Vertex buffer only
1018
1019 // create a descriptor set with a single slot
1020 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1021 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1022
1023 // bind memory to the descriptor set
1024 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1025
1026 // write the vertex buffer view to the descriptor set
1027 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1028 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
1029 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1030
1031 const int slots = 1;
1032 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1033 slotInfo[0].shaderEntityIndex = 0;
1034 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
1035
1036 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1037 vs_stage.pNext = XGL_NULL_HANDLE;
1038 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1039 vs_stage.shader.shader = vs;
1040 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1041 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1042 vs_stage.shader.linkConstBufferCount = 0;
1043 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1044 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1045 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1046
1047 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1048 ps_stage.pNext = &vs_stage;
1049 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1050 ps_stage.shader.shader = ps;
1051 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1052 ps_stage.shader.linkConstBufferCount = 0;
1053 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1054 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1055 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1056
1057 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1058 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1059 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1060 };
1061
1062 // this is the current description of g_vbData
1063 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1064 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1065 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1066 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1067 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1068 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1069 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1070 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1071 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1072
1073 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
1074 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
1075 &ps_stage, // pNext;
1076 1, // bindingCount
1077 &vi_binding, // pVertexBindingDescriptions;
1078 2, // attributeCount; // number of attributes
1079 vi_attribs // pVertexAttributeDescriptions;
1080 };
1081
1082 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1083 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1084 &vi_state, // pNext
1085 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1086 XGL_FALSE, // disableVertexReuse
1087 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1088 XGL_FALSE, // primitiveRestartEnable
1089 0 // primitiveRestartIndex
1090 };
1091
1092 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1093 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1094 &ia_state,
1095 XGL_FALSE, // depthClipEnable
1096 XGL_FALSE, // rasterizerDiscardEnable
1097 1.0 // pointSize
1098 };
1099
1100 XGL_PIPELINE_CB_STATE cb_state = {
1101 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1102 &rs_state,
1103 XGL_FALSE, // alphaToCoverageEnable
1104 XGL_FALSE, // dualSourceBlendEnable
1105 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1106 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1107 {
1108 XGL_FALSE, // blendEnable
1109 m_render_target_fmt, // XGL_FORMAT
1110 0xF // channelWriteMask
1111 }
1112 }
1113 };
1114
1115 // TODO: Should take depth buffer format from queried formats
1116 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1117 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1118 &cb_state,
1119 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1120 };
1121
1122 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1123 info.pNext = &db_state;
1124 info.flags = 0;
1125 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1126 ASSERT_XGL_SUCCESS(err);
1127
1128 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1129 ASSERT_XGL_SUCCESS(err);
1130}
1131
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001132/*
1133 * Based on CreatePipelineWithVertexFetch and CreatePipelineVSUniform
1134 */
1135void XglRenderTest::CreatePipelineWithVertexFetchAndMVP(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1136{
1137 XGL_RESULT err;
1138 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1139 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1140 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1141
1142 // Create descriptor set for our two resources
1143 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1144 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1145 descriptorInfo.slots = 2; // Vertex buffer and Model View Matrix
1146
1147 // create a descriptor set with a single slot
1148 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1149 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1150
1151 // bind memory to the descriptor set
1152 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1153
1154 // write the vertex buffer view to the descriptor set
1155 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
1156 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
1157 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 1, 1, &m_constantBufferView );
1158 xglEndDescriptorSetUpdate( m_rsrcDescSet );
1159
1160 const int slots = 2;
1161 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1162 slotInfo[0].shaderEntityIndex = 0;
1163 slotInfo[0].slotObjectType = XGL_SLOT_VERTEX_INPUT;
1164 slotInfo[1].shaderEntityIndex = 0;
1165 slotInfo[1].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1166
1167 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1168 vs_stage.pNext = XGL_NULL_HANDLE;
1169 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1170 vs_stage.shader.shader = vs;
1171 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1172 vs_stage.shader.descriptorSetMapping[0].descriptorCount = slots;
1173 vs_stage.shader.linkConstBufferCount = 0;
1174 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1175 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1176 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1177
1178 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1179 ps_stage.pNext = &vs_stage;
1180 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1181 ps_stage.shader.shader = ps;
1182 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1183 ps_stage.shader.linkConstBufferCount = 0;
1184 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1185 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1186 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1187
1188 XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
1189 sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
1190 XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
1191 };
1192
1193 // this is the current description of g_vbData
1194 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
1195 vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
1196 vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1197 vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
1198 vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
1199 vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
1200 vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
1201 vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
1202 vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
1203
1204 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state = {
1205 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
1206 &ps_stage, // pNext;
1207 1, // bindingCount
1208 &vi_binding, // pVertexBindingDescriptions;
1209 2, // attributeCount; // number of attributes
1210 vi_attribs // pVertexAttributeDescriptions;
1211 };
1212
1213 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1214 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1215 &vi_state, // pNext
1216 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1217 XGL_FALSE, // disableVertexReuse
1218 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1219 XGL_FALSE, // primitiveRestartEnable
1220 0 // primitiveRestartIndex
1221 };
1222
1223 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1224 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1225 &ia_state,
1226 XGL_FALSE, // depthClipEnable
1227 XGL_FALSE, // rasterizerDiscardEnable
1228 1.0 // pointSize
1229 };
1230
1231 XGL_PIPELINE_CB_STATE cb_state = {
1232 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1233 &rs_state,
1234 XGL_FALSE, // alphaToCoverageEnable
1235 XGL_FALSE, // dualSourceBlendEnable
1236 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1237 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1238 {
1239 XGL_FALSE, // blendEnable
1240 m_render_target_fmt, // XGL_FORMAT
1241 0xF // channelWriteMask
1242 }
1243 }
1244 };
1245
1246 // TODO: Should take depth buffer format from queried formats
1247 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1248 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1249 &cb_state,
1250 m_depth_stencil_fmt // XGL_FORMAT
1251 };
1252
1253 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1254 info.pNext = &db_state;
1255 info.flags = 0;
1256 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1257 ASSERT_XGL_SUCCESS(err);
1258
1259 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1260 ASSERT_XGL_SUCCESS(err);
1261}
1262
Cody Northrop7a1f0462014-10-10 14:49:36 -06001263void XglRenderTest::CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
1264{
1265 XGL_RESULT err;
1266 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1267 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
1268 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
1269
1270
1271 const int vsSlots = 1; // Uniform buffer only
1272
1273 // Create descriptor set for our one resource
1274 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
1275 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
1276 descriptorInfo.slots = vsSlots;
1277
1278 // create a descriptor set with a single slot
1279 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
1280 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
1281
1282 // bind memory to the descriptor set
1283 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
1284
1285
1286 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( vsSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
1287 slotInfo[0].shaderEntityIndex = 0;
1288 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
1289
1290 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1291 vs_stage.pNext = XGL_NULL_HANDLE;
1292 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
1293 vs_stage.shader.shader = vs;
1294 vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1295 vs_stage.shader.descriptorSetMapping[0].descriptorCount = vsSlots;
1296 vs_stage.shader.linkConstBufferCount = 0;
1297 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1298 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1299 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1300
1301 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1302 ps_stage.pNext = &vs_stage;
1303 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
1304 ps_stage.shader.shader = ps;
1305 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
1306 ps_stage.shader.linkConstBufferCount = 0;
1307 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
1308 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
1309 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
1310
1311 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
1312 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
1313 &ps_stage, // pNext
1314 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
1315 XGL_FALSE, // disableVertexReuse
1316 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
1317 XGL_FALSE, // primitiveRestartEnable
1318 0 // primitiveRestartIndex
1319 };
1320
1321 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
1322 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
1323 &ia_state,
1324 XGL_FALSE, // depthClipEnable
1325 XGL_FALSE, // rasterizerDiscardEnable
1326 1.0 // pointSize
1327 };
1328
1329 XGL_PIPELINE_CB_STATE cb_state = {
1330 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
1331 &rs_state,
1332 XGL_FALSE, // alphaToCoverageEnable
1333 XGL_FALSE, // dualSourceBlendEnable
1334 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
1335 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
1336 {
1337 XGL_FALSE, // blendEnable
1338 m_render_target_fmt, // XGL_FORMAT
1339 0xF // channelWriteMask
1340 }
1341 }
1342 };
1343
1344 // TODO: Should take depth buffer format from queried formats
1345 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
1346 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1347 &cb_state,
1348 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
1349 };
1350
1351 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1352 info.pNext = &db_state;
1353 info.flags = 0;
1354 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
1355 ASSERT_XGL_SUCCESS(err);
1356
1357 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
1358 ASSERT_XGL_SUCCESS(err);
1359}
1360
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001361void XglRenderTest::ClearDepthStencil(XGL_FLOAT value)
1362/* clear the buffer */
1363{
1364 XGL_RESULT err;
1365 const uint16_t depth_value = (uint16_t) (value * 65535);
1366 const XGL_INT tw = 128 / sizeof(uint16_t);
1367 const XGL_INT th = 32;
1368 XGL_INT i, j, w, h;
1369 XGL_VOID *data;
1370
1371 w = (m_width + tw - 1) / tw;
1372 h = (m_height + th - 1) / th;
1373
1374 err = xglMapMemory(m_depthStencilMem, 0, &data);
1375 ASSERT_XGL_SUCCESS(err);
1376
1377 for (i = 0; i < w * h; i++) {
1378 uint16_t *tile = (uint16_t *) ((char *) data + 4096 * i);
1379
1380 for (j = 0; j < 2048; j++)
1381 tile[j] = depth_value;
1382 }
1383
1384 err = xglUnmapMemory(m_depthStencilMem);
1385 ASSERT_XGL_SUCCESS(err);
1386}
1387
1388void XglRenderTest::ClearRenderBuffer(XGL_UINT32 clear_color)
1389/* clear the buffer */
1390{
1391 XGL_RESULT err;
1392 const XGL_IMAGE_SUBRESOURCE sr = {
1393 XGL_IMAGE_ASPECT_COLOR, 0, 0
1394 };
1395 XGL_SUBRESOURCE_LAYOUT sr_layout;
1396 XGL_UINT data_size = sizeof(sr_layout);
1397 XGL_VOID *ptr;
1398
1399 err = xglGetImageSubresourceInfo( m_renderTarget->image(),
1400 &sr, XGL_INFO_TYPE_SUBRESOURCE_LAYOUT,
1401 &data_size, &sr_layout);
1402 ASSERT_XGL_SUCCESS( err );
1403 ASSERT_EQ(data_size, sizeof(sr_layout));
1404
1405 err = m_renderTarget->MapMemory( &ptr );
1406 ASSERT_XGL_SUCCESS( err );
1407
1408 ptr = (void *) ((char *) ptr + sr_layout.offset);
1409
1410 memset(ptr, clear_color, m_width * m_height *sizeof(XGL_UINT32));
1411
1412 err = m_renderTarget->UnmapMemory();
1413 ASSERT_XGL_SUCCESS(err);
1414}
1415
1416void XglRenderTest::InitDepthStencil()
1417{
1418 XGL_RESULT err;
1419 XGL_IMAGE_CREATE_INFO image;
1420 XGL_MEMORY_ALLOC_INFO mem_alloc;
1421 XGL_DEPTH_STENCIL_VIEW_CREATE_INFO view;
1422 XGL_MEMORY_REQUIREMENTS mem_reqs;
1423 XGL_SIZE mem_reqs_size;
1424
1425 // Clean up default state created by framework
1426 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
1427
1428 m_depth_stencil_fmt.channelFormat = XGL_CH_FMT_R16;
1429 m_depth_stencil_fmt.numericFormat = XGL_NUM_FMT_DS;
1430
1431 image.sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1432 image.pNext = NULL;
1433 image.imageType = XGL_IMAGE_2D;
1434 image.format = m_depth_stencil_fmt;
1435 image.extent.width = m_width;
1436 image.extent.height = m_height;
1437 image.extent.depth = 1;
1438 image.mipLevels = 1;
1439 image.arraySize = 1;
1440 image.samples = 1;
1441 image.tiling = XGL_OPTIMAL_TILING;
1442 image.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT;
1443 image.flags = 0;
1444
1445 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1446 mem_alloc.pNext = NULL;
1447 mem_alloc.allocationSize = 0;
1448 mem_alloc.alignment = 0;
1449 mem_alloc.flags = 0;
1450 mem_alloc.heapCount = 0;
1451 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
1452
1453 /* create image */
1454 err = xglCreateImage(device(), &image,
1455 &m_depthStencilImage);
1456 ASSERT_XGL_SUCCESS(err);
1457
1458 err = xglGetObjectInfo(m_depthStencilImage,
1459 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
1460 &mem_reqs_size, &mem_reqs);
1461 ASSERT_XGL_SUCCESS(err);
1462 ASSERT_EQ(mem_reqs_size, sizeof(mem_reqs));
1463
1464 mem_alloc.allocationSize = mem_reqs.size;
1465 mem_alloc.alignment = mem_reqs.alignment;
1466 mem_alloc.heapCount = mem_reqs.heapCount;
1467 memcpy(mem_alloc.heaps, mem_reqs.heaps,
1468 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
1469
1470 /* allocate memory */
1471 err = xglAllocMemory(device(), &mem_alloc, &m_depthStencilMem);
1472 ASSERT_XGL_SUCCESS(err);
1473
1474 /* bind memory */
1475 err = xglBindObjectMemory(m_depthStencilImage, m_depthStencilMem, 0);
1476 ASSERT_XGL_SUCCESS(err);
1477
1478 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depthStencil = {};
1479 depthStencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
1480 depthStencil.depthTestEnable = XGL_TRUE;
1481 depthStencil.depthWriteEnable = XGL_TRUE;
1482 depthStencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
1483 depthStencil.depthBoundsEnable = XGL_FALSE;
1484 depthStencil.minDepth = 0.f;
1485 depthStencil.maxDepth = 1.f;
1486 depthStencil.back.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
1487 depthStencil.back.stencilFailOp = XGL_STENCIL_OP_KEEP;
1488 depthStencil.back.stencilPassOp = XGL_STENCIL_OP_KEEP;
1489 depthStencil.back.stencilRef = 0x00;
1490 depthStencil.back.stencilFunc = XGL_COMPARE_ALWAYS;
1491 depthStencil.front = depthStencil.back;
1492
1493 err = xglCreateDepthStencilState( device(), &depthStencil, &m_stateDepthStencil );
1494 ASSERT_XGL_SUCCESS( err );
1495
1496 /* create image view */
1497 view.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
1498 view.pNext = NULL;
1499 view.image = XGL_NULL_HANDLE;
1500 view.mipLevel = 0;
1501 view.baseArraySlice = 0;
1502 view.arraySize = 1;
1503 view.flags = 0;
1504 view.image = m_depthStencilImage;
1505 err = xglCreateDepthStencilView(device(), &view, &m_depthStencilView);
1506 ASSERT_XGL_SUCCESS(err);
1507
1508 m_depthStencilBinding.view = m_depthStencilView;
1509 m_depthStencilBinding.depthState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1510 m_depthStencilBinding.stencilState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1511}
1512
Cody Northrop4e6b4762014-10-09 21:25:22 -06001513void XglRenderTest::DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText)
1514{
1515 XGL_PIPELINE pipeline;
1516 XGL_SHADER vs, ps;
1517 XGL_RESULT err;
1518
1519 ASSERT_NO_FATAL_FAILURE(InitState());
1520 ASSERT_NO_FATAL_FAILURE(InitViewport());
1521 ASSERT_NO_FATAL_FAILURE(InitMesh(sizeof(g_vbData)/sizeof(g_vbData[0]), sizeof(g_vbData[0]), g_vbData));
1522
1523 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_VERTEX,
1524 vertShaderText, &vs));
1525
1526 ASSERT_NO_FATAL_FAILURE(CreateShader(XGL_SHADER_STAGE_FRAGMENT,
1527 fragShaderText, &ps));
1528
1529 ASSERT_NO_FATAL_FAILURE(CreatePipelineWithVertexFetch(&pipeline, vs, ps));
1530
1531 /*
1532 * Shaders are now part of the pipeline, don't need these anymore
1533 */
1534 ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
1535 ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
1536
1537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1538
1539 // Build command buffer
1540 err = xglBeginCommandBuffer(m_cmdBuffer, 0);
1541 ASSERT_XGL_SUCCESS(err);
1542
1543 GenerateClearAndPrepareBufferCmds();
1544 GenerateBindRenderTargetCmd();
1545 GenerateBindStateAndPipelineCmds(&pipeline);
1546
1547// xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
1548// xglCmdBindDynamicMemoryView( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, &m_constantBufferView );
1549
1550 // render the cube
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001551 xglCmdDraw( m_cmdBuffer, 0, 12*3, 0, 1 );
Cody Northrop4e6b4762014-10-09 21:25:22 -06001552
1553 // prepare the back buffer for present
1554// XGL_IMAGE_STATE_TRANSITION transitionToPresent = {};
1555// transitionToPresent.image = m_image;
1556// transitionToPresent.oldState = m_image_state;
1557// transitionToPresent.newState = m_display.fullscreen ? XGL_WSI_WIN_PRESENT_SOURCE_FLIP : XGL_WSI_WIN_PRESENT_SOURCE_BLT;
1558// transitionToPresent.subresourceRange = srRange;
1559// xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToPresent );
1560// m_image_state = ( XGL_IMAGE_STATE ) transitionToPresent.newState;
1561
1562 // finalize recording of the command buffer
1563 err = xglEndCommandBuffer( m_cmdBuffer );
1564 ASSERT_XGL_SUCCESS( err );
1565
1566 // this command buffer only uses the vertex buffer memory
1567 m_numMemRefs = 0;
1568// m_memRefs[0].flags = 0;
1569// m_memRefs[0].mem = m_vtxBufferMemory;
1570
1571 // submit the command buffer to the universal queue
1572 err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, m_numMemRefs, m_memRefs, NULL );
1573 ASSERT_XGL_SUCCESS( err );
1574
1575 err = xglQueueWaitIdle( m_device->m_queue );
1576 ASSERT_XGL_SUCCESS( err );
1577
1578 // Wait for work to finish before cleaning up.
1579 xglDeviceWaitIdle(m_device->device());
1580
1581 RecordImage(m_renderTarget);
1582
1583}
1584
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001585TEST_F(XglRenderTest, GreenTriangle)
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001586{
1587 static const char *vertShaderText =
1588 "#version 130\n"
1589 "vec2 vertices[3];\n"
1590 "void main() {\n"
1591 " vertices[0] = vec2(-1.0, -1.0);\n"
1592 " vertices[1] = vec2( 1.0, -1.0);\n"
1593 " vertices[2] = vec2( 0.0, 1.0);\n"
1594 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1595 "}\n";
Courtney Goeltzenleuchter98e49432014-10-09 15:40:19 -06001596
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001597 static const char *fragShaderText =
1598 "#version 130\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001599 "void main() {\n"
Steve K10b32512014-10-10 08:54:29 -06001600 " gl_FragColor = vec4(0,1,0,1);\n"
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001601 "}\n";
1602 DrawTriangleTest(vertShaderText, fragShaderText);
1603}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001604
Courtney Goeltzenleuchterd4ee38d2014-10-10 13:59:38 -06001605TEST_F(XglRenderTest, BIL_GreenTriangle)
1606{
1607 bool saved_use_bil = XglTestFramework::m_use_bil;
1608
1609 static const char *vertShaderText =
1610 "#version 130\n"
1611 "vec2 vertices[3];\n"
1612 "void main() {\n"
1613 " vertices[0] = vec2(-1.0, -1.0);\n"
1614 " vertices[1] = vec2( 1.0, -1.0);\n"
1615 " vertices[2] = vec2( 0.0, 1.0);\n"
1616 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1617 "}\n";
1618
1619 static const char *fragShaderText =
1620 "#version 130\n"
1621 "void main() {\n"
1622 " gl_FragColor = vec4(0,1,0,1);\n"
1623 "}\n";
1624 XglTestFramework::m_use_bil = true;
1625 DrawTriangleTest(vertShaderText, fragShaderText);
1626 XglTestFramework::m_use_bil = saved_use_bil;
1627}
1628
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001629TEST_F(XglRenderTest, TriangleFragUniform)
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001630{
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001631
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001632 static const char *vertShaderText =
1633 "#version 130\n"
1634 "out vec4 color;\n"
1635 "out vec4 scale;\n"
1636 "vec2 vertices[3];\n"
1637 "void main() {\n"
1638 "vec2 vertices[3];\n"
1639 " vertices[0] = vec2(-0.5, -0.5);\n"
1640 " vertices[1] = vec2( 0.5, -0.5);\n"
1641 " vertices[2] = vec2( 0.5, 0.5);\n"
1642 "vec4 colors[3];\n"
1643 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1644 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1645 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1646 " color = colors[gl_VertexID % 3];\n"
1647 " scale = vec4(1.0, 1.0, 1.0, 1.0);\n"
1648 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1649 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001650
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001651 static const char *fragShaderText =
1652 "#version 130\n"
1653 "in vec4 color;\n"
1654 "in vec4 scale;\n"
1655 "uniform vec4 foo;\n"
1656 "void main() {\n"
1657 " gl_FragColor = color * scale + foo;\n"
1658 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001659
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001660 DrawTriangleTest(vertShaderText, fragShaderText);
1661}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001662
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001663TEST_F(XglRenderTest, YellowTriangle)
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001664{
1665 static const char *vertShaderText =
1666 "#version 130\n"
1667 "void main() {\n"
1668 " vec2 vertices[3];"
1669 " vertices[0] = vec2(-0.5, -0.5);\n"
1670 " vertices[1] = vec2( 0.5, -0.5);\n"
1671 " vertices[2] = vec2( 0.5, 0.5);\n"
1672 " vec4 colors[3];\n"
1673 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1674 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1675 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1676 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1677 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001678
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001679 static const char *fragShaderText =
1680 "#version 130\n"
1681 "void main() {\n"
1682 " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
1683 "}\n";
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001684
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001685 DrawTriangleTest(vertShaderText, fragShaderText);
1686}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001687
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001688TEST_F(XglRenderTest, RotatedTriangle) {
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001689 DrawRotatedTriangleTest();
1690}
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001691
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001692TEST_F(XglRenderTest, TriangleTwoFSUniforms)
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001693{
1694 static const char *vertShaderText =
1695 "#version 130\n"
1696 "out vec4 color;\n"
1697 "out vec4 scale;\n"
1698 "out vec2 samplePos;\n"
1699 "void main() {\n"
1700 " vec2 vertices[3];"
1701 " vertices[0] = vec2(-0.5, -0.5);\n"
1702 " vertices[1] = vec2( 0.5, -0.5);\n"
1703 " vertices[2] = vec2( 0.5, 0.5);\n"
1704 " vec4 colors[3];\n"
1705 " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
1706 " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
1707 " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
1708 " color = colors[gl_VertexID % 3];\n"
1709 " vec2 positions[3];"
1710 " positions[0] = vec2( 0.0, 0.0);\n"
1711 " positions[1] = vec2( 1.0, 0.0);\n"
1712 " positions[2] = vec2( 1.0, 1.0);\n"
1713 " scale = vec4(0.0, 0.0, 0.0, 0.0);\n"
1714 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
1715 "}\n";
Cody Northrop4e6b4762014-10-09 21:25:22 -06001716
1717
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001718 static const char *fragShaderText =
1719 "#version 430\n"
1720 "in vec4 color;\n"
1721 "in vec4 scale;\n"
1722 "uniform vec4 foo;\n"
1723 "uniform vec4 bar;\n"
1724 "void main() {\n"
1725 // by default, with no location or blocks
1726 // the compiler will read them from buffer
1727 // in reverse order of first use in shader
1728 // The buffer contains red, followed by blue,
1729 // so foo should be blue, bar should be red
1730 " gl_FragColor = color * scale * foo * bar + foo;\n"
1731 "}\n";
Cody Northrop4e6b4762014-10-09 21:25:22 -06001732
Cody Northrop5b7d85a2014-10-09 21:26:47 -06001733 DrawTriangleTwoUniformsFS(vertShaderText, fragShaderText);
1734}
Cody Northrop4e6b4762014-10-09 21:25:22 -06001735
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001736TEST_F(XglRenderTest, TriangleWithVertexFetch)
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001737{
Courtney Goeltzenleuchtere5409342014-10-08 14:26:40 -06001738 static const char *vertShaderText =
Courtney Goeltzenleuchterbb7014d2014-10-09 11:05:19 -06001739 "#version 130\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001740 //XYZ1( -1, -1, -1 )
1741 "in vec4 pos;\n"
1742 //XYZ1( 0.f, 0.f, 0.f )
1743 "in vec4 inColor;\n"
1744 "out vec4 outColor;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001745 "void main() {\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001746 " outColor = inColor;\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001747 " gl_Position = pos;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001748 "}\n";
1749
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001750
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001751 static const char *fragShaderText =
Cody Northrop0dbe84f2014-10-09 19:55:56 -06001752 "#version 430\n"
1753 "in vec4 color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001754 "void main() {\n"
Cody Northrop4e6b4762014-10-09 21:25:22 -06001755 " gl_FragColor = color;\n"
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001756 "}\n";
Courtney Goeltzenleuchter9b4ab892014-10-09 15:37:21 -06001757
Cody Northrop4e6b4762014-10-09 21:25:22 -06001758 DrawTriangleWithVertexFetch(vertShaderText, fragShaderText);
Tobin Ehlis34e0e442014-10-07 14:41:29 -06001759}
1760
Courtney Goeltzenleuchter08ccb482014-10-10 17:02:53 -06001761TEST_F(XglRenderTest, TriangleVSUniform)
Cody Northrop7a1f0462014-10-10 14:49:36 -06001762{
1763 static const char *vertShaderText =
1764 "#version 130\n"
1765 "uniform mat4 mvp;\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001766 "void main() {\n"
1767 " vec2 vertices[3];"
1768 " vertices[0] = vec2(-0.5, -0.5);\n"
1769 " vertices[1] = vec2( 0.5, -0.5);\n"
1770 " vertices[2] = vec2( 0.5, 0.5);\n"
Cody Northrop78eac042014-10-10 15:45:00 -06001771 " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0) * mvp;\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001772 "}\n";
1773
1774 static const char *fragShaderText =
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001775 "#version 130\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001776 "void main() {\n"
Cody Northrop78eac042014-10-10 15:45:00 -06001777 " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
Cody Northrop7a1f0462014-10-10 14:49:36 -06001778 "}\n";
1779
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -06001780 // Create identity matrix
1781 glm::mat4 Model = glm::mat4(1.0f);
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -06001782 DrawTriangleVSUniform(vertShaderText, fragShaderText);
Courtney Goeltzenleuchter34b81772014-10-10 18:04:39 -06001783
Courtney Goeltzenleuchter3c601d82014-10-13 13:03:31 -06001784// Model = glm::rotate(Model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
1785// DrawTriangleVSUniform(vertShaderText, fragShaderText, Model);
Cody Northrop7a1f0462014-10-10 14:49:36 -06001786}
1787
Courtney Goeltzenleuchterd0556292014-10-20 16:33:15 -06001788TEST_F(XglRenderTest, TriangleWithVertexFetchAndMVP)
1789{
1790 static const char *vertShaderText =
1791 "#version 140\n"
1792 "layout (std140) uniform bufferVals {\n"
1793 " mat4 mvp;\n"
1794 "} myBufferVals;\n"
1795 "in vec4 pos;\n"
1796 "in vec4 inColor;\n"
1797 "out vec4 outColor;\n"
1798 "void main() {\n"
1799 " outColor = inColor;\n"
1800 " gl_Position = myBufferVals.mvp * pos;\n"
1801 "}\n";
1802
1803 static const char *fragShaderText =
1804 "#version 130\n"
1805 "in vec4 color;\n"
1806 "void main() {\n"
1807 " gl_FragColor = color;\n"
1808 "}\n";
1809
1810 DrawTriangleWithVertexFetchAndMVP(vertShaderText, fragShaderText);
1811}
1812
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001813int main(int argc, char **argv) {
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001814 int result;
1815
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001816 ::testing::InitGoogleTest(&argc, argv);
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001817 XglTestFramework::InitArgs(&argc, argv);
1818
Courtney Goeltzenleuchterf12c7762014-10-08 08:46:51 -06001819 ::testing::Environment* const xgl_test_env = ::testing::AddGlobalTestEnvironment(new TestEnvironment);
1820
Courtney Goeltzenleuchter28029792014-09-04 16:26:02 -06001821 result = RUN_ALL_TESTS();
1822
1823 XglTestFramework::Finish();
1824 return result;
Courtney Goeltzenleuchterb85c5812014-08-19 18:35:50 -06001825}