blob: f8c8fa9b88438375e4a19b0f9be08abee33ef05c [file] [log] [blame]
Tony Barbour32f368c2014-10-30 14:29:04 -06001class XglDescriptorSetObj
2{
3public:
4 XglDescriptorSetObj(XglDevice *device);
5 void AttachMemoryView( XGL_MEMORY_VIEW_ATTACH_INFO* memoryView);
6 void AttachSampler( XGL_SAMPLER* sampler);
7 void AttachImageView( XGL_IMAGE_VIEW_ATTACH_INFO* imageView);
8 void BindCommandBuffer(XGL_CMD_BUFFER commandBuffer);
9 XGL_DESCRIPTOR_SLOT_INFO * GetSlotInfo(vector<int>slots, vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types, vector<XGL_OBJECT>objs );
10
11protected:
12 XGL_DESCRIPTOR_SET_CREATE_INFO m_descriptorInfo;
13 XGL_DESCRIPTOR_SET m_rsrcDescSet;
14 XGL_GPU_MEMORY m_descriptor_set_mem;
15 XglDevice *m_device;
16 int m_nextSlot;
17 vector<int> m_memorySlots;
18 vector<XGL_MEMORY_VIEW_ATTACH_INFO*> m_memoryViews;
19 vector<int> m_samplerSlots;
20 vector<XGL_SAMPLER*> m_samplers;
21 vector<int> m_imageSlots;
22 vector<XGL_IMAGE_VIEW_ATTACH_INFO*> m_imageViews;
23};
24
25XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
26{
27 m_device = device;
28 m_nextSlot = 0;
29
30}
31
32void XglDescriptorSetObj::AttachMemoryView(XGL_MEMORY_VIEW_ATTACH_INFO* memoryView)
33{
34 m_memoryViews.push_back(memoryView);
35 m_memorySlots.push_back(m_nextSlot);
36 m_nextSlot++;
37
38}
39void XglDescriptorSetObj::AttachSampler(XGL_SAMPLER* sampler)
40{
41 m_samplers.push_back(sampler);
42 m_samplerSlots.push_back(m_nextSlot);
43 m_nextSlot++;
44
45}
46void XglDescriptorSetObj::AttachImageView(XGL_IMAGE_VIEW_ATTACH_INFO* imageView)
47{
48 m_imageViews.push_back(imageView);
49 m_imageSlots.push_back(m_nextSlot);
50 m_nextSlot++;
51
52}
53XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
54 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
55 vector<XGL_OBJECT>objs )
56{
57 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
58 XGL_DESCRIPTOR_SLOT_INFO *slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
Tony Barbour92992672014-11-18 16:46:56 -070059 memset(slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
60
Tony Barbour32f368c2014-10-30 14:29:04 -060061 for (int i=0; i<nSlots; i++)
62 {
63 slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
64 }
65
66 for (int i=0; i<slots.size(); i++)
67 {
68 for (int j=0; j<m_memorySlots.size(); j++)
69 {
70 if ( (XGL_OBJECT) m_memoryViews[j] == objs[i])
71 {
72 slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
73 slotInfo[m_memorySlots[j]].slotObjectType = types[i];
74 }
75 }
76 for (int j=0; j<m_imageSlots.size(); j++)
77 {
78 if ( (XGL_OBJECT) m_imageViews[j] == objs[i])
79 {
80 slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
81 slotInfo[m_imageSlots[j]].slotObjectType = types[i];
82 }
83 }
84 for (int j=0; j<m_samplerSlots.size(); j++)
85 {
86 if ( (XGL_OBJECT) m_samplers[j] == objs[i])
87 {
88 slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
89 slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
90 }
91 }
92 }
93
94 for (int i=0;i<nSlots;i++)
95 {
96 printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,slotInfo[i].shaderEntityIndex, slotInfo[i].slotObjectType);
97 fflush(stdout);
98 }
99
100 return(slotInfo);
101
102}
103
104void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
105{
106 XGL_RESULT err;
107
108 // Create descriptor set for a uniform resource
109 m_descriptorInfo = {};
110 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
111 m_descriptorInfo.slots = m_nextSlot;
112
113 // Create a descriptor set with requested number of slots
114 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
115
116 // Bind memory to the descriptor set
117 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
118
119 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
120 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
121 for (int i=0; i<m_memoryViews.size();i++)
122 {
123 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
124 }
125 for (int i=0; i<m_samplers.size();i++)
126 {
127 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, m_samplers[i] );
128 }
129 for (int i=0; i<m_imageViews.size();i++)
130 {
131 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
132 }
133 xglEndDescriptorSetUpdate( m_rsrcDescSet );
134
135 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
136 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
137}
138
139class XglTextureObj
140{
141public:
142 XglTextureObj(XglDevice *device);
143 XGL_IMAGE m_texture;
144 XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
145 XGL_GPU_MEMORY m_textureMem;
146
147protected:
148 XglDevice *m_device;
149 XGL_IMAGE_VIEW m_textureView;
150
151};
Tony Barbour92992672014-11-18 16:46:56 -0700152XglTextureObj::XglTextureObj(XglDevice *device):
153 m_texture(XGL_NULL_HANDLE),
154 m_textureMem(XGL_NULL_HANDLE),
155 m_textureView(XGL_NULL_HANDLE)
Tony Barbour32f368c2014-10-30 14:29:04 -0600156{
157 m_device = device;
158 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
159 const XGL_INT tex_width = 16;
160 const XGL_INT tex_height = 16;
161 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
162 XGL_RESULT err;
163 XGL_UINT i;
164
Tony Barbour92992672014-11-18 16:46:56 -0700165 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
Tony Barbour32f368c2014-10-30 14:29:04 -0600166
167 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
168
169 const XGL_IMAGE_CREATE_INFO image = {
170 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
171 .pNext = NULL,
172 .imageType = XGL_IMAGE_2D,
173 .format = tex_format,
174 .extent = { tex_width, tex_height, 1 },
175 .mipLevels = 1,
176 .arraySize = 1,
177 .samples = 1,
178 .tiling = XGL_LINEAR_TILING,
179 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
180 .flags = 0,
181 };
182
183 XGL_MEMORY_ALLOC_INFO mem_alloc;
184 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
185 mem_alloc.pNext = NULL;
186 mem_alloc.allocationSize = 0;
187 mem_alloc.alignment = 0;
188 mem_alloc.flags = 0;
189 mem_alloc.heapCount = 0;
190 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
191
192 XGL_IMAGE_VIEW_CREATE_INFO view;
193 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
194 view.pNext = NULL;
195 view.image = XGL_NULL_HANDLE;
196 view.viewType = XGL_IMAGE_VIEW_2D;
197 view.format = image.format;
198 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
199 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
200 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
201 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
202 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
203 view.subresourceRange.baseMipLevel = 0;
204 view.subresourceRange.mipLevels = 1;
205 view.subresourceRange.baseArraySlice = 0;
206 view.subresourceRange.arraySize = 1;
207 view.minLod = 0.0f;
208
209 XGL_MEMORY_REQUIREMENTS mem_reqs;
210 XGL_SIZE mem_reqs_size;
211
212 /* create image */
213 err = xglCreateImage(m_device->device(), &image, &m_texture);
214 assert(!err);
215
216 err = xglGetObjectInfo(m_texture,
217 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
218 &mem_reqs_size, &mem_reqs);
219 assert(!err && mem_reqs_size == sizeof(mem_reqs));
220
221 mem_alloc.allocationSize = mem_reqs.size;
222 mem_alloc.alignment = mem_reqs.alignment;
223 mem_alloc.heapCount = mem_reqs.heapCount;
224 memcpy(mem_alloc.heaps, mem_reqs.heaps,
225 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
226
227 /* allocate memory */
228 err = xglAllocMemory(m_device->device(), &mem_alloc, &m_textureMem);
229 assert(!err);
230
231 /* bind memory */
232 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
233 assert(!err);
234
235 /* create image view */
236 view.image = m_texture;
237 err = xglCreateImageView(m_device->device(), &view, &m_textureView);
238 assert(!err);
239
240
241 const XGL_IMAGE_SUBRESOURCE subres = {
242 .aspect = XGL_IMAGE_ASPECT_COLOR,
243 .mipLevel = 0,
244 .arraySlice = 0,
245 };
246 XGL_SUBRESOURCE_LAYOUT layout;
247 XGL_SIZE layout_size;
248 XGL_VOID *data;
249 XGL_INT x, y;
250
251 err = xglGetImageSubresourceInfo(m_texture, &subres,
252 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
253 assert(!err && layout_size == sizeof(layout));
254
255 err = xglMapMemory(m_textureMem, 0, &data);
256 assert(!err);
257
258 for (y = 0; y < tex_height; y++) {
259 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
260 for (x = 0; x < tex_width; x++)
261 row[x] = tex_colors[(x & 1) ^ (y & 1)];
262 }
263
264 err = xglUnmapMemory(m_textureMem);
265 assert(!err);
266
267 m_textureViewInfo.view = m_textureView;
268
269}
270
271class XglSamplerObj
272{
273public:
274 XglSamplerObj(XglDevice *device);
275 XGL_SAMPLER m_sampler;
276
277protected:
278 XGL_SAMPLER_CREATE_INFO m_samplerCreateInfo = {};
279 XglDevice *m_device;
280
281};
282
283XglSamplerObj::XglSamplerObj(XglDevice *device)
284{
285 XGL_RESULT err = XGL_SUCCESS;
286
287 m_device = device;
288 m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
289 m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
290 m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
291 m_samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
292 m_samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
293 m_samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
294 m_samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
295 m_samplerCreateInfo.mipLodBias = 0.0;
296 m_samplerCreateInfo.maxAnisotropy = 0.0;
297 m_samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
298 m_samplerCreateInfo.minLod = 0.0;
299 m_samplerCreateInfo.maxLod = 0.0;
300 m_samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
301
302 err = xglCreateSampler(m_device->device(),&m_samplerCreateInfo, &m_sampler);
303
304}
305
306class XglConstantBufferObj
307{
308public:
309 XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data);
310 void SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState);
311 XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
312 XGL_GPU_MEMORY m_constantBufferMem;
313
314protected:
315 XglDevice *m_device;
316 int m_numVertices;
317 int m_stride;
318};
319XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
320{
321 XGL_RESULT err = XGL_SUCCESS;
322 XGL_UINT8 *pData;
323 XGL_MEMORY_ALLOC_INFO alloc_info = {};
324 m_device = device;
325 m_numVertices = constantCount;
326 m_stride = constantSize;
327
Tony Barbour92992672014-11-18 16:46:56 -0700328 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
329 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
330
Tony Barbour32f368c2014-10-30 14:29:04 -0600331 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
332 alloc_info.allocationSize = constantCount * constantSize;
333 alloc_info.alignment = 0;
334 alloc_info.heapCount = 1;
335 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
336
337 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
338 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
339
340 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
341
342 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
343
344 memcpy(pData, data, alloc_info.allocationSize);
345
346 err = xglUnmapMemory(m_constantBufferMem);
347
348 // set up the memory view for the constant buffer
349 this->m_constantBufferView.stride = 16;
350 this->m_constantBufferView.range = alloc_info.allocationSize;
351 this->m_constantBufferView.offset = 0;
352 this->m_constantBufferView.mem = m_constantBufferMem;
353 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
354 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
355 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
356}
357
358void XglConstantBufferObj::SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState)
359{
360 if (this->m_constantBufferView.state == newState)
361 return;
362
363 // open the command buffer
364 XGL_RESULT err = xglBeginCommandBuffer( cmdBuffer, 0 );
365 ASSERT_XGL_SUCCESS(err);
366
367 XGL_MEMORY_STATE_TRANSITION transition = {};
368 transition.mem = m_constantBufferMem;
369 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
370 transition.newState = newState;
371 transition.offset = 0;
372 transition.regionSize = m_numVertices * m_stride;
373
374 // write transition to the command buffer
375 xglCmdPrepareMemoryRegions( cmdBuffer, 1, &transition );
376 this->m_constantBufferView.state = newState;
377
378 // finish recording the command buffer
379 err = xglEndCommandBuffer( cmdBuffer );
380 ASSERT_XGL_SUCCESS(err);
381
382 XGL_UINT32 numMemRefs=1;
383 XGL_MEMORY_REF memRefs;
384 // this command buffer only uses the vertex buffer memory
385 memRefs.flags = 0;
386 memRefs.mem = m_constantBufferMem;
387
388 // submit the command buffer to the universal queue
389 err = xglQueueSubmit( m_device->m_queue, 1, &cmdBuffer, numMemRefs, &memRefs, NULL );
390 ASSERT_XGL_SUCCESS(err);
391}
392
393class XglShaderObj
394{
395public:
396 XglShaderObj(XglDevice *device, const char * shaderText, XGL_PIPELINE_SHADER_STAGE stage );
397 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* GetStageCreateInfo(XglDescriptorSetObj descriptorSet);
398 void BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
399 void BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
400 void BindShaderEntitySlotToSampler(int slot, XGL_OBJECT object);
401
402protected:
403 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO stage_info;
404 XGL_SHADER m_shader;
405 XGL_PIPELINE_SHADER_STAGE m_stage;
406 XglDevice *m_device;
407 vector<int> m_memSlots;
408 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_memTypes;
409 vector<XGL_OBJECT> m_memObjs;
410 vector<int> m_samplerSlots;
411 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_samplerTypes;
412 vector<XGL_OBJECT> m_samplerObjs;
413 vector<int> m_imageSlots;
414 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_imageTypes;
415 vector<XGL_OBJECT> m_imageObjs;
416
417};
418
419XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj descriptorSet)
420{
421 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
422 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
423 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
424 stageInfo->shader.stage = m_stage;
425 stageInfo->shader.shader = m_shader;
426 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
427 stageInfo->shader.linkConstBufferCount = 0;
428 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
429 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
430 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
431
432 stageInfo->shader.descriptorSetMapping[0].descriptorCount = m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size();
433 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
434 {
435 vector<int> allSlots;
436 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
437 vector<XGL_OBJECT> allObjs;
438
439 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
440 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
441 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
442
443 if (m_memSlots.size())
444 {
445 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
446 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
447 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
448 }
449 if (m_imageSlots.size())
450 {
451 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
452 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
453 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
454 }
455 if (m_samplerSlots.size())
456 {
457 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
458 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
459 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
460 }
461
462 slotInfo = descriptorSet.GetSlotInfo(allSlots, allTypes, allObjs);
463 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
464 }
465 return stageInfo;
466}
467
468void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object)
469{
470 m_memSlots.push_back(slot);
471 m_memTypes.push_back(type);
472 m_memObjs.push_back(object);
473
474}
475void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object)
476{
477 m_imageSlots.push_back(slot);
478 m_imageTypes.push_back(type);
479 m_imageObjs.push_back(object);
480
481}
482void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XGL_OBJECT object)
483{
484 m_samplerSlots.push_back(slot);
485 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
486 m_samplerObjs.push_back(object);
487
488}
489XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage)
490{
491 XGL_RESULT err = XGL_SUCCESS;
492 std::vector<unsigned int> bil;
493 XGL_SHADER_CREATE_INFO createInfo;
494 size_t shader_len;
495
496 m_stage = stage;
497 m_device = device;
498
499 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
500 createInfo.pNext = NULL;
501
502 shader_len = strlen(shader_code);
503 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
504 createInfo.pCode = malloc(createInfo.codeSize);
505 createInfo.flags = 0;
506
507 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
508 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
509 ((uint32_t *) createInfo.pCode)[1] = 0;
510 ((uint32_t *) createInfo.pCode)[2] = stage;
511 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
512
513 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
514 if (err) {
515 free((void *) createInfo.pCode);
516 }
517}
518#if 0
519void XglShaderObj::CreateShaderBIL(XGL_PIPELINE_SHADER_STAGE stage,
520 const char *shader_code,
521 XGL_SHADER *pshader)
522{
523 XGL_RESULT err = XGL_SUCCESS;
524 std::vector<unsigned int> bil;
525 XGL_SHADER_CREATE_INFO createInfo;
526 size_t shader_len;
527 XGL_SHADER shader;
528
529 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
530 createInfo.pNext = NULL;
531
532 // Use Reference GLSL to BIL compiler
533 GLSLtoBIL(stage, shader_code, bil);
534 createInfo.pCode = bil.data();
535 createInfo.codeSize = bil.size() * sizeof(unsigned int);
536 createInfo.flags = 0;
537 err = xglCreateShader(device(), &createInfo, &shader);
538
539 ASSERT_XGL_SUCCESS(err);
540
541 *pshader = shader;
542}
543#endif
544class XglPipelineObj
545{
546public:
547 XglPipelineObj(XglDevice *device);
548 void BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet);
549 void AddShader(XglShaderObj* shaderObj);
550 void AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count);
551 void AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count);
Tony Barbour2af38f82014-12-01 13:29:55 -0700552 void AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding);
Tony Barbour32f368c2014-10-30 14:29:04 -0600553
554protected:
555 XGL_PIPELINE pipeline;
556 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state;
557 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state;
558 XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state;
559 XGL_PIPELINE_CB_STATE cb_state;
560 XGL_PIPELINE_DB_STATE_CREATE_INFO db_state;
561 XGL_FORMAT render_target_format;
562 XGL_GPU_MEMORY m_pipe_mem;
563 XglDevice *m_device;
564 XGL_VERTEX_INPUT_BINDING_DESCRIPTION *m_vi_binding;
565 int m_vi_binding_count;
566 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION *m_vi_attribs;
567 int m_vi_attrib_count;
568 vector<XglShaderObj*> m_shaderObjs;
569 vector<XglConstantBufferObj*> m_vertexBufferObjs;
Tony Barbour2af38f82014-12-01 13:29:55 -0700570 vector<int> m_vertexBufferBindings;
Tony Barbour32f368c2014-10-30 14:29:04 -0600571 int m_vertexBufferCount;
572
573};
574
575XglPipelineObj::XglPipelineObj(XglDevice *device)
576{
577 XGL_RESULT err;
578
579 m_device = device;
580 m_vi_attrib_count = m_vi_binding_count = m_vertexBufferCount = 0;
581
582 ia_state = {
583 XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
584 XGL_NULL_HANDLE, // pNext
585 XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
586 XGL_FALSE, // disableVertexReuse
587 XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
588 XGL_FALSE, // primitiveRestartEnable
589 0 // primitiveRestartIndex
590 };
591
592 rs_state = {
593 XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
594 &ia_state,
595 XGL_FALSE, // depthClipEnable
596 XGL_FALSE, // rasterizerDiscardEnable
597 1.0 // pointSize
598 };
599
600 render_target_format.channelFormat = XGL_CH_FMT_R8G8B8A8;
601 render_target_format.numericFormat = XGL_NUM_FMT_UNORM;
602 cb_state = {
603 XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
604 &rs_state,
605 XGL_FALSE, // alphaToCoverageEnable
606 XGL_FALSE, // dualSourceBlendEnable
607 XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
608 { // XGL_PIPELINE_CB_ATTACHMENT_STATE
609 {
610 XGL_FALSE, // blendEnable
611 render_target_format, // XGL_FORMAT
612 0xF // channelWriteMask
613 }
614 }
615 };
616
617 db_state = {
618 XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
619 &cb_state,
620 {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
621 };
622
623
624};
625
626void XglPipelineObj::AddShader(XglShaderObj* shader)
627{
628 m_shaderObjs.push_back(shader);
629}
630
631void XglPipelineObj::AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count)
632{
633 m_vi_attribs = vi_attrib;
634 m_vi_attrib_count = count;
635}
636
637void XglPipelineObj::AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count)
638{
639 m_vi_binding = vi_binding;
640 m_vi_binding_count = count;
641}
642
Tony Barbour2af38f82014-12-01 13:29:55 -0700643void XglPipelineObj::AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding)
Tony Barbour32f368c2014-10-30 14:29:04 -0600644{
645 m_vertexBufferObjs.push_back(vertexDataBuffer);
Tony Barbour2af38f82014-12-01 13:29:55 -0700646 m_vertexBufferBindings.push_back(binding);
Tony Barbour32f368c2014-10-30 14:29:04 -0600647 m_vertexBufferCount++;
648}
649
650void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet)
651{
652 XGL_RESULT err;
653 XGL_VOID* head_ptr = &db_state;
654 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
655
656 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
657 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vertexInputAttrib;
658
659 for (int i=0; i<m_shaderObjs.size(); i++)
660 {
661 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
662 shaderCreateInfo->pNext = head_ptr;
663 head_ptr = shaderCreateInfo;
664 }
665
666 if (m_vi_attrib_count && m_vi_binding_count)
667 {
668 vi_state = {
669 XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
670 head_ptr, // pNext;
671 m_vi_binding_count, // bindingCount
672 m_vi_binding, // pVertexBindingDescriptions;
673 m_vi_attrib_count, // attributeCount; // number of attributes
674 m_vi_attribs // pVertexAttributeDescriptions;
675 };
676 head_ptr = &vi_state;
677 }
678
679 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
680 info.pNext = head_ptr;
681 info.flags = 0;
682
683 err = xglCreateGraphicsPipeline(m_device->device(), &info, &pipeline);
684
685 err = m_device->AllocAndBindGpuMemory(pipeline, "Pipeline", &m_pipe_mem);
686
687 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, pipeline );
688
689
690 for (int i=0; i < m_vertexBufferCount; i++)
691 {
Tony Barbour2af38f82014-12-01 13:29:55 -0700692 xglCmdBindVertexData(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.mem, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
Tony Barbour32f368c2014-10-30 14:29:04 -0600693 }
694
695
696 // xglCmdBindVertexData(m_cmdBuffer, meshBuffer.m_constantBufferView.mem, meshBuffer.m_constantBufferView.offset, 0);
697}
698
699class XglMemoryRefManager{
700public:
701 XglMemoryRefManager();
702 void AddMemoryRef(XGL_GPU_MEMORY* memoryRef);
703 XGL_MEMORY_REF* GetMemoryRefList();
704 int GetNumRefs();
705
706protected:
707 int m_numRefs;
708 vector<XGL_GPU_MEMORY*> m_bufferObjs;
709
710};
711XglMemoryRefManager::XglMemoryRefManager() {
712
713}
714void XglMemoryRefManager::AddMemoryRef(XGL_GPU_MEMORY *memoryRef) {
715 m_bufferObjs.push_back(memoryRef);
716}
717XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
718
719 XGL_MEMORY_REF *localRefs;
720 XGL_UINT32 numRefs=m_bufferObjs.size();
721
722 if (numRefs <= 0)
723 return NULL;
724
725 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
726 for (int i=0; i<numRefs; i++)
727 {
728 localRefs[i].flags = 0;
729 localRefs[i].mem = *m_bufferObjs[i];
730 }
731 return localRefs;
732}
733int XglMemoryRefManager::GetNumRefs() {
734 return m_bufferObjs.size();
735}