blob: 076bf03e916bf4f99269eaf12cb3560013454c5c [file] [log] [blame]
Tony Barbourf12bfb92014-11-19 16:33:11 -07001#include "xglrenderframework.h"
Tony Barbour32f368c2014-10-30 14:29:04 -06002
3XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
4{
5 m_device = device;
6 m_nextSlot = 0;
7
8}
9
Tony Barbour685f4332014-11-20 15:06:56 -070010void XglDescriptorSetObj::AttachMemoryView(XglConstantBufferObj *constantBuffer)
Tony Barbour32f368c2014-10-30 14:29:04 -060011{
Tony Barbour685f4332014-11-20 15:06:56 -070012 m_memoryViews.push_back(&constantBuffer->m_constantBufferView);
Tony Barbour32f368c2014-10-30 14:29:04 -060013 m_memorySlots.push_back(m_nextSlot);
14 m_nextSlot++;
15
16}
Tony Barbour685f4332014-11-20 15:06:56 -070017void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
Tony Barbour32f368c2014-10-30 14:29:04 -060018{
Tony Barbour685f4332014-11-20 15:06:56 -070019 m_samplers.push_back(&sampler->m_sampler);
Tony Barbour32f368c2014-10-30 14:29:04 -060020 m_samplerSlots.push_back(m_nextSlot);
21 m_nextSlot++;
22
23}
Tony Barbour685f4332014-11-20 15:06:56 -070024void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
Tony Barbour32f368c2014-10-30 14:29:04 -060025{
Tony Barbour685f4332014-11-20 15:06:56 -070026 m_imageViews.push_back(&texture->m_textureViewInfo);
Tony Barbour32f368c2014-10-30 14:29:04 -060027 m_imageSlots.push_back(m_nextSlot);
28 m_nextSlot++;
29
30}
31XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
32 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
33 vector<XGL_OBJECT>objs )
34{
35 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
Tony Barbour685f4332014-11-20 15:06:56 -070036 m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
37 memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
Tony Barbour92992672014-11-18 16:46:56 -070038
Tony Barbour32f368c2014-10-30 14:29:04 -060039 for (int i=0; i<nSlots; i++)
40 {
Tony Barbour685f4332014-11-20 15:06:56 -070041 m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
Tony Barbour32f368c2014-10-30 14:29:04 -060042 }
43
44 for (int i=0; i<slots.size(); i++)
45 {
46 for (int j=0; j<m_memorySlots.size(); j++)
47 {
48 if ( (XGL_OBJECT) m_memoryViews[j] == objs[i])
49 {
Tony Barbour685f4332014-11-20 15:06:56 -070050 m_slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
51 m_slotInfo[m_memorySlots[j]].slotObjectType = types[i];
Tony Barbour32f368c2014-10-30 14:29:04 -060052 }
53 }
54 for (int j=0; j<m_imageSlots.size(); j++)
55 {
56 if ( (XGL_OBJECT) m_imageViews[j] == objs[i])
57 {
Tony Barbour685f4332014-11-20 15:06:56 -070058 m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
59 m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
Tony Barbour32f368c2014-10-30 14:29:04 -060060 }
61 }
62 for (int j=0; j<m_samplerSlots.size(); j++)
63 {
64 if ( (XGL_OBJECT) m_samplers[j] == objs[i])
65 {
Tony Barbour685f4332014-11-20 15:06:56 -070066 m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
67 m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
Tony Barbour32f368c2014-10-30 14:29:04 -060068 }
69 }
70 }
71
72 for (int i=0;i<nSlots;i++)
73 {
Tony Barbour685f4332014-11-20 15:06:56 -070074 printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
Tony Barbour32f368c2014-10-30 14:29:04 -060075 fflush(stdout);
76 }
77
Tony Barbour685f4332014-11-20 15:06:56 -070078 return(m_slotInfo);
Tony Barbour32f368c2014-10-30 14:29:04 -060079
80}
81
82void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
83{
84 XGL_RESULT err;
85
86 // Create descriptor set for a uniform resource
Tony Barbourf12bfb92014-11-19 16:33:11 -070087 memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
Tony Barbour32f368c2014-10-30 14:29:04 -060088 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
89 m_descriptorInfo.slots = m_nextSlot;
90
91 // Create a descriptor set with requested number of slots
92 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
93
94 // Bind memory to the descriptor set
95 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
96
97 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
98 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
99 for (int i=0; i<m_memoryViews.size();i++)
100 {
101 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
102 }
103 for (int i=0; i<m_samplers.size();i++)
104 {
105 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, m_samplers[i] );
106 }
107 for (int i=0; i<m_imageViews.size();i++)
108 {
109 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
110 }
111 xglEndDescriptorSetUpdate( m_rsrcDescSet );
112
113 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
114 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
115}
116
Tony Barbour32f368c2014-10-30 14:29:04 -0600117
Tony Barbour92992672014-11-18 16:46:56 -0700118XglTextureObj::XglTextureObj(XglDevice *device):
119 m_texture(XGL_NULL_HANDLE),
120 m_textureMem(XGL_NULL_HANDLE),
121 m_textureView(XGL_NULL_HANDLE)
Tony Barbour32f368c2014-10-30 14:29:04 -0600122{
123 m_device = device;
124 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
125 const XGL_INT tex_width = 16;
126 const XGL_INT tex_height = 16;
127 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
128 XGL_RESULT err;
129 XGL_UINT i;
130
Tony Barbour92992672014-11-18 16:46:56 -0700131 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
Tony Barbour32f368c2014-10-30 14:29:04 -0600132
133 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
134
135 const XGL_IMAGE_CREATE_INFO image = {
136 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
137 .pNext = NULL,
138 .imageType = XGL_IMAGE_2D,
139 .format = tex_format,
140 .extent = { tex_width, tex_height, 1 },
141 .mipLevels = 1,
142 .arraySize = 1,
143 .samples = 1,
144 .tiling = XGL_LINEAR_TILING,
145 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
146 .flags = 0,
147 };
148
149 XGL_MEMORY_ALLOC_INFO mem_alloc;
150 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
151 mem_alloc.pNext = NULL;
152 mem_alloc.allocationSize = 0;
153 mem_alloc.alignment = 0;
154 mem_alloc.flags = 0;
155 mem_alloc.heapCount = 0;
156 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
157
158 XGL_IMAGE_VIEW_CREATE_INFO view;
159 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
160 view.pNext = NULL;
161 view.image = XGL_NULL_HANDLE;
162 view.viewType = XGL_IMAGE_VIEW_2D;
163 view.format = image.format;
164 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
165 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
166 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
167 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
168 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
169 view.subresourceRange.baseMipLevel = 0;
170 view.subresourceRange.mipLevels = 1;
171 view.subresourceRange.baseArraySlice = 0;
172 view.subresourceRange.arraySize = 1;
173 view.minLod = 0.0f;
174
175 XGL_MEMORY_REQUIREMENTS mem_reqs;
176 XGL_SIZE mem_reqs_size;
177
178 /* create image */
179 err = xglCreateImage(m_device->device(), &image, &m_texture);
180 assert(!err);
181
182 err = xglGetObjectInfo(m_texture,
183 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
184 &mem_reqs_size, &mem_reqs);
185 assert(!err && mem_reqs_size == sizeof(mem_reqs));
186
187 mem_alloc.allocationSize = mem_reqs.size;
188 mem_alloc.alignment = mem_reqs.alignment;
189 mem_alloc.heapCount = mem_reqs.heapCount;
190 memcpy(mem_alloc.heaps, mem_reqs.heaps,
191 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
192
193 /* allocate memory */
194 err = xglAllocMemory(m_device->device(), &mem_alloc, &m_textureMem);
195 assert(!err);
196
197 /* bind memory */
198 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
199 assert(!err);
200
201 /* create image view */
202 view.image = m_texture;
203 err = xglCreateImageView(m_device->device(), &view, &m_textureView);
204 assert(!err);
205
206
207 const XGL_IMAGE_SUBRESOURCE subres = {
208 .aspect = XGL_IMAGE_ASPECT_COLOR,
209 .mipLevel = 0,
210 .arraySlice = 0,
211 };
212 XGL_SUBRESOURCE_LAYOUT layout;
213 XGL_SIZE layout_size;
214 XGL_VOID *data;
215 XGL_INT x, y;
216
217 err = xglGetImageSubresourceInfo(m_texture, &subres,
218 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
219 assert(!err && layout_size == sizeof(layout));
220
221 err = xglMapMemory(m_textureMem, 0, &data);
222 assert(!err);
223
224 for (y = 0; y < tex_height; y++) {
225 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
226 for (x = 0; x < tex_width; x++)
227 row[x] = tex_colors[(x & 1) ^ (y & 1)];
228 }
229
230 err = xglUnmapMemory(m_textureMem);
231 assert(!err);
232
233 m_textureViewInfo.view = m_textureView;
234
235}
236
Tony Barbour32f368c2014-10-30 14:29:04 -0600237
Tony Barbour32f368c2014-10-30 14:29:04 -0600238
239XglSamplerObj::XglSamplerObj(XglDevice *device)
240{
241 XGL_RESULT err = XGL_SUCCESS;
242
243 m_device = device;
Tony Barbourf12bfb92014-11-19 16:33:11 -0700244 memset(&m_samplerCreateInfo,0,sizeof(m_samplerCreateInfo));
Tony Barbour32f368c2014-10-30 14:29:04 -0600245 m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
246 m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
247 m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
248 m_samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
249 m_samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
250 m_samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
251 m_samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
252 m_samplerCreateInfo.mipLodBias = 0.0;
253 m_samplerCreateInfo.maxAnisotropy = 0.0;
254 m_samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
255 m_samplerCreateInfo.minLod = 0.0;
256 m_samplerCreateInfo.maxLod = 0.0;
257 m_samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
258
259 err = xglCreateSampler(m_device->device(),&m_samplerCreateInfo, &m_sampler);
260
261}
262
Tony Barbour32f368c2014-10-30 14:29:04 -0600263XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
264{
265 XGL_RESULT err = XGL_SUCCESS;
266 XGL_UINT8 *pData;
267 XGL_MEMORY_ALLOC_INFO alloc_info = {};
268 m_device = device;
269 m_numVertices = constantCount;
270 m_stride = constantSize;
271
Tony Barbour92992672014-11-18 16:46:56 -0700272 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
273 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
274
Tony Barbour32f368c2014-10-30 14:29:04 -0600275 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
276 alloc_info.allocationSize = constantCount * constantSize;
277 alloc_info.alignment = 0;
278 alloc_info.heapCount = 1;
279 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
280
281 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
282 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
283
284 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
285
286 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
287
288 memcpy(pData, data, alloc_info.allocationSize);
289
290 err = xglUnmapMemory(m_constantBufferMem);
291
292 // set up the memory view for the constant buffer
293 this->m_constantBufferView.stride = 16;
294 this->m_constantBufferView.range = alloc_info.allocationSize;
295 this->m_constantBufferView.offset = 0;
296 this->m_constantBufferView.mem = m_constantBufferMem;
297 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
298 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
299 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
300}
301
302void XglConstantBufferObj::SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState)
303{
304 if (this->m_constantBufferView.state == newState)
305 return;
306
307 // open the command buffer
308 XGL_RESULT err = xglBeginCommandBuffer( cmdBuffer, 0 );
309 ASSERT_XGL_SUCCESS(err);
310
311 XGL_MEMORY_STATE_TRANSITION transition = {};
312 transition.mem = m_constantBufferMem;
313 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
314 transition.newState = newState;
315 transition.offset = 0;
316 transition.regionSize = m_numVertices * m_stride;
317
318 // write transition to the command buffer
319 xglCmdPrepareMemoryRegions( cmdBuffer, 1, &transition );
320 this->m_constantBufferView.state = newState;
321
322 // finish recording the command buffer
323 err = xglEndCommandBuffer( cmdBuffer );
324 ASSERT_XGL_SUCCESS(err);
325
326 XGL_UINT32 numMemRefs=1;
327 XGL_MEMORY_REF memRefs;
328 // this command buffer only uses the vertex buffer memory
329 memRefs.flags = 0;
330 memRefs.mem = m_constantBufferMem;
331
332 // submit the command buffer to the universal queue
333 err = xglQueueSubmit( m_device->m_queue, 1, &cmdBuffer, numMemRefs, &memRefs, NULL );
334 ASSERT_XGL_SUCCESS(err);
335}
336
Tony Barbour32f368c2014-10-30 14:29:04 -0600337
338XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj descriptorSet)
339{
340 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
341 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
342 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
343 stageInfo->shader.stage = m_stage;
344 stageInfo->shader.shader = m_shader;
345 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
346 stageInfo->shader.linkConstBufferCount = 0;
347 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
348 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
349 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
350
351 stageInfo->shader.descriptorSetMapping[0].descriptorCount = m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size();
352 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
353 {
354 vector<int> allSlots;
355 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
356 vector<XGL_OBJECT> allObjs;
357
358 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
359 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
360 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
361
362 if (m_memSlots.size())
363 {
364 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
365 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
366 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
367 }
368 if (m_imageSlots.size())
369 {
370 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
371 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
372 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
373 }
374 if (m_samplerSlots.size())
375 {
376 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
377 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
378 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
379 }
380
381 slotInfo = descriptorSet.GetSlotInfo(allSlots, allTypes, allObjs);
382 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
383 }
384 return stageInfo;
385}
386
Tony Barbour685f4332014-11-20 15:06:56 -0700387void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
Tony Barbour32f368c2014-10-30 14:29:04 -0600388{
389 m_memSlots.push_back(slot);
390 m_memTypes.push_back(type);
Tony Barbour685f4332014-11-20 15:06:56 -0700391 m_memObjs.push_back((XGL_OBJECT) &constantBuffer->m_constantBufferView);
Tony Barbour32f368c2014-10-30 14:29:04 -0600392
393}
Tony Barbour685f4332014-11-20 15:06:56 -0700394void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
Tony Barbour32f368c2014-10-30 14:29:04 -0600395{
396 m_imageSlots.push_back(slot);
397 m_imageTypes.push_back(type);
Tony Barbour685f4332014-11-20 15:06:56 -0700398 m_imageObjs.push_back((XGL_OBJECT) &texture->m_textureViewInfo);
Tony Barbour32f368c2014-10-30 14:29:04 -0600399
400}
Tony Barbour685f4332014-11-20 15:06:56 -0700401void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
Tony Barbour32f368c2014-10-30 14:29:04 -0600402{
403 m_samplerSlots.push_back(slot);
404 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
Tony Barbour685f4332014-11-20 15:06:56 -0700405 m_samplerObjs.push_back(sampler->m_sampler);
Tony Barbour32f368c2014-10-30 14:29:04 -0600406
407}
408XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage)
409{
410 XGL_RESULT err = XGL_SUCCESS;
411 std::vector<unsigned int> bil;
412 XGL_SHADER_CREATE_INFO createInfo;
413 size_t shader_len;
414
415 m_stage = stage;
416 m_device = device;
417
418 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
419 createInfo.pNext = NULL;
420
421 shader_len = strlen(shader_code);
422 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
423 createInfo.pCode = malloc(createInfo.codeSize);
424 createInfo.flags = 0;
425
426 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
427 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
428 ((uint32_t *) createInfo.pCode)[1] = 0;
429 ((uint32_t *) createInfo.pCode)[2] = stage;
430 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
431
432 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
433 if (err) {
434 free((void *) createInfo.pCode);
435 }
436}
437#if 0
438void XglShaderObj::CreateShaderBIL(XGL_PIPELINE_SHADER_STAGE stage,
439 const char *shader_code,
440 XGL_SHADER *pshader)
441{
442 XGL_RESULT err = XGL_SUCCESS;
443 std::vector<unsigned int> bil;
444 XGL_SHADER_CREATE_INFO createInfo;
445 size_t shader_len;
446 XGL_SHADER shader;
447
448 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
449 createInfo.pNext = NULL;
450
451 // Use Reference GLSL to BIL compiler
452 GLSLtoBIL(stage, shader_code, bil);
453 createInfo.pCode = bil.data();
454 createInfo.codeSize = bil.size() * sizeof(unsigned int);
455 createInfo.flags = 0;
456 err = xglCreateShader(device(), &createInfo, &shader);
457
458 ASSERT_XGL_SUCCESS(err);
459
460 *pshader = shader;
461}
462#endif
Tony Barbour32f368c2014-10-30 14:29:04 -0600463
464XglPipelineObj::XglPipelineObj(XglDevice *device)
465{
466 XGL_RESULT err;
467
468 m_device = device;
Tony Barbour685f4332014-11-20 15:06:56 -0700469 m_vi_state.attributeCount = m_vi_state.bindingCount = 0;
470 m_vertexBufferCount = 0;
Tony Barbour32f368c2014-10-30 14:29:04 -0600471
Tony Barbourf12bfb92014-11-19 16:33:11 -0700472 m_ia_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
473 m_ia_state.pNext = XGL_NULL_HANDLE;
474 m_ia_state.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
475 m_ia_state.disableVertexReuse = XGL_FALSE;
476 m_ia_state.provokingVertex = XGL_PROVOKING_VERTEX_LAST;
477 m_ia_state.primitiveRestartEnable = XGL_FALSE;
478 m_ia_state.primitiveRestartIndex = 0;
Tony Barbour32f368c2014-10-30 14:29:04 -0600479
Tony Barbourf12bfb92014-11-19 16:33:11 -0700480 m_rs_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
481 m_rs_state.pNext = &m_ia_state;
482 m_rs_state.depthClipEnable = XGL_FALSE;
483 m_rs_state.rasterizerDiscardEnable = XGL_FALSE;
484 m_rs_state.pointSize = 1.0;
Tony Barbour32f368c2014-10-30 14:29:04 -0600485
Tony Barbourf12bfb92014-11-19 16:33:11 -0700486 m_render_target_format.channelFormat = XGL_CH_FMT_R8G8B8A8;
487 m_render_target_format.numericFormat = XGL_NUM_FMT_UNORM;
Tony Barbour32f368c2014-10-30 14:29:04 -0600488
Tony Barbourf12bfb92014-11-19 16:33:11 -0700489 memset(&m_cb_state,0,sizeof(m_cb_state));
490 m_cb_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
491 m_cb_state.pNext = &m_rs_state;
492 m_cb_state.alphaToCoverageEnable = XGL_FALSE;
493 m_cb_state.dualSourceBlendEnable = XGL_FALSE;
494 m_cb_state.logicOp = XGL_LOGIC_OP_COPY;
495
496 m_cb_attachment_state.blendEnable = XGL_FALSE;
497 m_cb_attachment_state.format = m_render_target_format;
498 m_cb_attachment_state.channelWriteMask = 0xF;
499 m_cb_state.attachment[0] = m_cb_attachment_state;
500
501 m_db_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
502 m_db_state.pNext = &m_cb_state,
503 m_db_state.format.channelFormat = XGL_CH_FMT_R32;
504 m_db_state.format.numericFormat = XGL_NUM_FMT_DS;
Tony Barbour32f368c2014-10-30 14:29:04 -0600505
506
507};
508
509void XglPipelineObj::AddShader(XglShaderObj* shader)
510{
511 m_shaderObjs.push_back(shader);
512}
513
514void XglPipelineObj::AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count)
515{
Tony Barbour685f4332014-11-20 15:06:56 -0700516 m_vi_state.pVertexAttributeDescriptions = vi_attrib;
517 m_vi_state.attributeCount = count;
Tony Barbour32f368c2014-10-30 14:29:04 -0600518}
519
520void XglPipelineObj::AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count)
521{
Tony Barbour685f4332014-11-20 15:06:56 -0700522 m_vi_state.pVertexBindingDescriptions = vi_binding;
523 m_vi_state.bindingCount = count;
Tony Barbour32f368c2014-10-30 14:29:04 -0600524}
525
Tony Barbour2af38f82014-12-01 13:29:55 -0700526void XglPipelineObj::AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding)
Tony Barbour32f368c2014-10-30 14:29:04 -0600527{
528 m_vertexBufferObjs.push_back(vertexDataBuffer);
Tony Barbour2af38f82014-12-01 13:29:55 -0700529 m_vertexBufferBindings.push_back(binding);
Tony Barbour32f368c2014-10-30 14:29:04 -0600530 m_vertexBufferCount++;
531}
532
533void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet)
534{
535 XGL_RESULT err;
Tony Barbourf12bfb92014-11-19 16:33:11 -0700536 XGL_VOID* head_ptr = &m_db_state;
Tony Barbour32f368c2014-10-30 14:29:04 -0600537 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
538
539 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
540 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vertexInputAttrib;
541
542 for (int i=0; i<m_shaderObjs.size(); i++)
543 {
544 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
545 shaderCreateInfo->pNext = head_ptr;
546 head_ptr = shaderCreateInfo;
547 }
548
Tony Barbour685f4332014-11-20 15:06:56 -0700549 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
Tony Barbour32f368c2014-10-30 14:29:04 -0600550 {
Tony Barbourf12bfb92014-11-19 16:33:11 -0700551 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
552 m_vi_state.pNext = head_ptr;
Tony Barbourf12bfb92014-11-19 16:33:11 -0700553 head_ptr = &m_vi_state;
Tony Barbour32f368c2014-10-30 14:29:04 -0600554 }
555
556 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
557 info.pNext = head_ptr;
558 info.flags = 0;
559
Tony Barbourf12bfb92014-11-19 16:33:11 -0700560 err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
Tony Barbour32f368c2014-10-30 14:29:04 -0600561
Tony Barbourf12bfb92014-11-19 16:33:11 -0700562 err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
Tony Barbour32f368c2014-10-30 14:29:04 -0600563
Tony Barbourf12bfb92014-11-19 16:33:11 -0700564 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline );
Tony Barbour32f368c2014-10-30 14:29:04 -0600565
566
567 for (int i=0; i < m_vertexBufferCount; i++)
568 {
Tony Barbour2af38f82014-12-01 13:29:55 -0700569 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 -0600570 }
571
Tony Barbour32f368c2014-10-30 14:29:04 -0600572}
573
Tony Barbour32f368c2014-10-30 14:29:04 -0600574
Tony Barbour32f368c2014-10-30 14:29:04 -0600575XglMemoryRefManager::XglMemoryRefManager() {
576
577}
Tony Barbour685f4332014-11-20 15:06:56 -0700578void XglMemoryRefManager::AddMemoryRef(XglConstantBufferObj *constantBuffer) {
579 m_bufferObjs.push_back(&constantBuffer->m_constantBufferMem);
580}
581void XglMemoryRefManager::AddMemoryRef(XglTextureObj *texture) {
582 m_bufferObjs.push_back(&texture->m_textureMem);
Tony Barbour32f368c2014-10-30 14:29:04 -0600583}
584XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
585
586 XGL_MEMORY_REF *localRefs;
587 XGL_UINT32 numRefs=m_bufferObjs.size();
588
589 if (numRefs <= 0)
590 return NULL;
591
592 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
593 for (int i=0; i<numRefs; i++)
594 {
595 localRefs[i].flags = 0;
596 localRefs[i].mem = *m_bufferObjs[i];
597 }
598 return localRefs;
599}
600int XglMemoryRefManager::GetNumRefs() {
601 return m_bufferObjs.size();
602}