blob: 62d3894b0df193b414b94396fac7975d4e7f2b3a [file] [log] [blame]
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -06001/*
2 * XGL Tests
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Courtney Goeltzenleuchter <courtney@lunarg.com>
26 */
27
28#include "xglrenderframework.h"
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060029
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060030XglRenderFramework::XglRenderFramework() :
31 m_colorBlend( XGL_NULL_HANDLE ),
32 m_stateMsaa( XGL_NULL_HANDLE ),
33 m_stateDepthStencil( XGL_NULL_HANDLE ),
34 m_stateRaster( XGL_NULL_HANDLE ),
35 m_cmdBuffer( XGL_NULL_HANDLE ),
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -060036 m_stateViewport( XGL_NULL_HANDLE ),
37 m_width( 256.0 ), // default window width
38 m_height( 256.0 ) // default window height
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060039{
40 m_render_target_fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
41 m_render_target_fmt.numericFormat = XGL_NUM_FMT_UNORM;
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -060042
43 m_colorBinding.view = XGL_NULL_HANDLE;
44 m_depthStencilBinding.view = XGL_NULL_HANDLE;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060045}
46
47XglRenderFramework::~XglRenderFramework()
48{
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060049
50}
51
52void XglRenderFramework::InitFramework()
53{
54 XGL_RESULT err;
55
56 memset(&m_vtxBufferView, 0, sizeof(m_vtxBufferView));
57 m_vtxBufferView.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
58
59 memset(&m_constantBufferView, 0, sizeof(m_constantBufferView));
60 m_constantBufferView.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
61
62 err = xglInitAndEnumerateGpus(&app_info, NULL,
63 MAX_GPUS, &this->gpu_count, objs);
64 ASSERT_XGL_SUCCESS(err);
Jon Ashburnbf843b22014-11-26 11:06:49 -070065 ASSERT_GE(this->gpu_count, 1) << "No GPU available";
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060066
67 m_device = new XglDevice(0, objs[0]);
68 m_device->get_device_queue();
69}
70
71void XglRenderFramework::ShutdownFramework()
72{
73 if (m_colorBlend) xglDestroyObject(m_colorBlend);
74 if (m_stateMsaa) xglDestroyObject(m_stateMsaa);
75 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
76 if (m_stateRaster) xglDestroyObject(m_stateRaster);
77 if (m_cmdBuffer) xglDestroyObject(m_cmdBuffer);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060078
79 if (m_stateViewport) {
80 xglDestroyObject(m_stateViewport);
81 }
82
83 if (m_renderTarget) {
84 // TODO: XglImage should be able to destroy itself
85// m_renderTarget->
86// xglDestroyObject(*m_renderTarget);
87 }
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060088
89 // reset the driver
Tobin Ehlisa3fdbec2014-10-23 13:45:13 -060090 m_device->destroy_device();
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060091 xglInitAndEnumerateGpus(&this->app_info, XGL_NULL_HANDLE, 0, &gpu_count, XGL_NULL_HANDLE);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060092}
93
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060094void XglRenderFramework::InitState()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060095{
96 XGL_RESULT err;
97
98 m_render_target_fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
99 m_render_target_fmt.numericFormat = XGL_NUM_FMT_UNORM;
100
101 // create a raster state (solid, back-face culling)
102 XGL_RASTER_STATE_CREATE_INFO raster = {};
103 raster.sType = XGL_STRUCTURE_TYPE_RASTER_STATE_CREATE_INFO;
104 raster.fillMode = XGL_FILL_SOLID;
105 raster.cullMode = XGL_CULL_NONE;
106 raster.frontFace = XGL_FRONT_FACE_CCW;
107 err = xglCreateRasterState( device(), &raster, &m_stateRaster );
108 ASSERT_XGL_SUCCESS(err);
109
110 XGL_COLOR_BLEND_STATE_CREATE_INFO blend = {};
111 blend.sType = XGL_STRUCTURE_TYPE_COLOR_BLEND_STATE_CREATE_INFO;
112 err = xglCreateColorBlendState(device(), &blend, &m_colorBlend);
113 ASSERT_XGL_SUCCESS( err );
114
115 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depthStencil = {};
116 depthStencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
117 depthStencil.depthTestEnable = XGL_FALSE;
118 depthStencil.depthWriteEnable = XGL_FALSE;
119 depthStencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
120 depthStencil.depthBoundsEnable = XGL_FALSE;
121 depthStencil.minDepth = 0.f;
122 depthStencil.maxDepth = 1.f;
123 depthStencil.back.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
124 depthStencil.back.stencilFailOp = XGL_STENCIL_OP_KEEP;
125 depthStencil.back.stencilPassOp = XGL_STENCIL_OP_KEEP;
126 depthStencil.back.stencilRef = 0x00;
127 depthStencil.back.stencilFunc = XGL_COMPARE_ALWAYS;
128 depthStencil.front = depthStencil.back;
129
130 err = xglCreateDepthStencilState( device(), &depthStencil, &m_stateDepthStencil );
131 ASSERT_XGL_SUCCESS( err );
132
133 XGL_MSAA_STATE_CREATE_INFO msaa = {};
134 msaa.sType = XGL_STRUCTURE_TYPE_MSAA_STATE_CREATE_INFO;
135 msaa.sampleMask = 1;
136 msaa.samples = 1;
137
138 err = xglCreateMsaaState( device(), &msaa, &m_stateMsaa );
139 ASSERT_XGL_SUCCESS( err );
140
141 XGL_CMD_BUFFER_CREATE_INFO cmdInfo = {};
142
143 cmdInfo.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
144 cmdInfo.queueType = XGL_QUEUE_TYPE_GRAPHICS;
145 err = xglCreateCommandBuffer(device(), &cmdInfo, &m_cmdBuffer);
146 ASSERT_XGL_SUCCESS(err) << "xglCreateCommandBuffer failed";
147}
148
149void XglRenderFramework::InitConstantBuffer(int constantCount, int constantSize,
150 const void* data)
151{
152 XGL_RESULT err = XGL_SUCCESS;
153
154 XGL_MEMORY_ALLOC_INFO alloc_info = {};
155 XGL_UINT8 *pData;
156
157 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
158 alloc_info.allocationSize = constantCount * constantSize;
159 alloc_info.alignment = 0;
160 alloc_info.heapCount = 1;
161 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
162
163 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
164 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
165
166 err = xglAllocMemory(device(), &alloc_info, &m_constantBufferMem);
167 ASSERT_XGL_SUCCESS(err);
168
169 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
170 ASSERT_XGL_SUCCESS(err);
171
172 memcpy(pData, data, alloc_info.allocationSize);
173
174 err = xglUnmapMemory(m_constantBufferMem);
175 ASSERT_XGL_SUCCESS(err);
176
177 // set up the memory view for the constant buffer
Cody Northrope1ab9bf2014-10-14 14:10:26 -0600178 this->m_constantBufferView.stride = 16;
179 this->m_constantBufferView.range = alloc_info.allocationSize;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600180 this->m_constantBufferView.offset = 0;
181 this->m_constantBufferView.mem = m_constantBufferMem;
182 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
183 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
184}
185
Courtney Goeltzenleuchterfdcfb9f2014-10-10 18:04:39 -0600186/*
187 * Update existing constant value with new data of exactly
188 * the same size.
189 */
190void XglRenderFramework::UpdateConstantBuffer(const void* data)
191{
192 XGL_RESULT err = XGL_SUCCESS;
193 XGL_UINT8 *pData;
194
195 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
196 ASSERT_XGL_SUCCESS(err);
197
198 memcpy(pData + this->m_constantBufferView.offset, data, this->m_constantBufferView.range);
199
200 err = xglUnmapMemory(m_constantBufferMem);
201 ASSERT_XGL_SUCCESS(err);
202}
203
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600204void XglRenderFramework::CreateQueryPool(XGL_QUERY_TYPE type, XGL_UINT slots,
205 XGL_QUERY_POOL *pPool, XGL_GPU_MEMORY *pMem)
206{
207 XGL_RESULT err;
208
209 XGL_QUERY_POOL_CREATE_INFO poolCreateInfo = {};
210 poolCreateInfo.sType = XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
211 poolCreateInfo.pNext = NULL;
212 poolCreateInfo.queryType = type;
213 poolCreateInfo.slots = slots;
214
215 err = xglCreateQueryPool(device(), &poolCreateInfo, pPool);
216 ASSERT_XGL_SUCCESS(err);
217
218 XGL_MEMORY_REQUIREMENTS mem_req;
219 XGL_UINT data_size = sizeof(mem_req);
220 err = xglGetObjectInfo(*pPool, XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
221 &data_size, &mem_req);
222 ASSERT_XGL_SUCCESS(err);
223 ASSERT_EQ(data_size, sizeof(mem_req));
224
225 if (!mem_req.size) {
226 *pMem = XGL_NULL_HANDLE;
227 return;
228 }
229
230 XGL_MEMORY_ALLOC_INFO mem_info;
231
232 memset(&mem_info, 0, sizeof(mem_info));
233 mem_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
234 mem_info.allocationSize = mem_req.size;
235 mem_info.alignment = mem_req.alignment;
236 mem_info.heapCount = mem_req.heapCount;
237 memcpy(mem_info.heaps, mem_req.heaps, sizeof(XGL_UINT)*XGL_MAX_MEMORY_HEAPS);
238 mem_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
239 mem_info.flags = XGL_MEMORY_ALLOC_SHAREABLE_BIT;
240 err = xglAllocMemory(device(), &mem_info, pMem);
241 ASSERT_XGL_SUCCESS(err);
242
243 err = xglBindObjectMemory(*pPool, *pMem, 0);
244 ASSERT_XGL_SUCCESS(err);
245}
246
247void XglRenderFramework::DestroyQueryPool(XGL_QUERY_POOL pool, XGL_GPU_MEMORY mem)
248{
249 ASSERT_XGL_SUCCESS(xglBindObjectMemory(pool, XGL_NULL_HANDLE, 0));
250 ASSERT_XGL_SUCCESS(xglFreeMemory(mem));
251 ASSERT_XGL_SUCCESS(xglDestroyObject(pool));
252}
253
254void XglRenderFramework::CreateShader(XGL_PIPELINE_SHADER_STAGE stage,
255 const char *shader_code,
256 XGL_SHADER *pshader)
257{
Courtney Goeltzenleuchterbfde09b2014-10-10 16:29:46 -0600258 XGL_RESULT err = XGL_SUCCESS;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600259 std::vector<unsigned int> bil;
260 XGL_SHADER_CREATE_INFO createInfo;
Courtney Goeltzenleuchterbfde09b2014-10-10 16:29:46 -0600261 size_t shader_len;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600262 XGL_SHADER shader;
263
264 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
265 createInfo.pNext = NULL;
266
Courtney Goeltzenleuchterbfde09b2014-10-10 16:29:46 -0600267 if (!this->m_use_bil) {
268 shader_len = strlen(shader_code);
269 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
270 createInfo.pCode = malloc(createInfo.codeSize);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600271 createInfo.flags = 0;
Courtney Goeltzenleuchterbfde09b2014-10-10 16:29:46 -0600272
273 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
274 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
275 ((uint32_t *) createInfo.pCode)[1] = 0;
276 ((uint32_t *) createInfo.pCode)[2] = stage;
277 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
278
279 err = xglCreateShader(device(), &createInfo, &shader);
280 if (err) {
281 free((void *) createInfo.pCode);
282 }
283 }
284
285 // Only use BIL if GLSL compile fails or it's requested via m_use_bil
286 if (this->m_use_bil || err) {
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600287 // Use Reference GLSL to BIL compiler
288 GLSLtoBIL(stage, shader_code, bil);
289 createInfo.pCode = bil.data();
290 createInfo.codeSize = bil.size() * sizeof(unsigned int);
291 createInfo.flags = 0;
Courtney Goeltzenleuchterbfde09b2014-10-10 16:29:46 -0600292 err = xglCreateShader(device(), &createInfo, &shader);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600293 }
294
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600295 ASSERT_XGL_SUCCESS(err);
296
297 *pshader = shader;
298}
299
300void XglRenderFramework::InitViewport(float width, float height)
301{
302 XGL_RESULT err;
303
304 XGL_VIEWPORT_STATE_CREATE_INFO viewport = {};
305 viewport.viewportCount = 1;
306 viewport.scissorEnable = XGL_FALSE;
307 viewport.viewports[0].originX = 0;
308 viewport.viewports[0].originY = 0;
309 viewport.viewports[0].width = 1.f * width;
310 viewport.viewports[0].height = 1.f * height;
311 viewport.viewports[0].minDepth = 0.f;
312 viewport.viewports[0].maxDepth = 1.f;
313
314 err = xglCreateViewportState( device(), &viewport, &m_stateViewport );
315 ASSERT_XGL_SUCCESS( err );
316 m_width = width;
317 m_height = height;
318}
319
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600320void XglRenderFramework::InitViewport()
321{
322 InitViewport(m_width, m_height);
323}
324
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600325void XglRenderFramework::InitRenderTarget()
326{
327 m_device->CreateImage(m_width, m_height, m_render_target_fmt,
328 XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
329 XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
330 &m_renderTarget);
331}
332
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600333void XglRenderFramework::CreateDefaultPipeline(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600334{
335 XGL_RESULT err;
336 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
337 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
338 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
339
340#if 0
341 // Create descriptor set for our one resource
342 XGL_DESCRIPTOR_SET_CREATE_INFO descriptorInfo = {};
343 descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
344 descriptorInfo.slots = 1; // Vertex buffer only
345
346 // create a descriptor set with a single slot
347 err = xglCreateDescriptorSet( device(), &descriptorInfo, &m_rsrcDescSet );
348 ASSERT_XGL_SUCCESS(err) << "xglCreateDescriptorSet failed";
349
350 // bind memory to the descriptor set
351 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
352
353 // set up the memory view for the vertex buffer
354 this->m_vtxBufferView.stride = vbStride;
355 this->m_vtxBufferView.range = numVertices * vbStride;
356 this->m_vtxBufferView.offset = 0;
357 this->m_vtxBufferView.mem = m_vtxBufferMem;
358 this->m_vtxBufferView.format.channelFormat = XGL_CH_FMT_UNDEFINED;
359 this->m_vtxBufferView.format.numericFormat = XGL_NUM_FMT_UNDEFINED;
360 // write the vertex buffer view to the descriptor set
361 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
362 xglAttachMemoryViewDescriptors( m_rsrcDescSet, 0, 1, &m_vtxBufferView );
363 xglEndDescriptorSetUpdate( m_rsrcDescSet );
364#endif
Jon Ashburna15fa642014-11-19 09:23:30 -0700365 memset(&vs_stage, 0, sizeof(vs_stage));
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600366 vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
367 vs_stage.pNext = XGL_NULL_HANDLE;
368 vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600369 vs_stage.shader.shader = vs;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600370 vs_stage.shader.descriptorSetMapping[0].descriptorCount = 0;
371 vs_stage.shader.linkConstBufferCount = 0;
372 vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
373 vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
374 vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
375
Jon Ashburna15fa642014-11-19 09:23:30 -0700376 memset(&ps_stage, 0, sizeof(ps_stage));
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600377 ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
378 ps_stage.pNext = &vs_stage;
379 ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600380 ps_stage.shader.shader = ps;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600381
382 const int slots = 1;
383 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( slots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
384 slotInfo[0].shaderEntityIndex = 0;
385 slotInfo[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
386
387 ps_stage.shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
388 ps_stage.shader.descriptorSetMapping[0].descriptorCount = 1;
389
390 ps_stage.shader.linkConstBufferCount = 0;
391 ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
392 ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
393 ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
394
395 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
396 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
397 &ps_stage, // pNext
398 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
399 XGL_FALSE, // disableVertexReuse
400 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
401 XGL_FALSE, // primitiveRestartEnable
402 0 // primitiveRestartIndex
403 };
404
405 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
406 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
407 &ia_state,
408 XGL_FALSE, // depthClipEnable
409 XGL_FALSE, // rasterizerDiscardEnable
410 1.0 // pointSize
411 };
412
413 XGL_PIPELINE_CB_STATE cb_state = {
414 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
415 &rs_state,
416 XGL_FALSE, // alphaToCoverageEnable
417 XGL_FALSE, // dualSourceBlendEnable
418 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
419 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
420 {
421 XGL_FALSE, // blendEnable
422 m_render_target_fmt, // XGL_FORMAT
423 0xF // channelWriteMask
424 }
425 }
426 };
427
428 // TODO: Should take depth buffer format from queried formats
429 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
430 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
431 &cb_state,
432 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
433 };
434
435 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
436 info.pNext = &db_state;
437 info.flags = 0;
438 err = xglCreateGraphicsPipeline(device(), &info, pipeline);
439 ASSERT_XGL_SUCCESS(err);
440
441 err = m_device->AllocAndBindGpuMemory(*pipeline, "Pipeline", &m_pipe_mem);
442 ASSERT_XGL_SUCCESS(err);
443}
444
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600445void XglRenderFramework::GenerateBindRenderTargetCmd()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600446{
447 // bind render target
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600448 m_colorBinding.view = m_renderTarget->targetView();
449 m_colorBinding.colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
450 if (m_depthStencilBinding.view) {
451 xglCmdBindAttachments(m_cmdBuffer, 1, &m_colorBinding, &m_depthStencilBinding );
452 } else {
453 xglCmdBindAttachments(m_cmdBuffer, 1, &m_colorBinding, XGL_NULL_HANDLE );
454 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600455}
456
457void XglRenderFramework::GenerateBindStateAndPipelineCmds(XGL_PIPELINE* pipeline)
458{
459 // set all states
460 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, m_stateRaster );
461 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, m_stateViewport );
462 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
463 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil );
464 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
465
Chia-I Wu7a42e122014-11-08 10:48:20 +0800466 // bind pipeline and WVP (dynamic memory view)
Tony Barbour9d951a02014-11-19 16:33:11 -0700467 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, *pipeline );
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600468
Chia-I Wu7a42e122014-11-08 10:48:20 +0800469 // bind pipeline and WVP (dynamic memory view)
Tony Barbour9d951a02014-11-19 16:33:11 -0700470 xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
Chia-I Wu7a42e122014-11-08 10:48:20 +0800471
Tony Barbour9d951a02014-11-19 16:33:11 -0700472 xglCmdBindVertexData(m_cmdBuffer, m_vtxBufferView.mem, m_vtxBufferView.offset, 0);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600473}
474
Tony Barboure2c58df2014-11-25 13:18:32 -0700475void XglRenderFramework::GenerateBindStateAndPipelineCmds()
476{
477 // set all states
478 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, m_stateRaster );
479 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, m_stateViewport );
480 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
481 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil );
482 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
483}
484
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600485void XglRenderFramework::GenerateClearAndPrepareBufferCmds()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600486{
487 // whatever we want to do, we do it to the whole buffer
488 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
489 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
490 srRange.baseMipLevel = 0;
491 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
492 srRange.baseArraySlice = 0;
493 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
494
495 // prepare the whole back buffer for clear
496 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
497 transitionToClear.image = m_renderTarget->image();
498 transitionToClear.oldState = m_renderTarget->state();
499 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
500 transitionToClear.subresourceRange = srRange;
501 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
502 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
503
504 // clear the back buffer to dark grey
505 XGL_UINT clearColor[4] = {64, 64, 64, 0};
506 xglCmdClearColorImageRaw( m_cmdBuffer, m_renderTarget->image(), clearColor, 1, &srRange );
507
508 // prepare back buffer for rendering
509 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
510 transitionToRender.image = m_renderTarget->image();
511 transitionToRender.oldState = m_renderTarget->state();
512 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
513 transitionToRender.subresourceRange = srRange;
514 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
515 m_renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600516}
Tony Barboure2c58df2014-11-25 13:18:32 -0700517XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
518{
519 m_device = device;
520 m_nextSlot = 0;
521
522}
523
524void XglDescriptorSetObj::AttachMemoryView(XglConstantBufferObj *constantBuffer)
525{
526 m_memoryViews.push_back(&constantBuffer->m_constantBufferView);
527 m_memorySlots.push_back(m_nextSlot);
528 m_nextSlot++;
529
530}
531void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
532{
533 m_samplers.push_back(&sampler->m_sampler);
534 m_samplerSlots.push_back(m_nextSlot);
535 m_nextSlot++;
536
537}
538void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
539{
540 m_imageViews.push_back(&texture->m_textureViewInfo);
541 m_imageSlots.push_back(m_nextSlot);
542 m_nextSlot++;
543
544}
545XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
546 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
547 vector<XGL_OBJECT>objs )
548{
549 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
550 m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
551 memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
552
553 for (int i=0; i<nSlots; i++)
554 {
555 m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
556 }
557
558 for (int i=0; i<slots.size(); i++)
559 {
560 for (int j=0; j<m_memorySlots.size(); j++)
561 {
562 if ( (XGL_OBJECT) m_memoryViews[j] == objs[i])
563 {
564 m_slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
565 m_slotInfo[m_memorySlots[j]].slotObjectType = types[i];
566 }
567 }
568 for (int j=0; j<m_imageSlots.size(); j++)
569 {
570 if ( (XGL_OBJECT) m_imageViews[j] == objs[i])
571 {
572 m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
573 m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
574 }
575 }
576 for (int j=0; j<m_samplerSlots.size(); j++)
577 {
578 if ( (XGL_OBJECT) m_samplers[j] == objs[i])
579 {
580 m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
581 m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
582 }
583 }
584 }
585
586 // for (int i=0;i<nSlots;i++)
587 // {
588 // printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
589 // fflush(stdout);
590 // }
591
592 return(m_slotInfo);
593
594}
595
596void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
597{
598 XGL_RESULT err;
599
600 // Create descriptor set for a uniform resource
601 memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
602 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
603 m_descriptorInfo.slots = m_nextSlot;
604
605 // Create a descriptor set with requested number of slots
606 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
Tony Barbourba2a1062014-12-03 09:24:05 -0700607 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700608
609 // Bind memory to the descriptor set
610 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700611 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700612
613 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
614 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
615 for (int i=0; i<m_memoryViews.size();i++)
616 {
617 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
618 }
619 for (int i=0; i<m_samplers.size();i++)
620 {
621 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, m_samplers[i] );
622 }
623 for (int i=0; i<m_imageViews.size();i++)
624 {
625 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
626 }
627 xglEndDescriptorSetUpdate( m_rsrcDescSet );
628
629 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
630 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
631}
632
633XglTextureObj::XglTextureObj(XglDevice *device):
634 m_texture(XGL_NULL_HANDLE),
635 m_textureMem(XGL_NULL_HANDLE),
636 m_textureView(XGL_NULL_HANDLE)
637{
638 m_device = device;
639 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
640 m_texWidth = 16;
641 m_texHeight = 16;
642 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
643 XGL_RESULT err;
644 XGL_UINT i;
645
646 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
647
648 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
649
650 const XGL_IMAGE_CREATE_INFO image = {
651 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
652 .pNext = NULL,
653 .imageType = XGL_IMAGE_2D,
654 .format = tex_format,
655 .extent = { m_texWidth, m_texHeight, 1 },
656 .mipLevels = 1,
657 .arraySize = 1,
658 .samples = 1,
659 .tiling = XGL_LINEAR_TILING,
660 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
661 .flags = 0,
662 };
663
664 XGL_MEMORY_ALLOC_INFO mem_alloc;
665 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
666 mem_alloc.pNext = NULL;
667 mem_alloc.allocationSize = 0;
668 mem_alloc.alignment = 0;
669 mem_alloc.flags = 0;
670 mem_alloc.heapCount = 0;
671 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
672
673 XGL_IMAGE_VIEW_CREATE_INFO view;
674 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
675 view.pNext = NULL;
676 view.image = XGL_NULL_HANDLE;
677 view.viewType = XGL_IMAGE_VIEW_2D;
678 view.format = image.format;
679 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
680 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
681 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
682 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
683 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
684 view.subresourceRange.baseMipLevel = 0;
685 view.subresourceRange.mipLevels = 1;
686 view.subresourceRange.baseArraySlice = 0;
687 view.subresourceRange.arraySize = 1;
688 view.minLod = 0.0f;
689
690 XGL_MEMORY_REQUIREMENTS mem_reqs;
691 XGL_SIZE mem_reqs_size=sizeof(XGL_MEMORY_REQUIREMENTS);
692
693 /* create image */
694 err = xglCreateImage(m_device->device(), &image, &m_texture);
695 assert(!err);
696
697 err = xglGetObjectInfo(m_texture,
698 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
699 &mem_reqs_size, &mem_reqs);
700 assert(!err && mem_reqs_size == sizeof(mem_reqs));
701
702 mem_alloc.allocationSize = mem_reqs.size;
703 mem_alloc.alignment = mem_reqs.alignment;
704 mem_alloc.heapCount = mem_reqs.heapCount;
705 memcpy(mem_alloc.heaps, mem_reqs.heaps,
706 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
707
708 /* allocate memory */
709 err = xglAllocMemory(m_device->device(), &mem_alloc, &m_textureMem);
710 assert(!err);
711
712 /* bind memory */
713 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
714 assert(!err);
715
716 /* create image view */
717 view.image = m_texture;
718 err = xglCreateImageView(m_device->device(), &view, &m_textureView);
719 assert(!err);
720
721
722 const XGL_IMAGE_SUBRESOURCE subres = {
723 .aspect = XGL_IMAGE_ASPECT_COLOR,
724 .mipLevel = 0,
725 .arraySlice = 0,
726 };
727 XGL_SUBRESOURCE_LAYOUT layout;
728 XGL_SIZE layout_size=sizeof(layout);
729 XGL_VOID *data;
730 XGL_INT x, y;
731
732 err = xglGetImageSubresourceInfo(m_texture, &subres,
733 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
734 assert(!err && layout_size == sizeof(layout));
735 m_rowPitch = layout.rowPitch;
736
737 err = xglMapMemory(m_textureMem, 0, &data);
738 assert(!err);
739
740 for (y = 0; y < m_texHeight; y++) {
741 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
742 for (x = 0; x < m_texWidth; x++)
743 row[x] = tex_colors[(x & 1) ^ (y & 1)];
744 }
745
746 err = xglUnmapMemory(m_textureMem);
747 assert(!err);
748
749 m_textureViewInfo.view = m_textureView;
750
751}
752
753void XglTextureObj::ChangeColors(uint32_t color1, uint32_t color2)
754{
755 XGL_RESULT err;
756 const uint32_t tex_colors[2] = { color1, color2 };
757 XGL_VOID *data;
758
759 err = xglMapMemory(m_textureMem, 0, &data);
760 assert(!err);
761
762 for (int y = 0; y < m_texHeight; y++) {
763 uint32_t *row = (uint32_t *) ((char *) data + m_rowPitch * y);
764 for (int x = 0; x < m_texWidth; x++)
765 row[x] = tex_colors[(x & 1) ^ (y & 1)];
766 }
767
768 err = xglUnmapMemory(m_textureMem);
769 assert(!err);
770}
771
772XglSamplerObj::XglSamplerObj(XglDevice *device)
773{
774 XGL_RESULT err = XGL_SUCCESS;
775
776 m_device = device;
777 memset(&m_samplerCreateInfo,0,sizeof(m_samplerCreateInfo));
778 m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
779 m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
780 m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
781 m_samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
782 m_samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
783 m_samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
784 m_samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
785 m_samplerCreateInfo.mipLodBias = 0.0;
786 m_samplerCreateInfo.maxAnisotropy = 0.0;
787 m_samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
788 m_samplerCreateInfo.minLod = 0.0;
789 m_samplerCreateInfo.maxLod = 0.0;
790 m_samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
791
792 err = xglCreateSampler(m_device->device(),&m_samplerCreateInfo, &m_sampler);
Tony Barbourba2a1062014-12-03 09:24:05 -0700793 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700794
795}
796
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700797/*
798 * Basic ConstantBuffer constructor. Then use create methods to fill in the details.
799 */
800XglConstantBufferObj::XglConstantBufferObj(XglDevice *device)
801{
802 m_device = device;
803
804 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
805 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
806}
807
Tony Barboure2c58df2014-11-25 13:18:32 -0700808XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
809{
810 XGL_RESULT err = XGL_SUCCESS;
811 XGL_UINT8 *pData;
812 XGL_MEMORY_ALLOC_INFO alloc_info = {};
813 m_device = device;
814 m_numVertices = constantCount;
815 m_stride = constantSize;
816
817 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
818 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
819
820 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
821 alloc_info.allocationSize = constantCount * constantSize;
822 alloc_info.alignment = 0;
823 alloc_info.heapCount = 1;
824 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
825
826 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
827 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
828
829 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700830 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700831
832 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
Tony Barbourba2a1062014-12-03 09:24:05 -0700833 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700834
835 memcpy(pData, data, alloc_info.allocationSize);
836
837 err = xglUnmapMemory(m_constantBufferMem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700838 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700839
840 // set up the memory view for the constant buffer
841 this->m_constantBufferView.stride = 16;
842 this->m_constantBufferView.range = alloc_info.allocationSize;
843 this->m_constantBufferView.offset = 0;
844 this->m_constantBufferView.mem = m_constantBufferMem;
845 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
846 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
847 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
848}
849
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700850void XglConstantBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset, XGL_UINT binding)
851{
852 xglCmdBindVertexData(cmdBuffer, this->m_constantBufferMem, offset, binding);
853}
854
855
Tony Barboure2c58df2014-11-25 13:18:32 -0700856void XglConstantBufferObj::SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState)
857{
858 if (this->m_constantBufferView.state == newState)
859 return;
860
861 // open the command buffer
862 XGL_RESULT err = xglBeginCommandBuffer( cmdBuffer, 0 );
863 ASSERT_XGL_SUCCESS(err);
864
865 XGL_MEMORY_STATE_TRANSITION transition = {};
866 transition.mem = m_constantBufferMem;
867 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
868 transition.newState = newState;
869 transition.offset = 0;
870 transition.regionSize = m_numVertices * m_stride;
871
872 // write transition to the command buffer
873 xglCmdPrepareMemoryRegions( cmdBuffer, 1, &transition );
874 this->m_constantBufferView.state = newState;
875
876 // finish recording the command buffer
877 err = xglEndCommandBuffer( cmdBuffer );
878 ASSERT_XGL_SUCCESS(err);
879
880 XGL_UINT32 numMemRefs=1;
881 XGL_MEMORY_REF memRefs;
882 // this command buffer only uses the vertex buffer memory
883 memRefs.flags = 0;
884 memRefs.mem = m_constantBufferMem;
885
886 // submit the command buffer to the universal queue
887 err = xglQueueSubmit( m_device->m_queue, 1, &cmdBuffer, numMemRefs, &memRefs, NULL );
888 ASSERT_XGL_SUCCESS(err);
889}
890
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700891XglIndexBufferObj::XglIndexBufferObj(XglDevice *device)
892 : XglConstantBufferObj(device)
893{
894
895}
896
897void XglIndexBufferObj::CreateAndInitBuffer(int numIndexes, XGL_INDEX_TYPE indexType, const void* data)
898{
899 XGL_RESULT err = XGL_SUCCESS;
900 XGL_UINT8 *pData;
901 XGL_MEMORY_ALLOC_INFO alloc_info = {};
902 XGL_FORMAT viewFormat;
903
904 m_numVertices = numIndexes;
905 m_indexType = indexType;
906 viewFormat.numericFormat = XGL_NUM_FMT_UINT;
907 switch (indexType) {
908 case XGL_INDEX_8:
909 m_stride = 1;
910 viewFormat.channelFormat = XGL_CH_FMT_R8;
911 break;
912 case XGL_INDEX_16:
913 m_stride = 2;
914 viewFormat.channelFormat = XGL_CH_FMT_R16;
915 break;
916 case XGL_INDEX_32:
917 m_stride = 4;
918 viewFormat.channelFormat = XGL_CH_FMT_R32;
919 break;
920 }
921
922 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
923 alloc_info.allocationSize = numIndexes * m_stride;
924 alloc_info.alignment = 0;
925 alloc_info.heapCount = 1;
926 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
927
928 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
929 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
930
931 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
932 ASSERT_XGL_SUCCESS(err);
933
934 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
935 ASSERT_XGL_SUCCESS(err);
936
937 memcpy(pData, data, alloc_info.allocationSize);
938
939 err = xglUnmapMemory(m_constantBufferMem);
940 ASSERT_XGL_SUCCESS(err);
941
942 // set up the memory view for the constant buffer
943 this->m_constantBufferView.stride = m_stride;
944 this->m_constantBufferView.range = alloc_info.allocationSize;
945 this->m_constantBufferView.offset = 0;
946 this->m_constantBufferView.mem = m_constantBufferMem;
947 this->m_constantBufferView.format.channelFormat = viewFormat.channelFormat;
948 this->m_constantBufferView.format.numericFormat = viewFormat.numericFormat;
949 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
950}
951
952void XglIndexBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset)
953{
954 xglCmdBindIndexData(cmdBuffer, this->m_constantBufferMem, offset, m_indexType);
955}
Tony Barboure2c58df2014-11-25 13:18:32 -0700956
957XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj descriptorSet)
958{
959 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
960 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
961 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
962 stageInfo->shader.stage = m_stage;
963 stageInfo->shader.shader = m_shader;
964 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
965 stageInfo->shader.linkConstBufferCount = 0;
966 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
967 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
968 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
969
970 stageInfo->shader.descriptorSetMapping[0].descriptorCount = m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size();
971 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
972 {
973 vector<int> allSlots;
974 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
975 vector<XGL_OBJECT> allObjs;
976
977 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
978 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
979 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
980
981 if (m_memSlots.size())
982 {
983 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
984 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
985 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
986 }
987 if (m_imageSlots.size())
988 {
989 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
990 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
991 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
992 }
993 if (m_samplerSlots.size())
994 {
995 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
996 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
997 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
998 }
999
1000 slotInfo = descriptorSet.GetSlotInfo(allSlots, allTypes, allObjs);
1001 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
1002 }
1003 return stageInfo;
1004}
1005
1006void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
1007{
1008 m_memSlots.push_back(slot);
1009 m_memTypes.push_back(type);
1010 m_memObjs.push_back((XGL_OBJECT) &constantBuffer->m_constantBufferView);
1011
1012}
1013void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
1014{
1015 m_imageSlots.push_back(slot);
1016 m_imageTypes.push_back(type);
1017 m_imageObjs.push_back((XGL_OBJECT) &texture->m_textureViewInfo);
1018
1019}
1020void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
1021{
1022 m_samplerSlots.push_back(slot);
1023 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
1024 m_samplerObjs.push_back(sampler->m_sampler);
1025
1026}
1027XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework)
1028{
1029 XGL_RESULT err = XGL_SUCCESS;
1030 std::vector<unsigned int> bil;
1031 XGL_SHADER_CREATE_INFO createInfo;
1032 size_t shader_len;
1033
1034 m_stage = stage;
1035 m_device = device;
1036
1037 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
1038 createInfo.pNext = NULL;
1039
1040 if (!framework->m_use_bil) {
1041
1042 shader_len = strlen(shader_code);
1043 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
1044 createInfo.pCode = malloc(createInfo.codeSize);
1045 createInfo.flags = 0;
1046
1047 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
1048 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
1049 ((uint32_t *) createInfo.pCode)[1] = 0;
1050 ((uint32_t *) createInfo.pCode)[2] = stage;
1051 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
1052
1053 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
1054 if (err) {
1055 free((void *) createInfo.pCode);
1056 }
1057 }
1058
1059 if (framework->m_use_bil || err) {
1060 std::vector<unsigned int> bil;
1061 err = XGL_SUCCESS;
1062
1063 // Use Reference GLSL to BIL compiler
1064 framework->GLSLtoBIL(stage, shader_code, bil);
1065 createInfo.pCode = bil.data();
1066 createInfo.codeSize = bil.size() * sizeof(unsigned int);
1067 createInfo.flags = 0;
1068 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
Tony Barbourba2a1062014-12-03 09:24:05 -07001069 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -07001070 }
1071}
Tony Barboure2c58df2014-11-25 13:18:32 -07001072
1073XglPipelineObj::XglPipelineObj(XglDevice *device)
1074{
1075 XGL_RESULT err;
1076
1077 m_device = device;
1078 m_vi_state.attributeCount = m_vi_state.bindingCount = 0;
1079 m_vertexBufferCount = 0;
1080
1081 m_ia_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
1082 m_ia_state.pNext = XGL_NULL_HANDLE;
1083 m_ia_state.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
1084 m_ia_state.disableVertexReuse = XGL_FALSE;
1085 m_ia_state.provokingVertex = XGL_PROVOKING_VERTEX_LAST;
1086 m_ia_state.primitiveRestartEnable = XGL_FALSE;
1087 m_ia_state.primitiveRestartIndex = 0;
1088
1089 m_rs_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
1090 m_rs_state.pNext = &m_ia_state;
1091 m_rs_state.depthClipEnable = XGL_FALSE;
1092 m_rs_state.rasterizerDiscardEnable = XGL_FALSE;
1093 m_rs_state.pointSize = 1.0;
1094
1095 m_render_target_format.channelFormat = XGL_CH_FMT_R8G8B8A8;
1096 m_render_target_format.numericFormat = XGL_NUM_FMT_UNORM;
1097
1098 memset(&m_cb_state,0,sizeof(m_cb_state));
1099 m_cb_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
1100 m_cb_state.pNext = &m_rs_state;
1101 m_cb_state.alphaToCoverageEnable = XGL_FALSE;
1102 m_cb_state.dualSourceBlendEnable = XGL_FALSE;
1103 m_cb_state.logicOp = XGL_LOGIC_OP_COPY;
1104
1105 m_cb_attachment_state.blendEnable = XGL_FALSE;
1106 m_cb_attachment_state.format = m_render_target_format;
1107 m_cb_attachment_state.channelWriteMask = 0xF;
1108 m_cb_state.attachment[0] = m_cb_attachment_state;
1109
1110 m_db_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
1111 m_db_state.pNext = &m_cb_state,
1112 m_db_state.format.channelFormat = XGL_CH_FMT_R32;
1113 m_db_state.format.numericFormat = XGL_NUM_FMT_DS;
1114
1115
1116};
1117
1118void XglPipelineObj::AddShader(XglShaderObj* shader)
1119{
1120 m_shaderObjs.push_back(shader);
1121}
1122
1123void XglPipelineObj::AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count)
1124{
1125 m_vi_state.pVertexAttributeDescriptions = vi_attrib;
1126 m_vi_state.attributeCount = count;
1127}
1128
1129void XglPipelineObj::AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count)
1130{
1131 m_vi_state.pVertexBindingDescriptions = vi_binding;
1132 m_vi_state.bindingCount = count;
1133}
1134
1135void XglPipelineObj::AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding)
1136{
1137 m_vertexBufferObjs.push_back(vertexDataBuffer);
1138 m_vertexBufferBindings.push_back(binding);
1139 m_vertexBufferCount++;
1140}
1141
1142void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet)
1143{
1144 XGL_RESULT err;
1145 XGL_VOID* head_ptr = &m_db_state;
1146 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
1147
1148 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
1149 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vertexInputAttrib;
1150
1151 for (int i=0; i<m_shaderObjs.size(); i++)
1152 {
1153 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
1154 shaderCreateInfo->pNext = head_ptr;
1155 head_ptr = shaderCreateInfo;
1156 }
1157
1158 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
1159 {
1160 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
1161 m_vi_state.pNext = head_ptr;
1162 head_ptr = &m_vi_state;
1163 }
1164
1165 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1166 info.pNext = head_ptr;
1167 info.flags = 0;
1168
1169 err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
Tony Barbourba2a1062014-12-03 09:24:05 -07001170 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -07001171
1172 err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -07001173 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -07001174
1175 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline );
1176
1177
1178 for (int i=0; i < m_vertexBufferCount; i++)
1179 {
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -07001180 m_vertexBufferObjs[i]->Bind(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -07001181 }
Tony Barboure2c58df2014-11-25 13:18:32 -07001182}
1183
1184
1185XglMemoryRefManager::XglMemoryRefManager() {
1186
1187}
1188void XglMemoryRefManager::AddMemoryRef(XglConstantBufferObj *constantBuffer) {
1189 m_bufferObjs.push_back(&constantBuffer->m_constantBufferMem);
1190}
1191void XglMemoryRefManager::AddMemoryRef(XglTextureObj *texture) {
1192 m_bufferObjs.push_back(&texture->m_textureMem);
1193}
1194XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
1195
1196 XGL_MEMORY_REF *localRefs;
1197 XGL_UINT32 numRefs=m_bufferObjs.size();
1198
1199 if (numRefs <= 0)
1200 return NULL;
1201
1202 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
1203 for (int i=0; i<numRefs; i++)
1204 {
1205 localRefs[i].flags = 0;
1206 localRefs[i].mem = *m_bufferObjs[i];
1207 }
1208 return localRefs;
1209}
1210int XglMemoryRefManager::GetNumRefs() {
1211 return m_bufferObjs.size();
1212}