blob: 3acac4029b24edd885dd7e5f37fd5f5b90bbce72 [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{
Chia-I Wuecebf752014-12-05 10:45:15 +080040 XGL_UINT i;
41
42 m_renderTargetCount = 1;
43
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060044 m_render_target_fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
45 m_render_target_fmt.numericFormat = XGL_NUM_FMT_UNORM;
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -060046
Chia-I Wuecebf752014-12-05 10:45:15 +080047 m_colorBindings[0].view = XGL_NULL_HANDLE;
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -060048 m_depthStencilBinding.view = XGL_NULL_HANDLE;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060049}
50
51XglRenderFramework::~XglRenderFramework()
52{
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060053
54}
55
56void XglRenderFramework::InitFramework()
57{
58 XGL_RESULT err;
59
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060060 err = xglInitAndEnumerateGpus(&app_info, NULL,
61 MAX_GPUS, &this->gpu_count, objs);
62 ASSERT_XGL_SUCCESS(err);
Jon Ashburnbf843b22014-11-26 11:06:49 -070063 ASSERT_GE(this->gpu_count, 1) << "No GPU available";
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060064
65 m_device = new XglDevice(0, objs[0]);
66 m_device->get_device_queue();
67}
68
69void XglRenderFramework::ShutdownFramework()
70{
71 if (m_colorBlend) xglDestroyObject(m_colorBlend);
72 if (m_stateMsaa) xglDestroyObject(m_stateMsaa);
73 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
74 if (m_stateRaster) xglDestroyObject(m_stateRaster);
75 if (m_cmdBuffer) xglDestroyObject(m_cmdBuffer);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060076
77 if (m_stateViewport) {
78 xglDestroyObject(m_stateViewport);
79 }
80
Chia-I Wuecebf752014-12-05 10:45:15 +080081 for (XGL_UINT i = 0; i < m_renderTargetCount; i++) {
82 if (m_renderTargets[i]) {
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060083 // TODO: XglImage should be able to destroy itself
84// m_renderTarget->
85// xglDestroyObject(*m_renderTarget);
Chia-I Wuecebf752014-12-05 10:45:15 +080086 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060087 }
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
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600149void XglRenderFramework::InitViewport(float width, float height)
150{
151 XGL_RESULT err;
152
153 XGL_VIEWPORT_STATE_CREATE_INFO viewport = {};
154 viewport.viewportCount = 1;
155 viewport.scissorEnable = XGL_FALSE;
156 viewport.viewports[0].originX = 0;
157 viewport.viewports[0].originY = 0;
158 viewport.viewports[0].width = 1.f * width;
159 viewport.viewports[0].height = 1.f * height;
160 viewport.viewports[0].minDepth = 0.f;
161 viewport.viewports[0].maxDepth = 1.f;
162
163 err = xglCreateViewportState( device(), &viewport, &m_stateViewport );
164 ASSERT_XGL_SUCCESS( err );
165 m_width = width;
166 m_height = height;
167}
168
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600169void XglRenderFramework::InitViewport()
170{
171 InitViewport(m_width, m_height);
172}
173
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600174void XglRenderFramework::InitRenderTarget()
175{
Chia-I Wuecebf752014-12-05 10:45:15 +0800176 XGL_UINT i;
177
178 for (i = 0; i < m_renderTargetCount; i++) {
179 m_device->CreateImage(m_width, m_height, m_render_target_fmt,
180 XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
181 XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
182 &m_renderTargets[i]);
183 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600184}
185
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600186void XglRenderFramework::GenerateBindRenderTargetCmd()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600187{
Chia-I Wuecebf752014-12-05 10:45:15 +0800188 XGL_UINT i;
189
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600190 // bind render target
Chia-I Wuecebf752014-12-05 10:45:15 +0800191 for (i = 0; i < m_renderTargetCount; i++) {
192 m_colorBindings[i].view = m_renderTargets[i]->targetView();
193 m_colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
194 }
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600195 if (m_depthStencilBinding.view) {
Chia-I Wuecebf752014-12-05 10:45:15 +0800196 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, &m_depthStencilBinding );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600197 } else {
Chia-I Wuecebf752014-12-05 10:45:15 +0800198 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, XGL_NULL_HANDLE );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600199 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600200}
201
Tony Barboure2c58df2014-11-25 13:18:32 -0700202void XglRenderFramework::GenerateBindStateAndPipelineCmds()
203{
204 // set all states
205 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, m_stateRaster );
206 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, m_stateViewport );
207 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
208 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil );
209 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
210}
211
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600212void XglRenderFramework::GenerateClearAndPrepareBufferCmds()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600213{
Chia-I Wuecebf752014-12-05 10:45:15 +0800214 XGL_UINT i;
215
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600216 // whatever we want to do, we do it to the whole buffer
217 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
218 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
219 srRange.baseMipLevel = 0;
220 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
221 srRange.baseArraySlice = 0;
222 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
223
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600224 // clear the back buffer to dark grey
225 XGL_UINT clearColor[4] = {64, 64, 64, 0};
Chia-I Wuecebf752014-12-05 10:45:15 +0800226 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
227 for (i = 0; i < m_renderTargetCount; i++) {
228 transitionToClear.image = m_renderTargets[i]->image();
229 transitionToClear.oldState = m_renderTargets[i]->state();
230 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
231 transitionToClear.subresourceRange = srRange;
232 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
233 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
234
235 xglCmdClearColorImageRaw( m_cmdBuffer, m_renderTargets[i]->image(), clearColor, 1, &srRange );
236 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600237
238 // prepare back buffer for rendering
239 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
Chia-I Wuecebf752014-12-05 10:45:15 +0800240 for (i = 0; i < m_renderTargetCount; i++) {
241 transitionToRender.image = m_renderTargets[i]->image();
242 transitionToRender.oldState = m_renderTargets[i]->state();
243 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
244 transitionToRender.subresourceRange = srRange;
245 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
246 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
247 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600248}
Tony Barbour82c39522014-12-04 14:33:33 -0700249
Tony Barboure2c58df2014-11-25 13:18:32 -0700250XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
251{
252 m_device = device;
253 m_nextSlot = 0;
254
255}
256
257void XglDescriptorSetObj::AttachMemoryView(XglConstantBufferObj *constantBuffer)
258{
259 m_memoryViews.push_back(&constantBuffer->m_constantBufferView);
260 m_memorySlots.push_back(m_nextSlot);
261 m_nextSlot++;
262
263}
Tony Barbour82c39522014-12-04 14:33:33 -0700264
Tony Barboure2c58df2014-11-25 13:18:32 -0700265void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
266{
267 m_samplers.push_back(&sampler->m_sampler);
268 m_samplerSlots.push_back(m_nextSlot);
269 m_nextSlot++;
270
271}
Tony Barbour82c39522014-12-04 14:33:33 -0700272
Tony Barboure2c58df2014-11-25 13:18:32 -0700273void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
274{
275 m_imageViews.push_back(&texture->m_textureViewInfo);
276 m_imageSlots.push_back(m_nextSlot);
277 m_nextSlot++;
278
279}
Tony Barbour82c39522014-12-04 14:33:33 -0700280
Tony Barboure2c58df2014-11-25 13:18:32 -0700281XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
282 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
283 vector<XGL_OBJECT>objs )
284{
285 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
286 m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
287 memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
288
289 for (int i=0; i<nSlots; i++)
290 {
291 m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
292 }
293
294 for (int i=0; i<slots.size(); i++)
295 {
296 for (int j=0; j<m_memorySlots.size(); j++)
297 {
298 if ( (XGL_OBJECT) m_memoryViews[j] == objs[i])
299 {
300 m_slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
301 m_slotInfo[m_memorySlots[j]].slotObjectType = types[i];
302 }
303 }
304 for (int j=0; j<m_imageSlots.size(); j++)
305 {
306 if ( (XGL_OBJECT) m_imageViews[j] == objs[i])
307 {
308 m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
309 m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
310 }
311 }
312 for (int j=0; j<m_samplerSlots.size(); j++)
313 {
314 if ( (XGL_OBJECT) m_samplers[j] == objs[i])
315 {
316 m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
317 m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
318 }
319 }
320 }
321
322 // for (int i=0;i<nSlots;i++)
323 // {
324 // printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
325 // fflush(stdout);
326 // }
327
328 return(m_slotInfo);
329
330}
331
332void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
333{
334 XGL_RESULT err;
335
336 // Create descriptor set for a uniform resource
337 memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
338 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
339 m_descriptorInfo.slots = m_nextSlot;
340
341 // Create a descriptor set with requested number of slots
342 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
Tony Barbourba2a1062014-12-03 09:24:05 -0700343 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700344
345 // Bind memory to the descriptor set
346 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700347 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700348
349 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
350 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
351 for (int i=0; i<m_memoryViews.size();i++)
352 {
353 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
354 }
355 for (int i=0; i<m_samplers.size();i++)
356 {
357 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, m_samplers[i] );
358 }
359 for (int i=0; i<m_imageViews.size();i++)
360 {
361 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
362 }
363 xglEndDescriptorSetUpdate( m_rsrcDescSet );
364
365 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
366 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
367}
Tony Barbour82c39522014-12-04 14:33:33 -0700368
Tony Barbour25ef8a62014-12-03 13:59:18 -0700369XglDescriptorSetObj::~XglDescriptorSetObj()
370{
371 if (m_rsrcDescSet != XGL_NULL_HANDLE) xglDestroyObject(m_rsrcDescSet);
372}
Tony Barboure2c58df2014-11-25 13:18:32 -0700373
374XglTextureObj::XglTextureObj(XglDevice *device):
375 m_texture(XGL_NULL_HANDLE),
376 m_textureMem(XGL_NULL_HANDLE),
377 m_textureView(XGL_NULL_HANDLE)
378{
379 m_device = device;
380 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
381 m_texWidth = 16;
382 m_texHeight = 16;
383 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
384 XGL_RESULT err;
385 XGL_UINT i;
386
387 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
388
389 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
390
391 const XGL_IMAGE_CREATE_INFO image = {
392 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
393 .pNext = NULL,
394 .imageType = XGL_IMAGE_2D,
395 .format = tex_format,
396 .extent = { m_texWidth, m_texHeight, 1 },
397 .mipLevels = 1,
398 .arraySize = 1,
399 .samples = 1,
400 .tiling = XGL_LINEAR_TILING,
401 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
402 .flags = 0,
403 };
404
405 XGL_MEMORY_ALLOC_INFO mem_alloc;
406 mem_alloc.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
407 mem_alloc.pNext = NULL;
408 mem_alloc.allocationSize = 0;
409 mem_alloc.alignment = 0;
410 mem_alloc.flags = 0;
411 mem_alloc.heapCount = 0;
412 mem_alloc.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
413
414 XGL_IMAGE_VIEW_CREATE_INFO view;
415 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
416 view.pNext = NULL;
417 view.image = XGL_NULL_HANDLE;
418 view.viewType = XGL_IMAGE_VIEW_2D;
419 view.format = image.format;
420 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
421 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
422 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
423 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
424 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
425 view.subresourceRange.baseMipLevel = 0;
426 view.subresourceRange.mipLevels = 1;
427 view.subresourceRange.baseArraySlice = 0;
428 view.subresourceRange.arraySize = 1;
429 view.minLod = 0.0f;
430
431 XGL_MEMORY_REQUIREMENTS mem_reqs;
432 XGL_SIZE mem_reqs_size=sizeof(XGL_MEMORY_REQUIREMENTS);
433
434 /* create image */
435 err = xglCreateImage(m_device->device(), &image, &m_texture);
436 assert(!err);
437
438 err = xglGetObjectInfo(m_texture,
439 XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
440 &mem_reqs_size, &mem_reqs);
441 assert(!err && mem_reqs_size == sizeof(mem_reqs));
442
443 mem_alloc.allocationSize = mem_reqs.size;
444 mem_alloc.alignment = mem_reqs.alignment;
445 mem_alloc.heapCount = mem_reqs.heapCount;
446 memcpy(mem_alloc.heaps, mem_reqs.heaps,
447 sizeof(mem_reqs.heaps[0]) * mem_reqs.heapCount);
448
449 /* allocate memory */
450 err = xglAllocMemory(m_device->device(), &mem_alloc, &m_textureMem);
451 assert(!err);
452
453 /* bind memory */
454 err = xglBindObjectMemory(m_texture, m_textureMem, 0);
455 assert(!err);
456
457 /* create image view */
458 view.image = m_texture;
459 err = xglCreateImageView(m_device->device(), &view, &m_textureView);
460 assert(!err);
461
462
463 const XGL_IMAGE_SUBRESOURCE subres = {
464 .aspect = XGL_IMAGE_ASPECT_COLOR,
465 .mipLevel = 0,
466 .arraySlice = 0,
467 };
468 XGL_SUBRESOURCE_LAYOUT layout;
469 XGL_SIZE layout_size=sizeof(layout);
470 XGL_VOID *data;
471 XGL_INT x, y;
472
473 err = xglGetImageSubresourceInfo(m_texture, &subres,
474 XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &layout_size, &layout);
475 assert(!err && layout_size == sizeof(layout));
476 m_rowPitch = layout.rowPitch;
477
478 err = xglMapMemory(m_textureMem, 0, &data);
479 assert(!err);
480
481 for (y = 0; y < m_texHeight; y++) {
482 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
483 for (x = 0; x < m_texWidth; x++)
484 row[x] = tex_colors[(x & 1) ^ (y & 1)];
485 }
486
487 err = xglUnmapMemory(m_textureMem);
488 assert(!err);
489
490 m_textureViewInfo.view = m_textureView;
491
492}
Tony Barbour82c39522014-12-04 14:33:33 -0700493
Tony Barbourf325bf12014-12-03 15:59:38 -0700494XglTextureObj::~XglTextureObj()
495{
496 if (m_texture != XGL_NULL_HANDLE) xglDestroyObject(m_texture);
497}
Tony Barboure2c58df2014-11-25 13:18:32 -0700498
499void XglTextureObj::ChangeColors(uint32_t color1, uint32_t color2)
500{
501 XGL_RESULT err;
502 const uint32_t tex_colors[2] = { color1, color2 };
503 XGL_VOID *data;
504
505 err = xglMapMemory(m_textureMem, 0, &data);
506 assert(!err);
507
508 for (int y = 0; y < m_texHeight; y++) {
509 uint32_t *row = (uint32_t *) ((char *) data + m_rowPitch * y);
510 for (int x = 0; x < m_texWidth; x++)
511 row[x] = tex_colors[(x & 1) ^ (y & 1)];
512 }
513
514 err = xglUnmapMemory(m_textureMem);
515 assert(!err);
516}
517
518XglSamplerObj::XglSamplerObj(XglDevice *device)
519{
520 XGL_RESULT err = XGL_SUCCESS;
521
522 m_device = device;
523 memset(&m_samplerCreateInfo,0,sizeof(m_samplerCreateInfo));
524 m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
525 m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
526 m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
527 m_samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
528 m_samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
529 m_samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
530 m_samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
531 m_samplerCreateInfo.mipLodBias = 0.0;
532 m_samplerCreateInfo.maxAnisotropy = 0.0;
533 m_samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
534 m_samplerCreateInfo.minLod = 0.0;
535 m_samplerCreateInfo.maxLod = 0.0;
536 m_samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
537
538 err = xglCreateSampler(m_device->device(),&m_samplerCreateInfo, &m_sampler);
Tony Barbourba2a1062014-12-03 09:24:05 -0700539 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700540
541}
Tony Barbour82c39522014-12-04 14:33:33 -0700542
Tony Barbourf325bf12014-12-03 15:59:38 -0700543XglSamplerObj::~XglSamplerObj()
544{
545 if (m_sampler != XGL_NULL_HANDLE) xglDestroyObject(m_sampler);
546}
Tony Barboure2c58df2014-11-25 13:18:32 -0700547
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700548/*
549 * Basic ConstantBuffer constructor. Then use create methods to fill in the details.
550 */
551XglConstantBufferObj::XglConstantBufferObj(XglDevice *device)
552{
553 m_device = device;
554
555 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
556 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
557}
558
Tony Barboure2c58df2014-11-25 13:18:32 -0700559XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
560{
561 XGL_RESULT err = XGL_SUCCESS;
562 XGL_UINT8 *pData;
563 XGL_MEMORY_ALLOC_INFO alloc_info = {};
564 m_device = device;
565 m_numVertices = constantCount;
566 m_stride = constantSize;
567
568 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
569 memset(&m_constantBufferMem,0,sizeof(m_constantBufferMem));
570
571 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
572 alloc_info.allocationSize = constantCount * constantSize;
573 alloc_info.alignment = 0;
574 alloc_info.heapCount = 1;
575 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
576
577 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
578 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
579
580 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700581 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700582
583 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
Tony Barbourba2a1062014-12-03 09:24:05 -0700584 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700585
586 memcpy(pData, data, alloc_info.allocationSize);
587
588 err = xglUnmapMemory(m_constantBufferMem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700589 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700590
591 // set up the memory view for the constant buffer
592 this->m_constantBufferView.stride = 16;
593 this->m_constantBufferView.range = alloc_info.allocationSize;
594 this->m_constantBufferView.offset = 0;
595 this->m_constantBufferView.mem = m_constantBufferMem;
596 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
597 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
598 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
599}
Tony Barbour82c39522014-12-04 14:33:33 -0700600
Tony Barbour07e80dc2014-12-03 16:23:43 -0700601XglConstantBufferObj::~XglConstantBufferObj()
602{
603 if (m_constantBufferMem != XGL_NULL_HANDLE) xglFreeMemory(m_constantBufferMem);
604}
Tony Barboure2c58df2014-11-25 13:18:32 -0700605
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700606void XglConstantBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset, XGL_UINT binding)
607{
608 xglCmdBindVertexData(cmdBuffer, this->m_constantBufferMem, offset, binding);
609}
610
611
Tony Barboure2c58df2014-11-25 13:18:32 -0700612void XglConstantBufferObj::SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState)
613{
614 if (this->m_constantBufferView.state == newState)
615 return;
616
617 // open the command buffer
618 XGL_RESULT err = xglBeginCommandBuffer( cmdBuffer, 0 );
619 ASSERT_XGL_SUCCESS(err);
620
621 XGL_MEMORY_STATE_TRANSITION transition = {};
622 transition.mem = m_constantBufferMem;
623 transition.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
624 transition.newState = newState;
625 transition.offset = 0;
626 transition.regionSize = m_numVertices * m_stride;
627
628 // write transition to the command buffer
629 xglCmdPrepareMemoryRegions( cmdBuffer, 1, &transition );
630 this->m_constantBufferView.state = newState;
631
632 // finish recording the command buffer
633 err = xglEndCommandBuffer( cmdBuffer );
634 ASSERT_XGL_SUCCESS(err);
635
636 XGL_UINT32 numMemRefs=1;
637 XGL_MEMORY_REF memRefs;
638 // this command buffer only uses the vertex buffer memory
639 memRefs.flags = 0;
640 memRefs.mem = m_constantBufferMem;
641
642 // submit the command buffer to the universal queue
643 err = xglQueueSubmit( m_device->m_queue, 1, &cmdBuffer, numMemRefs, &memRefs, NULL );
644 ASSERT_XGL_SUCCESS(err);
645}
646
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700647XglIndexBufferObj::XglIndexBufferObj(XglDevice *device)
648 : XglConstantBufferObj(device)
649{
650
651}
652
653void XglIndexBufferObj::CreateAndInitBuffer(int numIndexes, XGL_INDEX_TYPE indexType, const void* data)
654{
655 XGL_RESULT err = XGL_SUCCESS;
656 XGL_UINT8 *pData;
657 XGL_MEMORY_ALLOC_INFO alloc_info = {};
658 XGL_FORMAT viewFormat;
659
660 m_numVertices = numIndexes;
661 m_indexType = indexType;
662 viewFormat.numericFormat = XGL_NUM_FMT_UINT;
663 switch (indexType) {
664 case XGL_INDEX_8:
665 m_stride = 1;
666 viewFormat.channelFormat = XGL_CH_FMT_R8;
667 break;
668 case XGL_INDEX_16:
669 m_stride = 2;
670 viewFormat.channelFormat = XGL_CH_FMT_R16;
671 break;
672 case XGL_INDEX_32:
673 m_stride = 4;
674 viewFormat.channelFormat = XGL_CH_FMT_R32;
675 break;
676 }
677
678 alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
679 alloc_info.allocationSize = numIndexes * m_stride;
680 alloc_info.alignment = 0;
681 alloc_info.heapCount = 1;
682 alloc_info.heaps[0] = 0; // TODO: Use known existing heap
683
684 alloc_info.flags = XGL_MEMORY_HEAP_CPU_VISIBLE_BIT;
685 alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
686
687 err = xglAllocMemory(m_device->device(), &alloc_info, &m_constantBufferMem);
688 ASSERT_XGL_SUCCESS(err);
689
690 err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
691 ASSERT_XGL_SUCCESS(err);
692
693 memcpy(pData, data, alloc_info.allocationSize);
694
695 err = xglUnmapMemory(m_constantBufferMem);
696 ASSERT_XGL_SUCCESS(err);
697
698 // set up the memory view for the constant buffer
699 this->m_constantBufferView.stride = m_stride;
700 this->m_constantBufferView.range = alloc_info.allocationSize;
701 this->m_constantBufferView.offset = 0;
702 this->m_constantBufferView.mem = m_constantBufferMem;
703 this->m_constantBufferView.format.channelFormat = viewFormat.channelFormat;
704 this->m_constantBufferView.format.numericFormat = viewFormat.numericFormat;
705 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
706}
707
708void XglIndexBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset)
709{
710 xglCmdBindIndexData(cmdBuffer, this->m_constantBufferMem, offset, m_indexType);
711}
Tony Barboure2c58df2014-11-25 13:18:32 -0700712
Tony Barbour5420af02014-12-03 13:58:15 -0700713XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj *descriptorSet)
Tony Barboure2c58df2014-11-25 13:18:32 -0700714{
715 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
716 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
717 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
718 stageInfo->shader.stage = m_stage;
719 stageInfo->shader.shader = m_shader;
720 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
721 stageInfo->shader.linkConstBufferCount = 0;
722 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
723 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
724 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
725
726 stageInfo->shader.descriptorSetMapping[0].descriptorCount = m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size();
727 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
728 {
729 vector<int> allSlots;
730 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
731 vector<XGL_OBJECT> allObjs;
732
733 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
734 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
735 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
736
737 if (m_memSlots.size())
738 {
739 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
740 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
741 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
742 }
743 if (m_imageSlots.size())
744 {
745 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
746 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
747 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
748 }
749 if (m_samplerSlots.size())
750 {
751 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
752 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
753 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
754 }
755
Tony Barbour5420af02014-12-03 13:58:15 -0700756 slotInfo = descriptorSet->GetSlotInfo(allSlots, allTypes, allObjs);
Tony Barboure2c58df2014-11-25 13:18:32 -0700757 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
758 }
759 return stageInfo;
760}
761
762void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
763{
764 m_memSlots.push_back(slot);
765 m_memTypes.push_back(type);
766 m_memObjs.push_back((XGL_OBJECT) &constantBuffer->m_constantBufferView);
767
768}
Tony Barbour82c39522014-12-04 14:33:33 -0700769
Tony Barboure2c58df2014-11-25 13:18:32 -0700770void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
771{
772 m_imageSlots.push_back(slot);
773 m_imageTypes.push_back(type);
774 m_imageObjs.push_back((XGL_OBJECT) &texture->m_textureViewInfo);
775
776}
Tony Barbour82c39522014-12-04 14:33:33 -0700777
Tony Barboure2c58df2014-11-25 13:18:32 -0700778void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
779{
780 m_samplerSlots.push_back(slot);
781 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
782 m_samplerObjs.push_back(sampler->m_sampler);
783
784}
Tony Barbour82c39522014-12-04 14:33:33 -0700785
Tony Barboure2c58df2014-11-25 13:18:32 -0700786XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework)
787{
788 XGL_RESULT err = XGL_SUCCESS;
789 std::vector<unsigned int> bil;
790 XGL_SHADER_CREATE_INFO createInfo;
791 size_t shader_len;
792
793 m_stage = stage;
794 m_device = device;
795
796 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
797 createInfo.pNext = NULL;
798
799 if (!framework->m_use_bil) {
800
801 shader_len = strlen(shader_code);
802 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
803 createInfo.pCode = malloc(createInfo.codeSize);
804 createInfo.flags = 0;
805
806 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
807 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
808 ((uint32_t *) createInfo.pCode)[1] = 0;
809 ((uint32_t *) createInfo.pCode)[2] = stage;
810 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
811
812 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
813 if (err) {
814 free((void *) createInfo.pCode);
815 }
816 }
817
818 if (framework->m_use_bil || err) {
819 std::vector<unsigned int> bil;
820 err = XGL_SUCCESS;
821
822 // Use Reference GLSL to BIL compiler
823 framework->GLSLtoBIL(stage, shader_code, bil);
824 createInfo.pCode = bil.data();
825 createInfo.codeSize = bil.size() * sizeof(unsigned int);
826 createInfo.flags = 0;
827 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
Tony Barbourba2a1062014-12-03 09:24:05 -0700828 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700829 }
830}
Tony Barbour82c39522014-12-04 14:33:33 -0700831
Tony Barbourf325bf12014-12-03 15:59:38 -0700832XglShaderObj::~XglShaderObj()
833{
834 if (m_shader != XGL_NULL_HANDLE) xglDestroyObject(m_shader);
835}
Tony Barbour82c39522014-12-04 14:33:33 -0700836
Tony Barboure2c58df2014-11-25 13:18:32 -0700837XglPipelineObj::XglPipelineObj(XglDevice *device)
838{
839 XGL_RESULT err;
840
841 m_device = device;
842 m_vi_state.attributeCount = m_vi_state.bindingCount = 0;
843 m_vertexBufferCount = 0;
844
845 m_ia_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
846 m_ia_state.pNext = XGL_NULL_HANDLE;
847 m_ia_state.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
848 m_ia_state.disableVertexReuse = XGL_FALSE;
849 m_ia_state.provokingVertex = XGL_PROVOKING_VERTEX_LAST;
850 m_ia_state.primitiveRestartEnable = XGL_FALSE;
851 m_ia_state.primitiveRestartIndex = 0;
852
853 m_rs_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
854 m_rs_state.pNext = &m_ia_state;
855 m_rs_state.depthClipEnable = XGL_FALSE;
856 m_rs_state.rasterizerDiscardEnable = XGL_FALSE;
857 m_rs_state.pointSize = 1.0;
858
Tony Barboure2c58df2014-11-25 13:18:32 -0700859 memset(&m_cb_state,0,sizeof(m_cb_state));
860 m_cb_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
861 m_cb_state.pNext = &m_rs_state;
862 m_cb_state.alphaToCoverageEnable = XGL_FALSE;
863 m_cb_state.dualSourceBlendEnable = XGL_FALSE;
864 m_cb_state.logicOp = XGL_LOGIC_OP_COPY;
865
Chia-I Wu62bf1dc2014-12-05 11:12:13 +0800866 m_cb_state.attachment[0].blendEnable = XGL_FALSE;
867 m_cb_state.attachment[0].format.channelFormat = XGL_CH_FMT_R8G8B8A8;
868 m_cb_state.attachment[0].format.numericFormat = XGL_NUM_FMT_UNORM;
869 m_cb_state.attachment[0].channelWriteMask = 0xF;
Tony Barboure2c58df2014-11-25 13:18:32 -0700870
871 m_db_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
872 m_db_state.pNext = &m_cb_state,
873 m_db_state.format.channelFormat = XGL_CH_FMT_R32;
874 m_db_state.format.numericFormat = XGL_NUM_FMT_DS;
875
876
877};
878
879void XglPipelineObj::AddShader(XglShaderObj* shader)
880{
881 m_shaderObjs.push_back(shader);
882}
883
884void XglPipelineObj::AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count)
885{
886 m_vi_state.pVertexAttributeDescriptions = vi_attrib;
887 m_vi_state.attributeCount = count;
888}
889
890void XglPipelineObj::AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count)
891{
892 m_vi_state.pVertexBindingDescriptions = vi_binding;
893 m_vi_state.bindingCount = count;
894}
895
896void XglPipelineObj::AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding)
897{
898 m_vertexBufferObjs.push_back(vertexDataBuffer);
899 m_vertexBufferBindings.push_back(binding);
900 m_vertexBufferCount++;
901}
902
Chia-I Wuecebf752014-12-05 10:45:15 +0800903void XglPipelineObj::SetColorAttachment(XGL_UINT binding, const XGL_PIPELINE_CB_ATTACHMENT_STATE *att)
904{
905 m_cb_state.attachment[binding] = *att;
906}
907
Tony Barbour5420af02014-12-03 13:58:15 -0700908void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj *descriptorSet)
Tony Barboure2c58df2014-11-25 13:18:32 -0700909{
910 XGL_RESULT err;
911 XGL_VOID* head_ptr = &m_db_state;
912 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
913
914 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
915 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vertexInputAttrib;
916
917 for (int i=0; i<m_shaderObjs.size(); i++)
918 {
919 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
920 shaderCreateInfo->pNext = head_ptr;
921 head_ptr = shaderCreateInfo;
922 }
923
924 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
925 {
926 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
927 m_vi_state.pNext = head_ptr;
928 head_ptr = &m_vi_state;
929 }
930
931 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
932 info.pNext = head_ptr;
933 info.flags = 0;
934
935 err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
Tony Barbourba2a1062014-12-03 09:24:05 -0700936 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700937
938 err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700939 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700940
941 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline );
942
943
944 for (int i=0; i < m_vertexBufferCount; i++)
945 {
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700946 m_vertexBufferObjs[i]->Bind(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700947 }
Tony Barboure2c58df2014-11-25 13:18:32 -0700948}
Tony Barbour82c39522014-12-04 14:33:33 -0700949
Tony Barbourf325bf12014-12-03 15:59:38 -0700950XglPipelineObj::~XglPipelineObj()
951{
952 if (m_pipeline != XGL_NULL_HANDLE) xglDestroyObject(m_pipeline);
953}
Tony Barboure2c58df2014-11-25 13:18:32 -0700954
955XglMemoryRefManager::XglMemoryRefManager() {
956
957}
Tony Barbour82c39522014-12-04 14:33:33 -0700958
Tony Barboure2c58df2014-11-25 13:18:32 -0700959void XglMemoryRefManager::AddMemoryRef(XglConstantBufferObj *constantBuffer) {
960 m_bufferObjs.push_back(&constantBuffer->m_constantBufferMem);
961}
Tony Barbour82c39522014-12-04 14:33:33 -0700962
Tony Barboure2c58df2014-11-25 13:18:32 -0700963void XglMemoryRefManager::AddMemoryRef(XglTextureObj *texture) {
964 m_bufferObjs.push_back(&texture->m_textureMem);
965}
Tony Barbour82c39522014-12-04 14:33:33 -0700966
Tony Barboure2c58df2014-11-25 13:18:32 -0700967XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
968
969 XGL_MEMORY_REF *localRefs;
970 XGL_UINT32 numRefs=m_bufferObjs.size();
971
972 if (numRefs <= 0)
973 return NULL;
974
975 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
976 for (int i=0; i<numRefs; i++)
977 {
978 localRefs[i].flags = 0;
979 localRefs[i].mem = *m_bufferObjs[i];
980 }
981 return localRefs;
982}
983int XglMemoryRefManager::GetNumRefs() {
984 return m_bufferObjs.size();
985}
Tony Barbour6d047bf2014-12-10 14:34:45 -0700986
987XglCommandBufferObj::XglCommandBufferObj(XglDevice *device)
988{
989 XGL_RESULT err;
990
991 memset(&m_cmdInfo,0,sizeof(m_cmdInfo));
992
993 m_device = device;
994 m_cmdInfo.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
995 m_cmdInfo.queueType = XGL_QUEUE_TYPE_GRAPHICS;
996 err = xglCreateCommandBuffer(m_device->device(), &m_cmdInfo, &m_cmdBuffer);
997 assert(!err);
998}
999XGL_CMD_BUFFER XglCommandBufferObj::GetBufferHandle()
1000{
1001 return m_cmdBuffer;
1002}
1003XGL_CMD_BUFFER* XglCommandBufferObj::GetBufferPointer()
1004{
1005 return &m_cmdBuffer;
1006}
1007XglCommandBufferObj::~XglCommandBufferObj()
1008{
1009 if (m_cmdBuffer != XGL_NULL_HANDLE) xglDestroyObject(m_cmdBuffer);
1010}