blob: 91a09110963a00947dc178b321fad4675502e126 [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() :
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060031 m_cmdBuffer( XGL_NULL_HANDLE ),
Chia-I Wu837f9952014-12-15 23:29:34 +080032 m_stateRaster( XGL_NULL_HANDLE ),
33 m_colorBlend( XGL_NULL_HANDLE ),
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -060034 m_stateViewport( XGL_NULL_HANDLE ),
Chia-I Wu837f9952014-12-15 23:29:34 +080035 m_stateDepthStencil( XGL_NULL_HANDLE ),
36 m_stateMsaa( XGL_NULL_HANDLE ),
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -060037 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 m_renderTargetCount = 1;
41
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060042 m_render_target_fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
43 m_render_target_fmt.numericFormat = XGL_NUM_FMT_UNORM;
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -060044
Chia-I Wuecebf752014-12-05 10:45:15 +080045 m_colorBindings[0].view = XGL_NULL_HANDLE;
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -060046 m_depthStencilBinding.view = XGL_NULL_HANDLE;
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060047}
48
49XglRenderFramework::~XglRenderFramework()
50{
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060051
52}
53
54void XglRenderFramework::InitFramework()
55{
56 XGL_RESULT err;
57
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060058 err = xglInitAndEnumerateGpus(&app_info, NULL,
Chia-I Wuaf11d922014-12-28 14:37:25 +080059 XGL_MAX_PHYSICAL_GPUS, &this->gpu_count, objs);
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060060 ASSERT_XGL_SUCCESS(err);
Jon Ashburnbf843b22014-11-26 11:06:49 -070061 ASSERT_GE(this->gpu_count, 1) << "No GPU available";
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060062
63 m_device = new XglDevice(0, objs[0]);
64 m_device->get_device_queue();
65}
66
67void XglRenderFramework::ShutdownFramework()
68{
69 if (m_colorBlend) xglDestroyObject(m_colorBlend);
70 if (m_stateMsaa) xglDestroyObject(m_stateMsaa);
71 if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
72 if (m_stateRaster) xglDestroyObject(m_stateRaster);
73 if (m_cmdBuffer) xglDestroyObject(m_cmdBuffer);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060074
75 if (m_stateViewport) {
76 xglDestroyObject(m_stateViewport);
77 }
78
Chia-I Wuecebf752014-12-05 10:45:15 +080079 for (XGL_UINT i = 0; i < m_renderTargetCount; i++) {
80 if (m_renderTargets[i]) {
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060081 // TODO: XglImage should be able to destroy itself
82// m_renderTarget->
83// xglDestroyObject(*m_renderTarget);
Chia-I Wuecebf752014-12-05 10:45:15 +080084 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060085 }
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060086
87 // reset the driver
Chia-I Wub76e0fa2014-12-28 14:27:28 +080088 delete m_device;
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060089 xglInitAndEnumerateGpus(&this->app_info, XGL_NULL_HANDLE, 0, &gpu_count, XGL_NULL_HANDLE);
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060090}
91
Courtney Goeltzenleuchter53d8d892014-10-08 12:20:26 -060092void XglRenderFramework::InitState()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -060093{
94 XGL_RESULT err;
95
96 m_render_target_fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
97 m_render_target_fmt.numericFormat = XGL_NUM_FMT_UNORM;
98
99 // create a raster state (solid, back-face culling)
100 XGL_RASTER_STATE_CREATE_INFO raster = {};
101 raster.sType = XGL_STRUCTURE_TYPE_RASTER_STATE_CREATE_INFO;
102 raster.fillMode = XGL_FILL_SOLID;
103 raster.cullMode = XGL_CULL_NONE;
104 raster.frontFace = XGL_FRONT_FACE_CCW;
105 err = xglCreateRasterState( device(), &raster, &m_stateRaster );
106 ASSERT_XGL_SUCCESS(err);
107
108 XGL_COLOR_BLEND_STATE_CREATE_INFO blend = {};
109 blend.sType = XGL_STRUCTURE_TYPE_COLOR_BLEND_STATE_CREATE_INFO;
110 err = xglCreateColorBlendState(device(), &blend, &m_colorBlend);
111 ASSERT_XGL_SUCCESS( err );
112
113 XGL_DEPTH_STENCIL_STATE_CREATE_INFO depthStencil = {};
114 depthStencil.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
115 depthStencil.depthTestEnable = XGL_FALSE;
116 depthStencil.depthWriteEnable = XGL_FALSE;
117 depthStencil.depthFunc = XGL_COMPARE_LESS_EQUAL;
118 depthStencil.depthBoundsEnable = XGL_FALSE;
119 depthStencil.minDepth = 0.f;
120 depthStencil.maxDepth = 1.f;
121 depthStencil.back.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
122 depthStencil.back.stencilFailOp = XGL_STENCIL_OP_KEEP;
123 depthStencil.back.stencilPassOp = XGL_STENCIL_OP_KEEP;
124 depthStencil.back.stencilRef = 0x00;
125 depthStencil.back.stencilFunc = XGL_COMPARE_ALWAYS;
126 depthStencil.front = depthStencil.back;
127
128 err = xglCreateDepthStencilState( device(), &depthStencil, &m_stateDepthStencil );
129 ASSERT_XGL_SUCCESS( err );
130
131 XGL_MSAA_STATE_CREATE_INFO msaa = {};
132 msaa.sType = XGL_STRUCTURE_TYPE_MSAA_STATE_CREATE_INFO;
133 msaa.sampleMask = 1;
134 msaa.samples = 1;
135
136 err = xglCreateMsaaState( device(), &msaa, &m_stateMsaa );
137 ASSERT_XGL_SUCCESS( err );
138
139 XGL_CMD_BUFFER_CREATE_INFO cmdInfo = {};
140
141 cmdInfo.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
142 cmdInfo.queueType = XGL_QUEUE_TYPE_GRAPHICS;
143 err = xglCreateCommandBuffer(device(), &cmdInfo, &m_cmdBuffer);
144 ASSERT_XGL_SUCCESS(err) << "xglCreateCommandBuffer failed";
145}
146
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600147void XglRenderFramework::InitViewport(float width, float height)
148{
149 XGL_RESULT err;
150
151 XGL_VIEWPORT_STATE_CREATE_INFO viewport = {};
152 viewport.viewportCount = 1;
153 viewport.scissorEnable = XGL_FALSE;
154 viewport.viewports[0].originX = 0;
155 viewport.viewports[0].originY = 0;
156 viewport.viewports[0].width = 1.f * width;
157 viewport.viewports[0].height = 1.f * height;
158 viewport.viewports[0].minDepth = 0.f;
159 viewport.viewports[0].maxDepth = 1.f;
160
161 err = xglCreateViewportState( device(), &viewport, &m_stateViewport );
162 ASSERT_XGL_SUCCESS( err );
163 m_width = width;
164 m_height = height;
165}
166
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600167void XglRenderFramework::InitViewport()
168{
169 InitViewport(m_width, m_height);
170}
171
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600172void XglRenderFramework::InitRenderTarget()
173{
Chia-I Wuecebf752014-12-05 10:45:15 +0800174 XGL_UINT i;
175
176 for (i = 0; i < m_renderTargetCount; i++) {
177 m_device->CreateImage(m_width, m_height, m_render_target_fmt,
178 XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
179 XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
180 &m_renderTargets[i]);
181 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600182}
183
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600184void XglRenderFramework::GenerateBindRenderTargetCmd()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600185{
Chia-I Wuecebf752014-12-05 10:45:15 +0800186 XGL_UINT i;
187
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600188 // bind render target
Chia-I Wuecebf752014-12-05 10:45:15 +0800189 for (i = 0; i < m_renderTargetCount; i++) {
190 m_colorBindings[i].view = m_renderTargets[i]->targetView();
191 m_colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
192 }
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600193 if (m_depthStencilBinding.view) {
Chia-I Wuecebf752014-12-05 10:45:15 +0800194 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, &m_depthStencilBinding );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600195 } else {
Chia-I Wuecebf752014-12-05 10:45:15 +0800196 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, XGL_NULL_HANDLE );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600197 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600198}
199
Tony Barboure2c58df2014-11-25 13:18:32 -0700200void XglRenderFramework::GenerateBindStateAndPipelineCmds()
201{
202 // set all states
203 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, m_stateRaster );
204 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, m_stateViewport );
205 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
206 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil );
207 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
208}
209
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600210void XglRenderFramework::GenerateClearAndPrepareBufferCmds()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600211{
Chia-I Wuecebf752014-12-05 10:45:15 +0800212 XGL_UINT i;
213
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600214 // whatever we want to do, we do it to the whole buffer
215 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
216 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
217 srRange.baseMipLevel = 0;
218 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
219 srRange.baseArraySlice = 0;
220 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
221
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600222 // clear the back buffer to dark grey
223 XGL_UINT clearColor[4] = {64, 64, 64, 0};
Chia-I Wuecebf752014-12-05 10:45:15 +0800224 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
225 for (i = 0; i < m_renderTargetCount; i++) {
226 transitionToClear.image = m_renderTargets[i]->image();
227 transitionToClear.oldState = m_renderTargets[i]->state();
228 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
229 transitionToClear.subresourceRange = srRange;
230 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
231 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
232
233 xglCmdClearColorImageRaw( m_cmdBuffer, m_renderTargets[i]->image(), clearColor, 1, &srRange );
234 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600235
236 // prepare back buffer for rendering
237 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
Chia-I Wuecebf752014-12-05 10:45:15 +0800238 for (i = 0; i < m_renderTargetCount; i++) {
239 transitionToRender.image = m_renderTargets[i]->image();
240 transitionToRender.oldState = m_renderTargets[i]->state();
241 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
242 transitionToRender.subresourceRange = srRange;
243 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
244 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
245 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600246}
Tony Barbour82c39522014-12-04 14:33:33 -0700247
Tony Barboure2c58df2014-11-25 13:18:32 -0700248XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
249{
250 m_device = device;
251 m_nextSlot = 0;
252
253}
254
255void XglDescriptorSetObj::AttachMemoryView(XglConstantBufferObj *constantBuffer)
256{
257 m_memoryViews.push_back(&constantBuffer->m_constantBufferView);
258 m_memorySlots.push_back(m_nextSlot);
259 m_nextSlot++;
260
261}
Tony Barbour82c39522014-12-04 14:33:33 -0700262
Tony Barboure2c58df2014-11-25 13:18:32 -0700263void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
264{
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800265 m_samplers.push_back(sampler);
Tony Barboure2c58df2014-11-25 13:18:32 -0700266 m_samplerSlots.push_back(m_nextSlot);
267 m_nextSlot++;
268
269}
Tony Barbour82c39522014-12-04 14:33:33 -0700270
Tony Barboure2c58df2014-11-25 13:18:32 -0700271void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
272{
273 m_imageViews.push_back(&texture->m_textureViewInfo);
274 m_imageSlots.push_back(m_nextSlot);
275 m_nextSlot++;
276
277}
Tony Barbour82c39522014-12-04 14:33:33 -0700278
Tony Barboure2c58df2014-11-25 13:18:32 -0700279XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
280 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800281 vector<void *>objs )
Tony Barboure2c58df2014-11-25 13:18:32 -0700282{
283 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
284 m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
285 memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
286
287 for (int i=0; i<nSlots; i++)
288 {
289 m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
290 }
291
292 for (int i=0; i<slots.size(); i++)
293 {
294 for (int j=0; j<m_memorySlots.size(); j++)
295 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800296 if ( m_memoryViews[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700297 {
298 m_slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
299 m_slotInfo[m_memorySlots[j]].slotObjectType = types[i];
300 }
301 }
302 for (int j=0; j<m_imageSlots.size(); j++)
303 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800304 if ( m_imageViews[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700305 {
306 m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
307 m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
308 }
309 }
310 for (int j=0; j<m_samplerSlots.size(); j++)
311 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800312 if ( m_samplers[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700313 {
314 m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
315 m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
316 }
317 }
318 }
319
320 // for (int i=0;i<nSlots;i++)
321 // {
322 // printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
323 // fflush(stdout);
324 // }
325
326 return(m_slotInfo);
327
328}
Tony Barbourb5f4d082014-12-17 10:54:03 -0700329void XglDescriptorSetObj::CreateXGLDescriptorSet()
330{
331 XGL_RESULT err;
332
333 // Create descriptor set for a uniform resource
334 memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
335 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
336 m_descriptorInfo.slots = m_nextSlot;
337
338 // Create a descriptor set with requested number of slots
339 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
340 ASSERT_XGL_SUCCESS(err);
341
342 // Bind memory to the descriptor set
343 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
344 ASSERT_XGL_SUCCESS(err);
345
346 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
347 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
348 for (int i=0; i<m_memoryViews.size();i++)
349 {
350 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
351 }
352 for (int i=0; i<m_samplers.size();i++)
353 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800354 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, &m_samplers[i]->m_sampler );
Tony Barbourb5f4d082014-12-17 10:54:03 -0700355 }
356 for (int i=0; i<m_imageViews.size();i++)
357 {
358 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
359 }
360 xglEndDescriptorSetUpdate( m_rsrcDescSet );
361}
362
363XGL_DESCRIPTOR_SET XglDescriptorSetObj::GetDescriptorSetHandle()
364{
365 return m_rsrcDescSet;
366}
Tony Barboure2c58df2014-11-25 13:18:32 -0700367
Tony Barbour824b7712014-12-18 17:06:21 -0700368int XglDescriptorSetObj::GetTotalSlots()
369{
370 return m_nextSlot;
371}
372
Tony Barboure2c58df2014-11-25 13:18:32 -0700373void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
374{
375 XGL_RESULT err;
376
377 // Create descriptor set for a uniform resource
378 memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
379 m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
380 m_descriptorInfo.slots = m_nextSlot;
381
382 // Create a descriptor set with requested number of slots
383 err = xglCreateDescriptorSet( m_device->device(), &m_descriptorInfo, &m_rsrcDescSet );
Tony Barbourba2a1062014-12-03 09:24:05 -0700384 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700385
386 // Bind memory to the descriptor set
387 err = m_device->AllocAndBindGpuMemory(m_rsrcDescSet, "DescriptorSet", &m_descriptor_set_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700388 ASSERT_XGL_SUCCESS(err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700389
390 xglBeginDescriptorSetUpdate( m_rsrcDescSet );
391 xglClearDescriptorSetSlots(m_rsrcDescSet, 0, m_nextSlot);
392 for (int i=0; i<m_memoryViews.size();i++)
393 {
394 xglAttachMemoryViewDescriptors( m_rsrcDescSet, m_memorySlots[i], 1, m_memoryViews[i] );
395 }
396 for (int i=0; i<m_samplers.size();i++)
397 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800398 xglAttachSamplerDescriptors( m_rsrcDescSet, m_samplerSlots[i], 1, &m_samplers[i]->m_sampler );
Tony Barboure2c58df2014-11-25 13:18:32 -0700399 }
400 for (int i=0; i<m_imageViews.size();i++)
401 {
402 xglAttachImageViewDescriptors( m_rsrcDescSet, m_imageSlots[i], 1, m_imageViews[i] );
403 }
404 xglEndDescriptorSetUpdate( m_rsrcDescSet );
405
406 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
407 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
408}
Tony Barbour82c39522014-12-04 14:33:33 -0700409
Tony Barbour25ef8a62014-12-03 13:59:18 -0700410XglDescriptorSetObj::~XglDescriptorSetObj()
411{
412 if (m_rsrcDescSet != XGL_NULL_HANDLE) xglDestroyObject(m_rsrcDescSet);
413}
Tony Barboure2c58df2014-11-25 13:18:32 -0700414
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800415XglTextureObj::XglTextureObj(XglDevice *device)
Tony Barboure2c58df2014-11-25 13:18:32 -0700416{
417 m_device = device;
418 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
Tony Barboure2c58df2014-11-25 13:18:32 -0700419 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
Tony Barboure2c58df2014-11-25 13:18:32 -0700420
421 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
422
423 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
424
425 const XGL_IMAGE_CREATE_INFO image = {
426 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
427 .pNext = NULL,
428 .imageType = XGL_IMAGE_2D,
429 .format = tex_format,
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800430 .extent = { 16, 16, 1 },
Tony Barboure2c58df2014-11-25 13:18:32 -0700431 .mipLevels = 1,
432 .arraySize = 1,
433 .samples = 1,
434 .tiling = XGL_LINEAR_TILING,
435 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
436 .flags = 0,
437 };
438
Tony Barboure2c58df2014-11-25 13:18:32 -0700439 XGL_IMAGE_VIEW_CREATE_INFO view;
440 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
441 view.pNext = NULL;
442 view.image = XGL_NULL_HANDLE;
443 view.viewType = XGL_IMAGE_VIEW_2D;
444 view.format = image.format;
445 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
446 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
447 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
448 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
449 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
450 view.subresourceRange.baseMipLevel = 0;
451 view.subresourceRange.mipLevels = 1;
452 view.subresourceRange.baseArraySlice = 0;
453 view.subresourceRange.arraySize = 1;
454 view.minLod = 0.0f;
455
Tony Barboure2c58df2014-11-25 13:18:32 -0700456 /* create image */
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800457 init(*m_device, image);
Tony Barboure2c58df2014-11-25 13:18:32 -0700458
459 /* create image view */
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800460 view.image = obj();
461 m_textureView.init(*m_device, view);
Tony Barboure2c58df2014-11-25 13:18:32 -0700462
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800463 XGL_SUBRESOURCE_LAYOUT layout =
464 subresource_layout(subresource(XGL_IMAGE_ASPECT_COLOR, 0, 0));
465 m_rowPitch = layout.rowPitch;
Tony Barboure2c58df2014-11-25 13:18:32 -0700466
Tony Barboure2c58df2014-11-25 13:18:32 -0700467 XGL_VOID *data;
468 XGL_INT x, y;
469
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800470 data = map();
Tony Barboure2c58df2014-11-25 13:18:32 -0700471
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800472 for (y = 0; y < extent().height; y++) {
Tony Barboure2c58df2014-11-25 13:18:32 -0700473 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800474 for (x = 0; x < extent().width; x++)
Tony Barboure2c58df2014-11-25 13:18:32 -0700475 row[x] = tex_colors[(x & 1) ^ (y & 1)];
476 }
477
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800478 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700479
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800480 m_textureViewInfo.view = m_textureView.obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700481
482}
Tony Barbour82c39522014-12-04 14:33:33 -0700483
Tony Barboure2c58df2014-11-25 13:18:32 -0700484void XglTextureObj::ChangeColors(uint32_t color1, uint32_t color2)
485{
Tony Barboure2c58df2014-11-25 13:18:32 -0700486 const uint32_t tex_colors[2] = { color1, color2 };
487 XGL_VOID *data;
488
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800489 data = map();
Tony Barboure2c58df2014-11-25 13:18:32 -0700490
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800491 for (int y = 0; y < extent().height; y++) {
Tony Barboure2c58df2014-11-25 13:18:32 -0700492 uint32_t *row = (uint32_t *) ((char *) data + m_rowPitch * y);
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800493 for (int x = 0; x < extent().width; x++)
Tony Barboure2c58df2014-11-25 13:18:32 -0700494 row[x] = tex_colors[(x & 1) ^ (y & 1)];
495 }
496
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800497 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700498}
499
500XglSamplerObj::XglSamplerObj(XglDevice *device)
501{
502 XGL_RESULT err = XGL_SUCCESS;
503
504 m_device = device;
505 memset(&m_samplerCreateInfo,0,sizeof(m_samplerCreateInfo));
506 m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
507 m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
508 m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
509 m_samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
510 m_samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
511 m_samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
512 m_samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
513 m_samplerCreateInfo.mipLodBias = 0.0;
514 m_samplerCreateInfo.maxAnisotropy = 0.0;
515 m_samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
516 m_samplerCreateInfo.minLod = 0.0;
517 m_samplerCreateInfo.maxLod = 0.0;
518 m_samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
519
520 err = xglCreateSampler(m_device->device(),&m_samplerCreateInfo, &m_sampler);
Tony Barbourba2a1062014-12-03 09:24:05 -0700521 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700522
523}
Tony Barbour82c39522014-12-04 14:33:33 -0700524
Tony Barbourf325bf12014-12-03 15:59:38 -0700525XglSamplerObj::~XglSamplerObj()
526{
527 if (m_sampler != XGL_NULL_HANDLE) xglDestroyObject(m_sampler);
528}
Tony Barboure2c58df2014-11-25 13:18:32 -0700529
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700530/*
531 * Basic ConstantBuffer constructor. Then use create methods to fill in the details.
532 */
533XglConstantBufferObj::XglConstantBufferObj(XglDevice *device)
534{
535 m_device = device;
Tony Barbour38422802014-12-10 14:36:31 -0700536 m_commandBuffer = 0;
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700537
538 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700539}
540
Tony Barboure2c58df2014-11-25 13:18:32 -0700541XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
542{
Tony Barboure2c58df2014-11-25 13:18:32 -0700543 m_device = device;
Chia-I Wua07fee62014-12-28 15:26:08 +0800544 m_commandBuffer = 0;
545
546 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
Tony Barboure2c58df2014-11-25 13:18:32 -0700547 m_numVertices = constantCount;
548 m_stride = constantSize;
549
Chia-I Wua07fee62014-12-28 15:26:08 +0800550 const size_t allocationSize = constantCount * constantSize;
551 init(*m_device, allocationSize);
Tony Barboure2c58df2014-11-25 13:18:32 -0700552
Chia-I Wua07fee62014-12-28 15:26:08 +0800553 void *pData = map();
554 memcpy(pData, data, allocationSize);
555 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700556
557 // set up the memory view for the constant buffer
558 this->m_constantBufferView.stride = 16;
Chia-I Wua07fee62014-12-28 15:26:08 +0800559 this->m_constantBufferView.range = allocationSize;
Tony Barboure2c58df2014-11-25 13:18:32 -0700560 this->m_constantBufferView.offset = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800561 this->m_constantBufferView.mem = obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700562 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
563 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
564 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
565}
Tony Barbour82c39522014-12-04 14:33:33 -0700566
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700567void XglConstantBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset, XGL_UINT binding)
568{
Chia-I Wua07fee62014-12-28 15:26:08 +0800569 xglCmdBindVertexData(cmdBuffer, obj(), offset, binding);
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700570}
571
572
Tony Barbour099a9eb2014-12-10 17:40:15 -0700573void XglConstantBufferObj::SetMemoryState(XGL_MEMORY_STATE newState)
Tony Barboure2c58df2014-11-25 13:18:32 -0700574{
Tony Barbour38422802014-12-10 14:36:31 -0700575 XGL_RESULT err = XGL_SUCCESS;
Tony Barbour38422802014-12-10 14:36:31 -0700576
Tony Barboure2c58df2014-11-25 13:18:32 -0700577 if (this->m_constantBufferView.state == newState)
578 return;
579
Tony Barbour38422802014-12-10 14:36:31 -0700580 if (!m_commandBuffer)
581 {
Chia-I Wua07fee62014-12-28 15:26:08 +0800582 m_fence.init(*m_device, xgl_testing::Fence::create_info(0));
Tony Barbour38422802014-12-10 14:36:31 -0700583
584 m_commandBuffer = new XglCommandBufferObj(m_device);
585
586 }
587 else
588 {
Chia-I Wua07fee62014-12-28 15:26:08 +0800589 m_device->wait(m_fence);
Tony Barbour38422802014-12-10 14:36:31 -0700590 }
591
Tony Barboure2c58df2014-11-25 13:18:32 -0700592 // open the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700593 err = m_commandBuffer->BeginCommandBuffer(0);
Tony Barboure2c58df2014-11-25 13:18:32 -0700594 ASSERT_XGL_SUCCESS(err);
595
Chia-I Wua07fee62014-12-28 15:26:08 +0800596 XGL_MEMORY_STATE_TRANSITION transition =
597 state_transition(XGL_MEMORY_STATE_DATA_TRANSFER, newState, 0, m_numVertices * m_stride);
Tony Barboure2c58df2014-11-25 13:18:32 -0700598
599 // write transition to the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700600 m_commandBuffer->PrepareMemoryRegions(1, &transition);
Tony Barboure2c58df2014-11-25 13:18:32 -0700601 this->m_constantBufferView.state = newState;
602
603 // finish recording the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700604 err = m_commandBuffer->EndCommandBuffer();
Tony Barboure2c58df2014-11-25 13:18:32 -0700605 ASSERT_XGL_SUCCESS(err);
606
607 XGL_UINT32 numMemRefs=1;
608 XGL_MEMORY_REF memRefs;
609 // this command buffer only uses the vertex buffer memory
610 memRefs.flags = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800611 memRefs.mem = obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700612
613 // submit the command buffer to the universal queue
Tony Barbour471338d2014-12-10 17:28:39 -0700614 XGL_CMD_BUFFER bufferArray[1];
615 bufferArray[0] = m_commandBuffer->GetBufferHandle();
Chia-I Wua07fee62014-12-28 15:26:08 +0800616 err = xglQueueSubmit( m_device->m_queue, 1, bufferArray, numMemRefs, &memRefs, m_fence.obj() );
Tony Barboure2c58df2014-11-25 13:18:32 -0700617 ASSERT_XGL_SUCCESS(err);
618}
619
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700620XglIndexBufferObj::XglIndexBufferObj(XglDevice *device)
621 : XglConstantBufferObj(device)
622{
623
624}
625
626void XglIndexBufferObj::CreateAndInitBuffer(int numIndexes, XGL_INDEX_TYPE indexType, const void* data)
627{
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700628 XGL_FORMAT viewFormat;
629
630 m_numVertices = numIndexes;
631 m_indexType = indexType;
632 viewFormat.numericFormat = XGL_NUM_FMT_UINT;
633 switch (indexType) {
634 case XGL_INDEX_8:
635 m_stride = 1;
636 viewFormat.channelFormat = XGL_CH_FMT_R8;
637 break;
638 case XGL_INDEX_16:
639 m_stride = 2;
640 viewFormat.channelFormat = XGL_CH_FMT_R16;
641 break;
642 case XGL_INDEX_32:
643 m_stride = 4;
644 viewFormat.channelFormat = XGL_CH_FMT_R32;
645 break;
Chia-I Wub4c2aa42014-12-15 23:50:11 +0800646 default:
647 assert(!"unknown index type");
648 break;
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700649 }
650
Chia-I Wua07fee62014-12-28 15:26:08 +0800651 const size_t allocationSize = numIndexes * m_stride;
652 init(*m_device, allocationSize);
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700653
Chia-I Wua07fee62014-12-28 15:26:08 +0800654 void *pData = map();
655 memcpy(pData, data, allocationSize);
656 unmap();
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700657
658 // set up the memory view for the constant buffer
659 this->m_constantBufferView.stride = m_stride;
Chia-I Wua07fee62014-12-28 15:26:08 +0800660 this->m_constantBufferView.range = allocationSize;
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700661 this->m_constantBufferView.offset = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800662 this->m_constantBufferView.mem = obj();
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700663 this->m_constantBufferView.format.channelFormat = viewFormat.channelFormat;
664 this->m_constantBufferView.format.numericFormat = viewFormat.numericFormat;
665 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
666}
667
668void XglIndexBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset)
669{
Chia-I Wua07fee62014-12-28 15:26:08 +0800670 xglCmdBindIndexData(cmdBuffer, obj(), offset, m_indexType);
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700671}
Tony Barboure2c58df2014-11-25 13:18:32 -0700672
Tony Barbouraf1f9192014-12-17 10:57:58 -0700673XGL_INDEX_TYPE XglIndexBufferObj::GetIndexType()
674{
675 return m_indexType;
676}
677
Tony Barbour5420af02014-12-03 13:58:15 -0700678XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj *descriptorSet)
Tony Barboure2c58df2014-11-25 13:18:32 -0700679{
680 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
681 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
682 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
683 stageInfo->shader.stage = m_stage;
684 stageInfo->shader.shader = m_shader;
685 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
686 stageInfo->shader.linkConstBufferCount = 0;
687 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
688 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
689 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
690
Tony Barbour824b7712014-12-18 17:06:21 -0700691 stageInfo->shader.descriptorSetMapping[0].descriptorCount = descriptorSet->GetTotalSlots();
Tony Barboure2c58df2014-11-25 13:18:32 -0700692 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
693 {
694 vector<int> allSlots;
695 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800696 vector<void *> allObjs;
Tony Barboure2c58df2014-11-25 13:18:32 -0700697
698 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
699 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
700 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
701
702 if (m_memSlots.size())
703 {
704 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
705 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
706 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
707 }
708 if (m_imageSlots.size())
709 {
710 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
711 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
712 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
713 }
714 if (m_samplerSlots.size())
715 {
716 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
717 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
718 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
719 }
720
Tony Barbour5420af02014-12-03 13:58:15 -0700721 slotInfo = descriptorSet->GetSlotInfo(allSlots, allTypes, allObjs);
Tony Barboure2c58df2014-11-25 13:18:32 -0700722 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
723 }
724 return stageInfo;
725}
726
727void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
728{
729 m_memSlots.push_back(slot);
730 m_memTypes.push_back(type);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800731 m_memObjs.push_back(&constantBuffer->m_constantBufferView);
Tony Barboure2c58df2014-11-25 13:18:32 -0700732
733}
Tony Barbour82c39522014-12-04 14:33:33 -0700734
Tony Barboure2c58df2014-11-25 13:18:32 -0700735void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
736{
737 m_imageSlots.push_back(slot);
738 m_imageTypes.push_back(type);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800739 m_imageObjs.push_back(&texture->m_textureViewInfo);
Tony Barboure2c58df2014-11-25 13:18:32 -0700740
741}
Tony Barbour82c39522014-12-04 14:33:33 -0700742
Tony Barboure2c58df2014-11-25 13:18:32 -0700743void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
744{
745 m_samplerSlots.push_back(slot);
746 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800747 m_samplerObjs.push_back(sampler);
Tony Barboure2c58df2014-11-25 13:18:32 -0700748
749}
Tony Barbour82c39522014-12-04 14:33:33 -0700750
Tony Barboure2c58df2014-11-25 13:18:32 -0700751XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework)
752{
753 XGL_RESULT err = XGL_SUCCESS;
754 std::vector<unsigned int> bil;
755 XGL_SHADER_CREATE_INFO createInfo;
756 size_t shader_len;
757
758 m_stage = stage;
759 m_device = device;
760
761 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
762 createInfo.pNext = NULL;
763
764 if (!framework->m_use_bil) {
765
766 shader_len = strlen(shader_code);
767 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
768 createInfo.pCode = malloc(createInfo.codeSize);
769 createInfo.flags = 0;
770
771 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
772 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
773 ((uint32_t *) createInfo.pCode)[1] = 0;
774 ((uint32_t *) createInfo.pCode)[2] = stage;
775 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
776
777 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
778 if (err) {
779 free((void *) createInfo.pCode);
780 }
781 }
782
783 if (framework->m_use_bil || err) {
784 std::vector<unsigned int> bil;
785 err = XGL_SUCCESS;
786
787 // Use Reference GLSL to BIL compiler
788 framework->GLSLtoBIL(stage, shader_code, bil);
789 createInfo.pCode = bil.data();
790 createInfo.codeSize = bil.size() * sizeof(unsigned int);
791 createInfo.flags = 0;
792 err = xglCreateShader(m_device->device(), &createInfo, &m_shader);
Tony Barbourba2a1062014-12-03 09:24:05 -0700793 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700794 }
795}
Tony Barbour82c39522014-12-04 14:33:33 -0700796
Tony Barbourf325bf12014-12-03 15:59:38 -0700797XglShaderObj::~XglShaderObj()
798{
799 if (m_shader != XGL_NULL_HANDLE) xglDestroyObject(m_shader);
800}
Tony Barbour82c39522014-12-04 14:33:33 -0700801
Tony Barboure2c58df2014-11-25 13:18:32 -0700802XglPipelineObj::XglPipelineObj(XglDevice *device)
803{
Tony Barboure2c58df2014-11-25 13:18:32 -0700804 m_device = device;
805 m_vi_state.attributeCount = m_vi_state.bindingCount = 0;
806 m_vertexBufferCount = 0;
807
808 m_ia_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
809 m_ia_state.pNext = XGL_NULL_HANDLE;
810 m_ia_state.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
811 m_ia_state.disableVertexReuse = XGL_FALSE;
812 m_ia_state.provokingVertex = XGL_PROVOKING_VERTEX_LAST;
813 m_ia_state.primitiveRestartEnable = XGL_FALSE;
814 m_ia_state.primitiveRestartIndex = 0;
815
816 m_rs_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
817 m_rs_state.pNext = &m_ia_state;
818 m_rs_state.depthClipEnable = XGL_FALSE;
819 m_rs_state.rasterizerDiscardEnable = XGL_FALSE;
820 m_rs_state.pointSize = 1.0;
821
Tony Barboure2c58df2014-11-25 13:18:32 -0700822 memset(&m_cb_state,0,sizeof(m_cb_state));
823 m_cb_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
824 m_cb_state.pNext = &m_rs_state;
825 m_cb_state.alphaToCoverageEnable = XGL_FALSE;
826 m_cb_state.dualSourceBlendEnable = XGL_FALSE;
827 m_cb_state.logicOp = XGL_LOGIC_OP_COPY;
828
Chia-I Wu62bf1dc2014-12-05 11:12:13 +0800829 m_cb_state.attachment[0].blendEnable = XGL_FALSE;
830 m_cb_state.attachment[0].format.channelFormat = XGL_CH_FMT_R8G8B8A8;
831 m_cb_state.attachment[0].format.numericFormat = XGL_NUM_FMT_UNORM;
832 m_cb_state.attachment[0].channelWriteMask = 0xF;
Tony Barboure2c58df2014-11-25 13:18:32 -0700833
834 m_db_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
835 m_db_state.pNext = &m_cb_state,
836 m_db_state.format.channelFormat = XGL_CH_FMT_R32;
837 m_db_state.format.numericFormat = XGL_NUM_FMT_DS;
838
839
840};
841
842void XglPipelineObj::AddShader(XglShaderObj* shader)
843{
844 m_shaderObjs.push_back(shader);
845}
846
847void XglPipelineObj::AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count)
848{
849 m_vi_state.pVertexAttributeDescriptions = vi_attrib;
850 m_vi_state.attributeCount = count;
851}
852
853void XglPipelineObj::AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count)
854{
855 m_vi_state.pVertexBindingDescriptions = vi_binding;
856 m_vi_state.bindingCount = count;
857}
858
859void XglPipelineObj::AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding)
860{
861 m_vertexBufferObjs.push_back(vertexDataBuffer);
862 m_vertexBufferBindings.push_back(binding);
863 m_vertexBufferCount++;
864}
865
Chia-I Wuecebf752014-12-05 10:45:15 +0800866void XglPipelineObj::SetColorAttachment(XGL_UINT binding, const XGL_PIPELINE_CB_ATTACHMENT_STATE *att)
867{
868 m_cb_state.attachment[binding] = *att;
869}
870
Tony Barbour976e1cf2014-12-17 11:57:31 -0700871void XglPipelineObj::CreateXGLPipeline(XglDescriptorSetObj *descriptorSet)
872{
873 XGL_RESULT err;
874 XGL_VOID* head_ptr = &m_db_state;
875 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
876
877 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
878
879 for (int i=0; i<m_shaderObjs.size(); i++)
880 {
881 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
882 shaderCreateInfo->pNext = head_ptr;
883 head_ptr = shaderCreateInfo;
884 }
885
886 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
887 {
888 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
889 m_vi_state.pNext = head_ptr;
890 head_ptr = &m_vi_state;
891 }
892
893 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
894 info.pNext = head_ptr;
895 info.flags = 0;
896
897 err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
898 assert(!err);
899
900 err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
901 assert(!err);
902}
903XGL_PIPELINE XglPipelineObj::GetPipelineHandle()
904{
905 return m_pipeline;
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;
Tony Barboure2c58df2014-11-25 13:18:32 -0700915
916 for (int i=0; i<m_shaderObjs.size(); i++)
917 {
918 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
919 shaderCreateInfo->pNext = head_ptr;
920 head_ptr = shaderCreateInfo;
921 }
922
923 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
924 {
925 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
926 m_vi_state.pNext = head_ptr;
927 head_ptr = &m_vi_state;
928 }
929
930 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
931 info.pNext = head_ptr;
932 info.flags = 0;
933
934 err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
Tony Barbourba2a1062014-12-03 09:24:05 -0700935 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700936
937 err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
Tony Barbourba2a1062014-12-03 09:24:05 -0700938 assert(!err);
Tony Barboure2c58df2014-11-25 13:18:32 -0700939
940 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline );
941
942
943 for (int i=0; i < m_vertexBufferCount; i++)
944 {
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700945 m_vertexBufferObjs[i]->Bind(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700946 }
Tony Barboure2c58df2014-11-25 13:18:32 -0700947}
Tony Barbour82c39522014-12-04 14:33:33 -0700948
Tony Barbourf325bf12014-12-03 15:59:38 -0700949XglPipelineObj::~XglPipelineObj()
950{
951 if (m_pipeline != XGL_NULL_HANDLE) xglDestroyObject(m_pipeline);
952}
Tony Barboure2c58df2014-11-25 13:18:32 -0700953
954XglMemoryRefManager::XglMemoryRefManager() {
955
956}
Tony Barbour82c39522014-12-04 14:33:33 -0700957
Tony Barboure2c58df2014-11-25 13:18:32 -0700958void XglMemoryRefManager::AddMemoryRef(XglConstantBufferObj *constantBuffer) {
Chia-I Wua07fee62014-12-28 15:26:08 +0800959 m_bufferObjs.push_back(constantBuffer->obj());
Tony Barboure2c58df2014-11-25 13:18:32 -0700960}
Tony Barbour82c39522014-12-04 14:33:33 -0700961
Tony Barboure2c58df2014-11-25 13:18:32 -0700962void XglMemoryRefManager::AddMemoryRef(XglTextureObj *texture) {
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800963 const std::vector<XGL_GPU_MEMORY> mems = texture->memories();
964 if (!mems.empty())
965 m_bufferObjs.push_back(mems[0]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700966}
Tony Barbour82c39522014-12-04 14:33:33 -0700967
Tony Barboure2c58df2014-11-25 13:18:32 -0700968XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
969
970 XGL_MEMORY_REF *localRefs;
971 XGL_UINT32 numRefs=m_bufferObjs.size();
972
973 if (numRefs <= 0)
974 return NULL;
975
976 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
977 for (int i=0; i<numRefs; i++)
978 {
979 localRefs[i].flags = 0;
Chia-I Wu283d7a62014-12-28 15:43:42 +0800980 localRefs[i].mem = m_bufferObjs[i];
Tony Barboure2c58df2014-11-25 13:18:32 -0700981 }
982 return localRefs;
983}
984int XglMemoryRefManager::GetNumRefs() {
985 return m_bufferObjs.size();
986}
Tony Barbour6d047bf2014-12-10 14:34:45 -0700987
988XglCommandBufferObj::XglCommandBufferObj(XglDevice *device)
Chia-I Wud28343c2014-12-28 15:12:48 +0800989 : xgl_testing::CmdBuffer(*device, xgl_testing::CmdBuffer::create_info(XGL_QUEUE_TYPE_GRAPHICS))
Tony Barbour6d047bf2014-12-10 14:34:45 -0700990{
Tony Barbour6d047bf2014-12-10 14:34:45 -0700991 m_device = device;
Chia-I Wud28343c2014-12-28 15:12:48 +0800992 m_renderTargetCount = 0;
Tony Barbour6d047bf2014-12-10 14:34:45 -0700993}
Tony Barbour471338d2014-12-10 17:28:39 -0700994
Tony Barbour6d047bf2014-12-10 14:34:45 -0700995XGL_CMD_BUFFER XglCommandBufferObj::GetBufferHandle()
996{
Chia-I Wud28343c2014-12-28 15:12:48 +0800997 return obj();
Tony Barbour6d047bf2014-12-10 14:34:45 -0700998}
Tony Barbour471338d2014-12-10 17:28:39 -0700999
1000XGL_RESULT XglCommandBufferObj::BeginCommandBuffer(XGL_FLAGS flags)
1001{
Chia-I Wud28343c2014-12-28 15:12:48 +08001002 begin(flags);
1003 return XGL_SUCCESS;
Tony Barbour471338d2014-12-10 17:28:39 -07001004}
1005
1006XGL_RESULT XglCommandBufferObj::EndCommandBuffer()
1007{
Chia-I Wud28343c2014-12-28 15:12:48 +08001008 end();
1009 return XGL_SUCCESS;
Tony Barbour471338d2014-12-10 17:28:39 -07001010}
1011
1012void XglCommandBufferObj::PrepareMemoryRegions(int transitionCount, XGL_MEMORY_STATE_TRANSITION *transitionPtr)
1013{
Chia-I Wud28343c2014-12-28 15:12:48 +08001014 xglCmdPrepareMemoryRegions(obj(), transitionCount, transitionPtr);
Tony Barbour471338d2014-12-10 17:28:39 -07001015}
1016
Tony Barbour30cc9e82014-12-17 11:53:55 -07001017void XglCommandBufferObj::ClearAllBuffers(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding, XGL_IMAGE depthStencilImage)
1018{
1019 XGL_UINT i;
1020
1021 // whatever we want to do, we do it to the whole buffer
1022 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
1023 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
1024 srRange.baseMipLevel = 0;
1025 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1026 srRange.baseArraySlice = 0;
1027 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1028
1029 // clear the back buffer to dark grey
1030 XGL_UINT clearColor[4] = {64, 64, 64, 0};
1031 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
1032 for (i = 0; i < m_renderTargetCount; i++) {
1033 transitionToClear.image = m_renderTargets[i]->image();
1034 transitionToClear.oldState = m_renderTargets[i]->state();
1035 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
1036 transitionToClear.subresourceRange = srRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001037 xglCmdPrepareImages( obj(), 1, &transitionToClear );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001038 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
1039
Chia-I Wud28343c2014-12-28 15:12:48 +08001040 xglCmdClearColorImageRaw( obj(), m_renderTargets[i]->image(), clearColor, 1, &srRange );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001041 }
1042
1043 if (depthStencilImage)
1044 {
1045 XGL_IMAGE_SUBRESOURCE_RANGE dsRange = {};
1046 dsRange.aspect = XGL_IMAGE_ASPECT_DEPTH;
1047 dsRange.baseMipLevel = 0;
1048 dsRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1049 dsRange.baseArraySlice = 0;
1050 dsRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1051
1052 // prepare the depth buffer for clear
1053 memset(&transitionToClear,0,sizeof(transitionToClear));
1054 transitionToClear.image = depthStencilImage;
1055 transitionToClear.oldState = depthStencilBinding->depthState;
1056 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
1057 transitionToClear.subresourceRange = dsRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001058 xglCmdPrepareImages( obj(), 1, &transitionToClear );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001059 depthStencilBinding->depthState = transitionToClear.newState;
1060
Chia-I Wud28343c2014-12-28 15:12:48 +08001061 xglCmdClearDepthStencil(obj(), depthStencilImage, 1.0f, 0, 1, &dsRange);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001062
1063 // prepare depth buffer for rendering
1064 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
1065 transitionToRender.image = depthStencilImage;
1066 transitionToRender.oldState = XGL_IMAGE_STATE_CLEAR;
1067 transitionToRender.newState = depthStencilBinding->depthState;
1068 transitionToRender.subresourceRange = dsRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001069 xglCmdPrepareImages( obj(), 1, &transitionToRender );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001070 depthStencilBinding->depthState = transitionToClear.newState;
1071 }
1072}
1073
1074void XglCommandBufferObj::BindAttachments(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding)
1075{
1076 XGL_UINT i;
1077 XGL_COLOR_ATTACHMENT_BIND_INFO colorBindings[XGL_MAX_COLOR_ATTACHMENTS];
1078 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
1079 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
1080 srRange.baseMipLevel = 0;
1081 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1082 srRange.baseArraySlice = 0;
1083 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1084
1085 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
1086 for(i=0; i<m_renderTargetCount; i++)
1087 {
1088 transitionToRender.image = m_renderTargets[i]->image();
1089 transitionToRender.oldState = m_renderTargets[i]->state();
1090 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1091 transitionToRender.subresourceRange = srRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001092 xglCmdPrepareImages(obj(), 1, &transitionToRender );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001093 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToRender.newState);
1094 }
1095 for (i = 0; i < m_renderTargetCount; i++) {
1096 colorBindings[i].view = m_renderTargets[i]->targetView();
1097 colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1098 }
1099 if (depthStencilBinding) {
Chia-I Wud28343c2014-12-28 15:12:48 +08001100 xglCmdBindAttachments(obj(), m_renderTargetCount, colorBindings, depthStencilBinding );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001101 } else {
Chia-I Wud28343c2014-12-28 15:12:48 +08001102 xglCmdBindAttachments(obj(), m_renderTargetCount, colorBindings, XGL_NULL_HANDLE );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001103 }
1104}
1105
1106void XglCommandBufferObj::BindState(XGL_RASTER_STATE_OBJECT stateRaster, XGL_VIEWPORT_STATE_OBJECT stateViewport,
1107 XGL_COLOR_BLEND_STATE_OBJECT colorBlend, XGL_DEPTH_STENCIL_STATE_OBJECT stateDepthStencil,
1108 XGL_MSAA_STATE_OBJECT stateMsaa)
1109{
1110 // set all states
Chia-I Wud28343c2014-12-28 15:12:48 +08001111 xglCmdBindStateObject( obj(), XGL_STATE_BIND_RASTER, stateRaster );
1112 xglCmdBindStateObject( obj(), XGL_STATE_BIND_VIEWPORT, stateViewport );
1113 xglCmdBindStateObject( obj(), XGL_STATE_BIND_COLOR_BLEND, colorBlend);
1114 xglCmdBindStateObject( obj(), XGL_STATE_BIND_DEPTH_STENCIL, stateDepthStencil );
1115 xglCmdBindStateObject( obj(), XGL_STATE_BIND_MSAA, stateMsaa );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001116}
1117
1118void XglCommandBufferObj::AddRenderTarget(XglImage *renderTarget)
1119{
1120 m_renderTargets.push_back(renderTarget);
1121 m_renderTargetCount++;
1122}
1123
1124void XglCommandBufferObj::DrawIndexed(XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount)
1125{
Chia-I Wud28343c2014-12-28 15:12:48 +08001126 xglCmdDrawIndexed(obj(), firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001127}
1128
1129void XglCommandBufferObj::Draw(XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
1130{
Chia-I Wud28343c2014-12-28 15:12:48 +08001131 xglCmdDraw(obj(), firstVertex, vertexCount, firstInstance, instanceCount);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001132}
1133
1134void XglCommandBufferObj::QueueCommandBuffer(XGL_MEMORY_REF *memRefs, XGL_UINT32 numMemRefs)
1135{
1136 XGL_RESULT err = XGL_SUCCESS;
1137
1138 // submit the command buffer to the universal queue
Chia-I Wud28343c2014-12-28 15:12:48 +08001139 err = xglQueueSubmit( m_device->m_queue, 1, &obj(), numMemRefs, memRefs, NULL );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001140 ASSERT_XGL_SUCCESS( err );
1141
1142 err = xglQueueWaitIdle( m_device->m_queue );
1143 ASSERT_XGL_SUCCESS( err );
1144
1145 // Wait for work to finish before cleaning up.
1146 xglDeviceWaitIdle(m_device->device());
1147
1148}
1149void XglCommandBufferObj::BindPipeline(XGL_PIPELINE pipeline)
1150{
Chia-I Wud28343c2014-12-28 15:12:48 +08001151 xglCmdBindPipeline( obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, pipeline );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001152}
1153
1154void XglCommandBufferObj::BindDescriptorSet(XGL_DESCRIPTOR_SET descriptorSet)
1155{
1156 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
Chia-I Wud28343c2014-12-28 15:12:48 +08001157 xglCmdBindDescriptorSet(obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, descriptorSet, 0 );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001158}
1159void XglCommandBufferObj::BindIndexBuffer(XglIndexBufferObj *indexBuffer, XGL_UINT offset)
1160{
Chia-I Wua07fee62014-12-28 15:26:08 +08001161 xglCmdBindIndexData(obj(), indexBuffer->obj(), offset, indexBuffer->GetIndexType());
Tony Barbour30cc9e82014-12-17 11:53:55 -07001162}
1163void XglCommandBufferObj::BindVertexBuffer(XglConstantBufferObj *vertexBuffer, XGL_UINT offset, XGL_UINT binding)
1164{
Chia-I Wua07fee62014-12-28 15:26:08 +08001165 xglCmdBindVertexData(obj(), vertexBuffer->obj(), offset, binding);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001166}