blob: ab8d1d2d6f600ac8de72feeddd8c235816d010e7 [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++) {
Chia-I Wuf50ee212014-12-29 14:31:52 +0800177 XglImage *img = new XglImage(m_device);
178 img->init(m_width, m_height, m_render_target_fmt,
179 XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
180 XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
181 m_renderTargets[i] = img;
Chia-I Wuecebf752014-12-05 10:45:15 +0800182 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600183}
184
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600185void XglRenderFramework::GenerateBindRenderTargetCmd()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600186{
Chia-I Wuecebf752014-12-05 10:45:15 +0800187 XGL_UINT i;
188
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600189 // bind render target
Chia-I Wuecebf752014-12-05 10:45:15 +0800190 for (i = 0; i < m_renderTargetCount; i++) {
191 m_colorBindings[i].view = m_renderTargets[i]->targetView();
192 m_colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
193 }
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600194 if (m_depthStencilBinding.view) {
Chia-I Wuecebf752014-12-05 10:45:15 +0800195 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, &m_depthStencilBinding );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600196 } else {
Chia-I Wuecebf752014-12-05 10:45:15 +0800197 xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, m_colorBindings, XGL_NULL_HANDLE );
Courtney Goeltzenleuchter32e486c2014-10-22 14:12:38 -0600198 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600199}
200
Tony Barboure2c58df2014-11-25 13:18:32 -0700201void XglRenderFramework::GenerateBindStateAndPipelineCmds()
202{
203 // set all states
204 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, m_stateRaster );
205 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, m_stateViewport );
206 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
207 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil );
208 xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
209}
210
Courtney Goeltzenleuchter02d33c12014-10-08 14:26:40 -0600211void XglRenderFramework::GenerateClearAndPrepareBufferCmds()
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600212{
Chia-I Wuecebf752014-12-05 10:45:15 +0800213 XGL_UINT i;
214
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600215 // whatever we want to do, we do it to the whole buffer
216 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
217 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
218 srRange.baseMipLevel = 0;
219 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
220 srRange.baseArraySlice = 0;
221 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
222
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600223 // clear the back buffer to dark grey
224 XGL_UINT clearColor[4] = {64, 64, 64, 0};
Chia-I Wuecebf752014-12-05 10:45:15 +0800225 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
226 for (i = 0; i < m_renderTargetCount; i++) {
227 transitionToClear.image = m_renderTargets[i]->image();
228 transitionToClear.oldState = m_renderTargets[i]->state();
229 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
230 transitionToClear.subresourceRange = srRange;
231 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
232 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
233
234 xglCmdClearColorImageRaw( m_cmdBuffer, m_renderTargets[i]->image(), clearColor, 1, &srRange );
235 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600236
237 // prepare back buffer for rendering
238 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
Chia-I Wuecebf752014-12-05 10:45:15 +0800239 for (i = 0; i < m_renderTargetCount; i++) {
240 transitionToRender.image = m_renderTargets[i]->image();
241 transitionToRender.oldState = m_renderTargets[i]->state();
242 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
243 transitionToRender.subresourceRange = srRange;
244 xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
245 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
246 }
Courtney Goeltzenleuchtera4b278b2014-10-08 08:50:49 -0600247}
Tony Barbour82c39522014-12-04 14:33:33 -0700248
Chia-I Wufb1459b2014-12-29 15:23:20 +0800249XglDevice::XglDevice(XGL_UINT id, XGL_PHYSICAL_GPU obj) :
250 xgl_testing::Device(obj), id(id)
251{
252 init();
253
254 props = gpu().properties();
255 queue_props = &gpu().queue_properties()[0];
256}
257
258void XglDevice::get_device_queue()
259{
260 ASSERT_NE(true, graphics_queues().empty());
261 m_queue = graphics_queues()[0]->obj();
262}
263
Tony Barboure2c58df2014-11-25 13:18:32 -0700264XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
265{
266 m_device = device;
267 m_nextSlot = 0;
268
269}
270
271void XglDescriptorSetObj::AttachMemoryView(XglConstantBufferObj *constantBuffer)
272{
273 m_memoryViews.push_back(&constantBuffer->m_constantBufferView);
274 m_memorySlots.push_back(m_nextSlot);
275 m_nextSlot++;
276
277}
Tony Barbour82c39522014-12-04 14:33:33 -0700278
Tony Barboure2c58df2014-11-25 13:18:32 -0700279void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
280{
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800281 m_samplers.push_back(sampler);
Tony Barboure2c58df2014-11-25 13:18:32 -0700282 m_samplerSlots.push_back(m_nextSlot);
283 m_nextSlot++;
284
285}
Tony Barbour82c39522014-12-04 14:33:33 -0700286
Tony Barboure2c58df2014-11-25 13:18:32 -0700287void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
288{
289 m_imageViews.push_back(&texture->m_textureViewInfo);
290 m_imageSlots.push_back(m_nextSlot);
291 m_nextSlot++;
292
293}
Tony Barbour82c39522014-12-04 14:33:33 -0700294
Tony Barboure2c58df2014-11-25 13:18:32 -0700295XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
296 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800297 vector<void *>objs )
Tony Barboure2c58df2014-11-25 13:18:32 -0700298{
299 int nSlots = m_memorySlots.size() + m_imageSlots.size() + m_samplerSlots.size();
300 m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
301 memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
302
303 for (int i=0; i<nSlots; i++)
304 {
305 m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
306 }
307
308 for (int i=0; i<slots.size(); i++)
309 {
310 for (int j=0; j<m_memorySlots.size(); j++)
311 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800312 if ( m_memoryViews[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700313 {
314 m_slotInfo[m_memorySlots[j]].shaderEntityIndex = slots[i];
315 m_slotInfo[m_memorySlots[j]].slotObjectType = types[i];
316 }
317 }
318 for (int j=0; j<m_imageSlots.size(); j++)
319 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800320 if ( m_imageViews[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700321 {
322 m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
323 m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
324 }
325 }
326 for (int j=0; j<m_samplerSlots.size(); j++)
327 {
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800328 if ( m_samplers[j] == objs[i])
Tony Barboure2c58df2014-11-25 13:18:32 -0700329 {
330 m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
331 m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
332 }
333 }
334 }
335
336 // for (int i=0;i<nSlots;i++)
337 // {
338 // printf("SlotInfo[%d]: Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
339 // fflush(stdout);
340 // }
341
342 return(m_slotInfo);
343
344}
Tony Barbourb5f4d082014-12-17 10:54:03 -0700345void XglDescriptorSetObj::CreateXGLDescriptorSet()
346{
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800347 init(*m_device, xgl_testing::DescriptorSet::create_info(m_nextSlot));
Tony Barbourb5f4d082014-12-17 10:54:03 -0700348
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800349 begin();
350 clear();
Tony Barbourb5f4d082014-12-17 10:54:03 -0700351
Tony Barbourb5f4d082014-12-17 10:54:03 -0700352 for (int i=0; i<m_memoryViews.size();i++)
353 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800354 attach(m_memorySlots[i], *m_memoryViews[i]);
Tony Barbourb5f4d082014-12-17 10:54:03 -0700355 }
356 for (int i=0; i<m_samplers.size();i++)
357 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800358 attach(m_samplerSlots[i], *m_samplers[i]);
Tony Barbourb5f4d082014-12-17 10:54:03 -0700359 }
360 for (int i=0; i<m_imageViews.size();i++)
361 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800362 attach(m_imageSlots[i], *m_imageViews[i]);
Tony Barbourb5f4d082014-12-17 10:54:03 -0700363 }
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800364
365 end();
Tony Barbourb5f4d082014-12-17 10:54:03 -0700366}
367
368XGL_DESCRIPTOR_SET XglDescriptorSetObj::GetDescriptorSetHandle()
369{
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800370 return obj();
Tony Barbourb5f4d082014-12-17 10:54:03 -0700371}
Tony Barboure2c58df2014-11-25 13:18:32 -0700372
Tony Barbour824b7712014-12-18 17:06:21 -0700373int XglDescriptorSetObj::GetTotalSlots()
374{
375 return m_nextSlot;
376}
377
Tony Barboure2c58df2014-11-25 13:18:32 -0700378void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
379{
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800380 init(*m_device, xgl_testing::DescriptorSet::create_info(m_nextSlot));
Tony Barboure2c58df2014-11-25 13:18:32 -0700381
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800382 begin();
383 clear();
Tony Barboure2c58df2014-11-25 13:18:32 -0700384
Tony Barboure2c58df2014-11-25 13:18:32 -0700385 for (int i=0; i<m_memoryViews.size();i++)
386 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800387 attach(m_memorySlots[i], *m_memoryViews[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700388 }
389 for (int i=0; i<m_samplers.size();i++)
390 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800391 attach(m_samplerSlots[i], *m_samplers[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700392 }
393 for (int i=0; i<m_imageViews.size();i++)
394 {
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800395 attach(m_imageSlots[i], *m_imageViews[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700396 }
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800397
398 end();
Tony Barboure2c58df2014-11-25 13:18:32 -0700399
400 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
Chia-I Wuac0f1e72014-12-28 22:32:36 +0800401 xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, obj(), 0 );
Tony Barbour25ef8a62014-12-03 13:59:18 -0700402}
Tony Barboure2c58df2014-11-25 13:18:32 -0700403
Chia-I Wua6bc0ce2014-12-29 14:38:28 +0800404XglImage::XglImage(XglDevice *dev)
405{
406 m_device = dev;
407 m_imageInfo.view = XGL_NULL_HANDLE;
408 m_imageInfo.state = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
409}
410
411void XglImage::init(XGL_UINT32 w, XGL_UINT32 h,
412 XGL_FORMAT fmt, XGL_FLAGS usage,
413 XGL_IMAGE_TILING tiling)
414{
415 XGL_UINT mipCount;
416
417 mipCount = 0;
418
419 XGL_UINT _w = w;
420 XGL_UINT _h = h;
421 while( ( _w > 0 ) || ( _h > 0 ) )
422 {
423 _w >>= 1;
424 _h >>= 1;
425 mipCount++;
426 }
427
428 XGL_IMAGE_CREATE_INFO imageCreateInfo = xgl_testing::Image::create_info();
429 imageCreateInfo.imageType = XGL_IMAGE_2D;
430 imageCreateInfo.format = fmt;
431 imageCreateInfo.extent.width = w;
432 imageCreateInfo.extent.height = h;
433 imageCreateInfo.mipLevels = mipCount;
434 imageCreateInfo.tiling = tiling;
435
436 imageCreateInfo.usage = usage;
437
438 xgl_testing::Image::init(*m_device, imageCreateInfo);
439
440 m_imageInfo.state = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
441
442 XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO createView = {
443 XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
444 XGL_NULL_HANDLE,
445 obj(),
446 {XGL_CH_FMT_R8G8B8A8, XGL_NUM_FMT_UNORM},
447 0,
448 0,
449 1
450 };
451
452 m_targetView.init(*m_device, createView);
453}
454
455XGL_RESULT XglImage::MapMemory(XGL_VOID** ptr)
456{
457 *ptr = map();
458 return (*ptr) ? XGL_SUCCESS : XGL_ERROR_UNKNOWN;
459}
460
461XGL_RESULT XglImage::UnmapMemory()
462{
463 unmap();
464 return XGL_SUCCESS;
465}
466
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800467XglTextureObj::XglTextureObj(XglDevice *device)
Tony Barboure2c58df2014-11-25 13:18:32 -0700468{
469 m_device = device;
470 const XGL_FORMAT tex_format = { XGL_CH_FMT_B8G8R8A8, XGL_NUM_FMT_UNORM };
Tony Barboure2c58df2014-11-25 13:18:32 -0700471 const uint32_t tex_colors[2] = { 0xffff0000, 0xff00ff00 };
Tony Barboure2c58df2014-11-25 13:18:32 -0700472
473 memset(&m_textureViewInfo,0,sizeof(m_textureViewInfo));
474
475 m_textureViewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
476
477 const XGL_IMAGE_CREATE_INFO image = {
478 .sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
479 .pNext = NULL,
480 .imageType = XGL_IMAGE_2D,
481 .format = tex_format,
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800482 .extent = { 16, 16, 1 },
Tony Barboure2c58df2014-11-25 13:18:32 -0700483 .mipLevels = 1,
484 .arraySize = 1,
485 .samples = 1,
486 .tiling = XGL_LINEAR_TILING,
487 .usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
488 .flags = 0,
489 };
490
Tony Barboure2c58df2014-11-25 13:18:32 -0700491 XGL_IMAGE_VIEW_CREATE_INFO view;
492 view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
493 view.pNext = NULL;
494 view.image = XGL_NULL_HANDLE;
495 view.viewType = XGL_IMAGE_VIEW_2D;
496 view.format = image.format;
497 view.channels.r = XGL_CHANNEL_SWIZZLE_R;
498 view.channels.g = XGL_CHANNEL_SWIZZLE_G;
499 view.channels.b = XGL_CHANNEL_SWIZZLE_B;
500 view.channels.a = XGL_CHANNEL_SWIZZLE_A;
501 view.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
502 view.subresourceRange.baseMipLevel = 0;
503 view.subresourceRange.mipLevels = 1;
504 view.subresourceRange.baseArraySlice = 0;
505 view.subresourceRange.arraySize = 1;
506 view.minLod = 0.0f;
507
Tony Barboure2c58df2014-11-25 13:18:32 -0700508 /* create image */
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800509 init(*m_device, image);
Tony Barboure2c58df2014-11-25 13:18:32 -0700510
511 /* create image view */
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800512 view.image = obj();
513 m_textureView.init(*m_device, view);
Tony Barboure2c58df2014-11-25 13:18:32 -0700514
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800515 XGL_SUBRESOURCE_LAYOUT layout =
516 subresource_layout(subresource(XGL_IMAGE_ASPECT_COLOR, 0, 0));
517 m_rowPitch = layout.rowPitch;
Tony Barboure2c58df2014-11-25 13:18:32 -0700518
Tony Barboure2c58df2014-11-25 13:18:32 -0700519 XGL_VOID *data;
520 XGL_INT x, y;
521
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800522 data = map();
Tony Barboure2c58df2014-11-25 13:18:32 -0700523
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800524 for (y = 0; y < extent().height; y++) {
Tony Barboure2c58df2014-11-25 13:18:32 -0700525 uint32_t *row = (uint32_t *) ((char *) data + layout.rowPitch * y);
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800526 for (x = 0; x < extent().width; x++)
Tony Barboure2c58df2014-11-25 13:18:32 -0700527 row[x] = tex_colors[(x & 1) ^ (y & 1)];
528 }
529
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800530 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700531
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800532 m_textureViewInfo.view = m_textureView.obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700533
534}
Tony Barbour82c39522014-12-04 14:33:33 -0700535
Tony Barboure2c58df2014-11-25 13:18:32 -0700536void XglTextureObj::ChangeColors(uint32_t color1, uint32_t color2)
537{
Tony Barboure2c58df2014-11-25 13:18:32 -0700538 const uint32_t tex_colors[2] = { color1, color2 };
539 XGL_VOID *data;
540
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800541 data = map();
Tony Barboure2c58df2014-11-25 13:18:32 -0700542
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800543 for (int y = 0; y < extent().height; y++) {
Tony Barboure2c58df2014-11-25 13:18:32 -0700544 uint32_t *row = (uint32_t *) ((char *) data + m_rowPitch * y);
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800545 for (int x = 0; x < extent().width; x++)
Tony Barboure2c58df2014-11-25 13:18:32 -0700546 row[x] = tex_colors[(x & 1) ^ (y & 1)];
547 }
548
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800549 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700550}
551
552XglSamplerObj::XglSamplerObj(XglDevice *device)
553{
Tony Barboure2c58df2014-11-25 13:18:32 -0700554 m_device = device;
Tony Barboure2c58df2014-11-25 13:18:32 -0700555
Chia-I Wue9864b52014-12-28 16:32:24 +0800556 XGL_SAMPLER_CREATE_INFO samplerCreateInfo;
557 memset(&samplerCreateInfo,0,sizeof(samplerCreateInfo));
558 samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
559 samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
560 samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
561 samplerCreateInfo.mipMode = XGL_TEX_MIPMAP_BASE;
562 samplerCreateInfo.addressU = XGL_TEX_ADDRESS_WRAP;
563 samplerCreateInfo.addressV = XGL_TEX_ADDRESS_WRAP;
564 samplerCreateInfo.addressW = XGL_TEX_ADDRESS_WRAP;
565 samplerCreateInfo.mipLodBias = 0.0;
566 samplerCreateInfo.maxAnisotropy = 0.0;
567 samplerCreateInfo.compareFunc = XGL_COMPARE_NEVER;
568 samplerCreateInfo.minLod = 0.0;
569 samplerCreateInfo.maxLod = 0.0;
570 samplerCreateInfo.borderColorType = XGL_BORDER_COLOR_OPAQUE_WHITE;
Tony Barboure2c58df2014-11-25 13:18:32 -0700571
Chia-I Wue9864b52014-12-28 16:32:24 +0800572 init(*m_device, samplerCreateInfo);
Tony Barbourf325bf12014-12-03 15:59:38 -0700573}
Tony Barboure2c58df2014-11-25 13:18:32 -0700574
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700575/*
576 * Basic ConstantBuffer constructor. Then use create methods to fill in the details.
577 */
578XglConstantBufferObj::XglConstantBufferObj(XglDevice *device)
579{
580 m_device = device;
Tony Barbour38422802014-12-10 14:36:31 -0700581 m_commandBuffer = 0;
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700582
583 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
Courtney Goeltzenleuchter3b0a8152014-12-04 15:18:47 -0700584}
585
Tony Barboure2c58df2014-11-25 13:18:32 -0700586XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
587{
Tony Barboure2c58df2014-11-25 13:18:32 -0700588 m_device = device;
Chia-I Wua07fee62014-12-28 15:26:08 +0800589 m_commandBuffer = 0;
590
591 memset(&m_constantBufferView,0,sizeof(m_constantBufferView));
Tony Barboure2c58df2014-11-25 13:18:32 -0700592 m_numVertices = constantCount;
593 m_stride = constantSize;
594
Chia-I Wua07fee62014-12-28 15:26:08 +0800595 const size_t allocationSize = constantCount * constantSize;
596 init(*m_device, allocationSize);
Tony Barboure2c58df2014-11-25 13:18:32 -0700597
Chia-I Wua07fee62014-12-28 15:26:08 +0800598 void *pData = map();
599 memcpy(pData, data, allocationSize);
600 unmap();
Tony Barboure2c58df2014-11-25 13:18:32 -0700601
602 // set up the memory view for the constant buffer
603 this->m_constantBufferView.stride = 16;
Chia-I Wua07fee62014-12-28 15:26:08 +0800604 this->m_constantBufferView.range = allocationSize;
Tony Barboure2c58df2014-11-25 13:18:32 -0700605 this->m_constantBufferView.offset = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800606 this->m_constantBufferView.mem = obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700607 this->m_constantBufferView.format.channelFormat = XGL_CH_FMT_R32G32B32A32;
608 this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
609 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
610}
Tony Barbour82c39522014-12-04 14:33:33 -0700611
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700612void XglConstantBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset, XGL_UINT binding)
613{
Chia-I Wua07fee62014-12-28 15:26:08 +0800614 xglCmdBindVertexData(cmdBuffer, obj(), offset, binding);
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700615}
616
617
Tony Barbour099a9eb2014-12-10 17:40:15 -0700618void XglConstantBufferObj::SetMemoryState(XGL_MEMORY_STATE newState)
Tony Barboure2c58df2014-11-25 13:18:32 -0700619{
Tony Barbour38422802014-12-10 14:36:31 -0700620 XGL_RESULT err = XGL_SUCCESS;
Tony Barbour38422802014-12-10 14:36:31 -0700621
Tony Barboure2c58df2014-11-25 13:18:32 -0700622 if (this->m_constantBufferView.state == newState)
623 return;
624
Tony Barbour38422802014-12-10 14:36:31 -0700625 if (!m_commandBuffer)
626 {
Chia-I Wua07fee62014-12-28 15:26:08 +0800627 m_fence.init(*m_device, xgl_testing::Fence::create_info(0));
Tony Barbour38422802014-12-10 14:36:31 -0700628
629 m_commandBuffer = new XglCommandBufferObj(m_device);
630
631 }
632 else
633 {
Chia-I Wua07fee62014-12-28 15:26:08 +0800634 m_device->wait(m_fence);
Tony Barbour38422802014-12-10 14:36:31 -0700635 }
636
Tony Barboure2c58df2014-11-25 13:18:32 -0700637 // open the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700638 err = m_commandBuffer->BeginCommandBuffer(0);
Tony Barboure2c58df2014-11-25 13:18:32 -0700639 ASSERT_XGL_SUCCESS(err);
640
Chia-I Wua07fee62014-12-28 15:26:08 +0800641 XGL_MEMORY_STATE_TRANSITION transition =
642 state_transition(XGL_MEMORY_STATE_DATA_TRANSFER, newState, 0, m_numVertices * m_stride);
Tony Barboure2c58df2014-11-25 13:18:32 -0700643
644 // write transition to the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700645 m_commandBuffer->PrepareMemoryRegions(1, &transition);
Tony Barboure2c58df2014-11-25 13:18:32 -0700646 this->m_constantBufferView.state = newState;
647
648 // finish recording the command buffer
Tony Barbour471338d2014-12-10 17:28:39 -0700649 err = m_commandBuffer->EndCommandBuffer();
Tony Barboure2c58df2014-11-25 13:18:32 -0700650 ASSERT_XGL_SUCCESS(err);
651
652 XGL_UINT32 numMemRefs=1;
653 XGL_MEMORY_REF memRefs;
654 // this command buffer only uses the vertex buffer memory
655 memRefs.flags = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800656 memRefs.mem = obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700657
658 // submit the command buffer to the universal queue
Tony Barbour471338d2014-12-10 17:28:39 -0700659 XGL_CMD_BUFFER bufferArray[1];
660 bufferArray[0] = m_commandBuffer->GetBufferHandle();
Chia-I Wua07fee62014-12-28 15:26:08 +0800661 err = xglQueueSubmit( m_device->m_queue, 1, bufferArray, numMemRefs, &memRefs, m_fence.obj() );
Tony Barboure2c58df2014-11-25 13:18:32 -0700662 ASSERT_XGL_SUCCESS(err);
663}
664
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700665XglIndexBufferObj::XglIndexBufferObj(XglDevice *device)
666 : XglConstantBufferObj(device)
667{
668
669}
670
671void XglIndexBufferObj::CreateAndInitBuffer(int numIndexes, XGL_INDEX_TYPE indexType, const void* data)
672{
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700673 XGL_FORMAT viewFormat;
674
675 m_numVertices = numIndexes;
676 m_indexType = indexType;
677 viewFormat.numericFormat = XGL_NUM_FMT_UINT;
678 switch (indexType) {
679 case XGL_INDEX_8:
680 m_stride = 1;
681 viewFormat.channelFormat = XGL_CH_FMT_R8;
682 break;
683 case XGL_INDEX_16:
684 m_stride = 2;
685 viewFormat.channelFormat = XGL_CH_FMT_R16;
686 break;
687 case XGL_INDEX_32:
688 m_stride = 4;
689 viewFormat.channelFormat = XGL_CH_FMT_R32;
690 break;
Chia-I Wub4c2aa42014-12-15 23:50:11 +0800691 default:
692 assert(!"unknown index type");
693 break;
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700694 }
695
Chia-I Wua07fee62014-12-28 15:26:08 +0800696 const size_t allocationSize = numIndexes * m_stride;
697 init(*m_device, allocationSize);
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700698
Chia-I Wua07fee62014-12-28 15:26:08 +0800699 void *pData = map();
700 memcpy(pData, data, allocationSize);
701 unmap();
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700702
703 // set up the memory view for the constant buffer
704 this->m_constantBufferView.stride = m_stride;
Chia-I Wua07fee62014-12-28 15:26:08 +0800705 this->m_constantBufferView.range = allocationSize;
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700706 this->m_constantBufferView.offset = 0;
Chia-I Wua07fee62014-12-28 15:26:08 +0800707 this->m_constantBufferView.mem = obj();
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700708 this->m_constantBufferView.format.channelFormat = viewFormat.channelFormat;
709 this->m_constantBufferView.format.numericFormat = viewFormat.numericFormat;
710 this->m_constantBufferView.state = XGL_MEMORY_STATE_DATA_TRANSFER;
711}
712
713void XglIndexBufferObj::Bind(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_SIZE offset)
714{
Chia-I Wua07fee62014-12-28 15:26:08 +0800715 xglCmdBindIndexData(cmdBuffer, obj(), offset, m_indexType);
Courtney Goeltzenleuchter8a785932014-12-04 15:24:05 -0700716}
Tony Barboure2c58df2014-11-25 13:18:32 -0700717
Tony Barbouraf1f9192014-12-17 10:57:58 -0700718XGL_INDEX_TYPE XglIndexBufferObj::GetIndexType()
719{
720 return m_indexType;
721}
722
Tony Barbour5420af02014-12-03 13:58:15 -0700723XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj *descriptorSet)
Tony Barboure2c58df2014-11-25 13:18:32 -0700724{
725 XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
726 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
727 stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
728 stageInfo->shader.stage = m_stage;
Chia-I Wubabc0fd2014-12-29 14:14:03 +0800729 stageInfo->shader.shader = obj();
Tony Barboure2c58df2014-11-25 13:18:32 -0700730 stageInfo->shader.descriptorSetMapping[0].descriptorCount = 0;
731 stageInfo->shader.linkConstBufferCount = 0;
732 stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
733 stageInfo->shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_UNUSED;
734 stageInfo->shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
735
Tony Barbour824b7712014-12-18 17:06:21 -0700736 stageInfo->shader.descriptorSetMapping[0].descriptorCount = descriptorSet->GetTotalSlots();
Tony Barboure2c58df2014-11-25 13:18:32 -0700737 if (stageInfo->shader.descriptorSetMapping[0].descriptorCount)
738 {
739 vector<int> allSlots;
740 vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800741 vector<void *> allObjs;
Tony Barboure2c58df2014-11-25 13:18:32 -0700742
743 allSlots.reserve(m_memSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
744 allTypes.reserve(m_memTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
745 allObjs.reserve(m_memObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
746
747 if (m_memSlots.size())
748 {
749 allSlots.insert(allSlots.end(), m_memSlots.begin(), m_memSlots.end());
750 allTypes.insert(allTypes.end(), m_memTypes.begin(), m_memTypes.end());
751 allObjs.insert(allObjs.end(), m_memObjs.begin(), m_memObjs.end());
752 }
753 if (m_imageSlots.size())
754 {
755 allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
756 allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
757 allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
758 }
759 if (m_samplerSlots.size())
760 {
761 allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
762 allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
763 allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
764 }
765
Tony Barbour5420af02014-12-03 13:58:15 -0700766 slotInfo = descriptorSet->GetSlotInfo(allSlots, allTypes, allObjs);
Tony Barboure2c58df2014-11-25 13:18:32 -0700767 stageInfo->shader.descriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
768 }
769 return stageInfo;
770}
771
772void XglShaderObj::BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
773{
774 m_memSlots.push_back(slot);
775 m_memTypes.push_back(type);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800776 m_memObjs.push_back(&constantBuffer->m_constantBufferView);
Tony Barboure2c58df2014-11-25 13:18:32 -0700777
778}
Tony Barbour82c39522014-12-04 14:33:33 -0700779
Tony Barboure2c58df2014-11-25 13:18:32 -0700780void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
781{
782 m_imageSlots.push_back(slot);
783 m_imageTypes.push_back(type);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800784 m_imageObjs.push_back(&texture->m_textureViewInfo);
Tony Barboure2c58df2014-11-25 13:18:32 -0700785
786}
Tony Barbour82c39522014-12-04 14:33:33 -0700787
Tony Barboure2c58df2014-11-25 13:18:32 -0700788void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
789{
790 m_samplerSlots.push_back(slot);
791 m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
Chia-I Wuc86b54c2014-12-28 16:07:01 +0800792 m_samplerObjs.push_back(sampler);
Tony Barboure2c58df2014-11-25 13:18:32 -0700793
794}
Tony Barbour82c39522014-12-04 14:33:33 -0700795
Tony Barboure2c58df2014-11-25 13:18:32 -0700796XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework)
797{
798 XGL_RESULT err = XGL_SUCCESS;
799 std::vector<unsigned int> bil;
800 XGL_SHADER_CREATE_INFO createInfo;
801 size_t shader_len;
802
803 m_stage = stage;
804 m_device = device;
805
806 createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
807 createInfo.pNext = NULL;
808
809 if (!framework->m_use_bil) {
810
811 shader_len = strlen(shader_code);
812 createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
813 createInfo.pCode = malloc(createInfo.codeSize);
814 createInfo.flags = 0;
815
816 /* try version 0 first: XGL_PIPELINE_SHADER_STAGE followed by GLSL */
817 ((uint32_t *) createInfo.pCode)[0] = ICD_BIL_MAGIC;
818 ((uint32_t *) createInfo.pCode)[1] = 0;
819 ((uint32_t *) createInfo.pCode)[2] = stage;
820 memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
821
Chia-I Wubabc0fd2014-12-29 14:14:03 +0800822 err = init_try(*m_device, createInfo);
Tony Barboure2c58df2014-11-25 13:18:32 -0700823 }
824
825 if (framework->m_use_bil || err) {
826 std::vector<unsigned int> bil;
827 err = XGL_SUCCESS;
828
829 // Use Reference GLSL to BIL compiler
830 framework->GLSLtoBIL(stage, shader_code, bil);
831 createInfo.pCode = bil.data();
832 createInfo.codeSize = bil.size() * sizeof(unsigned int);
833 createInfo.flags = 0;
Tony Barbour82c39522014-12-04 14:33:33 -0700834
Chia-I Wubabc0fd2014-12-29 14:14:03 +0800835 init(*m_device, createInfo);
836 }
Tony Barbourf325bf12014-12-03 15:59:38 -0700837}
Tony Barbour82c39522014-12-04 14:33:33 -0700838
Tony Barboure2c58df2014-11-25 13:18:32 -0700839XglPipelineObj::XglPipelineObj(XglDevice *device)
840{
Tony Barboure2c58df2014-11-25 13:18:32 -0700841 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 Barbour976e1cf2014-12-17 11:57:31 -0700908void XglPipelineObj::CreateXGLPipeline(XglDescriptorSetObj *descriptorSet)
909{
Tony Barbour976e1cf2014-12-17 11:57:31 -0700910 XGL_VOID* head_ptr = &m_db_state;
911 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
912
913 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
914
915 for (int i=0; i<m_shaderObjs.size(); i++)
916 {
917 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
918 shaderCreateInfo->pNext = head_ptr;
919 head_ptr = shaderCreateInfo;
920 }
921
922 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
923 {
924 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
925 m_vi_state.pNext = head_ptr;
926 head_ptr = &m_vi_state;
927 }
928
929 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
930 info.pNext = head_ptr;
931 info.flags = 0;
932
Chia-I Wu2648d092014-12-29 14:24:14 +0800933 init(*m_device, info);
Tony Barbour976e1cf2014-12-17 11:57:31 -0700934}
Chia-I Wu2648d092014-12-29 14:24:14 +0800935
Tony Barbour976e1cf2014-12-17 11:57:31 -0700936XGL_PIPELINE XglPipelineObj::GetPipelineHandle()
937{
Chia-I Wu2648d092014-12-29 14:24:14 +0800938 return obj();
Tony Barbour976e1cf2014-12-17 11:57:31 -0700939}
940
Tony Barbour5420af02014-12-03 13:58:15 -0700941void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj *descriptorSet)
Tony Barboure2c58df2014-11-25 13:18:32 -0700942{
Tony Barboure2c58df2014-11-25 13:18:32 -0700943 XGL_VOID* head_ptr = &m_db_state;
944 XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
945
946 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
Tony Barboure2c58df2014-11-25 13:18:32 -0700947
948 for (int i=0; i<m_shaderObjs.size(); i++)
949 {
950 shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
951 shaderCreateInfo->pNext = head_ptr;
952 head_ptr = shaderCreateInfo;
953 }
954
955 if (m_vi_state.attributeCount && m_vi_state.bindingCount)
956 {
957 m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
958 m_vi_state.pNext = head_ptr;
959 head_ptr = &m_vi_state;
960 }
961
962 info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
963 info.pNext = head_ptr;
964 info.flags = 0;
965
Chia-I Wu2648d092014-12-29 14:24:14 +0800966 init(*m_device, info);
Tony Barboure2c58df2014-11-25 13:18:32 -0700967
Chia-I Wu2648d092014-12-29 14:24:14 +0800968 xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, obj() );
Tony Barboure2c58df2014-11-25 13:18:32 -0700969
970
971 for (int i=0; i < m_vertexBufferCount; i++)
972 {
Courtney Goeltzenleuchter37640302014-12-04 15:26:56 -0700973 m_vertexBufferObjs[i]->Bind(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700974 }
Tony Barboure2c58df2014-11-25 13:18:32 -0700975}
Tony Barbour82c39522014-12-04 14:33:33 -0700976
Tony Barboure2c58df2014-11-25 13:18:32 -0700977XglMemoryRefManager::XglMemoryRefManager() {
978
979}
Tony Barbour82c39522014-12-04 14:33:33 -0700980
Tony Barboure2c58df2014-11-25 13:18:32 -0700981void XglMemoryRefManager::AddMemoryRef(XglConstantBufferObj *constantBuffer) {
Chia-I Wua07fee62014-12-28 15:26:08 +0800982 m_bufferObjs.push_back(constantBuffer->obj());
Tony Barboure2c58df2014-11-25 13:18:32 -0700983}
Tony Barbour82c39522014-12-04 14:33:33 -0700984
Tony Barboure2c58df2014-11-25 13:18:32 -0700985void XglMemoryRefManager::AddMemoryRef(XglTextureObj *texture) {
Chia-I Wu13a3aa82014-12-28 15:55:09 +0800986 const std::vector<XGL_GPU_MEMORY> mems = texture->memories();
987 if (!mems.empty())
988 m_bufferObjs.push_back(mems[0]);
Tony Barboure2c58df2014-11-25 13:18:32 -0700989}
Tony Barbour82c39522014-12-04 14:33:33 -0700990
Tony Barboure2c58df2014-11-25 13:18:32 -0700991XGL_MEMORY_REF* XglMemoryRefManager::GetMemoryRefList() {
992
993 XGL_MEMORY_REF *localRefs;
994 XGL_UINT32 numRefs=m_bufferObjs.size();
995
996 if (numRefs <= 0)
997 return NULL;
998
999 localRefs = (XGL_MEMORY_REF*) malloc( numRefs * sizeof(XGL_MEMORY_REF) );
1000 for (int i=0; i<numRefs; i++)
1001 {
1002 localRefs[i].flags = 0;
Chia-I Wu283d7a62014-12-28 15:43:42 +08001003 localRefs[i].mem = m_bufferObjs[i];
Tony Barboure2c58df2014-11-25 13:18:32 -07001004 }
1005 return localRefs;
1006}
1007int XglMemoryRefManager::GetNumRefs() {
1008 return m_bufferObjs.size();
1009}
Tony Barbour6d047bf2014-12-10 14:34:45 -07001010
1011XglCommandBufferObj::XglCommandBufferObj(XglDevice *device)
Chia-I Wud28343c2014-12-28 15:12:48 +08001012 : xgl_testing::CmdBuffer(*device, xgl_testing::CmdBuffer::create_info(XGL_QUEUE_TYPE_GRAPHICS))
Tony Barbour6d047bf2014-12-10 14:34:45 -07001013{
Tony Barbour6d047bf2014-12-10 14:34:45 -07001014 m_device = device;
Chia-I Wud28343c2014-12-28 15:12:48 +08001015 m_renderTargetCount = 0;
Tony Barbour6d047bf2014-12-10 14:34:45 -07001016}
Tony Barbour471338d2014-12-10 17:28:39 -07001017
Tony Barbour6d047bf2014-12-10 14:34:45 -07001018XGL_CMD_BUFFER XglCommandBufferObj::GetBufferHandle()
1019{
Chia-I Wud28343c2014-12-28 15:12:48 +08001020 return obj();
Tony Barbour6d047bf2014-12-10 14:34:45 -07001021}
Tony Barbour471338d2014-12-10 17:28:39 -07001022
1023XGL_RESULT XglCommandBufferObj::BeginCommandBuffer(XGL_FLAGS flags)
1024{
Chia-I Wud28343c2014-12-28 15:12:48 +08001025 begin(flags);
1026 return XGL_SUCCESS;
Tony Barbour471338d2014-12-10 17:28:39 -07001027}
1028
1029XGL_RESULT XglCommandBufferObj::EndCommandBuffer()
1030{
Chia-I Wud28343c2014-12-28 15:12:48 +08001031 end();
1032 return XGL_SUCCESS;
Tony Barbour471338d2014-12-10 17:28:39 -07001033}
1034
1035void XglCommandBufferObj::PrepareMemoryRegions(int transitionCount, XGL_MEMORY_STATE_TRANSITION *transitionPtr)
1036{
Chia-I Wud28343c2014-12-28 15:12:48 +08001037 xglCmdPrepareMemoryRegions(obj(), transitionCount, transitionPtr);
Tony Barbour471338d2014-12-10 17:28:39 -07001038}
1039
Tony Barbour30cc9e82014-12-17 11:53:55 -07001040void XglCommandBufferObj::ClearAllBuffers(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding, XGL_IMAGE depthStencilImage)
1041{
1042 XGL_UINT i;
1043
1044 // whatever we want to do, we do it to the whole buffer
1045 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
1046 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
1047 srRange.baseMipLevel = 0;
1048 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1049 srRange.baseArraySlice = 0;
1050 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1051
1052 // clear the back buffer to dark grey
1053 XGL_UINT clearColor[4] = {64, 64, 64, 0};
1054 XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
1055 for (i = 0; i < m_renderTargetCount; i++) {
1056 transitionToClear.image = m_renderTargets[i]->image();
1057 transitionToClear.oldState = m_renderTargets[i]->state();
1058 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
1059 transitionToClear.subresourceRange = srRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001060 xglCmdPrepareImages( obj(), 1, &transitionToClear );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001061 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
1062
Chia-I Wud28343c2014-12-28 15:12:48 +08001063 xglCmdClearColorImageRaw( obj(), m_renderTargets[i]->image(), clearColor, 1, &srRange );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001064 }
1065
1066 if (depthStencilImage)
1067 {
1068 XGL_IMAGE_SUBRESOURCE_RANGE dsRange = {};
1069 dsRange.aspect = XGL_IMAGE_ASPECT_DEPTH;
1070 dsRange.baseMipLevel = 0;
1071 dsRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1072 dsRange.baseArraySlice = 0;
1073 dsRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1074
1075 // prepare the depth buffer for clear
1076 memset(&transitionToClear,0,sizeof(transitionToClear));
1077 transitionToClear.image = depthStencilImage;
1078 transitionToClear.oldState = depthStencilBinding->depthState;
1079 transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
1080 transitionToClear.subresourceRange = dsRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001081 xglCmdPrepareImages( obj(), 1, &transitionToClear );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001082 depthStencilBinding->depthState = transitionToClear.newState;
1083
Chia-I Wud28343c2014-12-28 15:12:48 +08001084 xglCmdClearDepthStencil(obj(), depthStencilImage, 1.0f, 0, 1, &dsRange);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001085
1086 // prepare depth buffer for rendering
1087 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
1088 transitionToRender.image = depthStencilImage;
1089 transitionToRender.oldState = XGL_IMAGE_STATE_CLEAR;
1090 transitionToRender.newState = depthStencilBinding->depthState;
1091 transitionToRender.subresourceRange = dsRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001092 xglCmdPrepareImages( obj(), 1, &transitionToRender );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001093 depthStencilBinding->depthState = transitionToClear.newState;
1094 }
1095}
1096
1097void XglCommandBufferObj::BindAttachments(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding)
1098{
1099 XGL_UINT i;
1100 XGL_COLOR_ATTACHMENT_BIND_INFO colorBindings[XGL_MAX_COLOR_ATTACHMENTS];
1101 XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
1102 srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
1103 srRange.baseMipLevel = 0;
1104 srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
1105 srRange.baseArraySlice = 0;
1106 srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
1107
1108 XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
1109 for(i=0; i<m_renderTargetCount; i++)
1110 {
1111 transitionToRender.image = m_renderTargets[i]->image();
1112 transitionToRender.oldState = m_renderTargets[i]->state();
1113 transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1114 transitionToRender.subresourceRange = srRange;
Chia-I Wud28343c2014-12-28 15:12:48 +08001115 xglCmdPrepareImages(obj(), 1, &transitionToRender );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001116 m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToRender.newState);
1117 }
1118 for (i = 0; i < m_renderTargetCount; i++) {
1119 colorBindings[i].view = m_renderTargets[i]->targetView();
1120 colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
1121 }
1122 if (depthStencilBinding) {
Chia-I Wud28343c2014-12-28 15:12:48 +08001123 xglCmdBindAttachments(obj(), m_renderTargetCount, colorBindings, depthStencilBinding );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001124 } else {
Chia-I Wud28343c2014-12-28 15:12:48 +08001125 xglCmdBindAttachments(obj(), m_renderTargetCount, colorBindings, XGL_NULL_HANDLE );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001126 }
1127}
1128
1129void XglCommandBufferObj::BindState(XGL_RASTER_STATE_OBJECT stateRaster, XGL_VIEWPORT_STATE_OBJECT stateViewport,
1130 XGL_COLOR_BLEND_STATE_OBJECT colorBlend, XGL_DEPTH_STENCIL_STATE_OBJECT stateDepthStencil,
1131 XGL_MSAA_STATE_OBJECT stateMsaa)
1132{
1133 // set all states
Chia-I Wud28343c2014-12-28 15:12:48 +08001134 xglCmdBindStateObject( obj(), XGL_STATE_BIND_RASTER, stateRaster );
1135 xglCmdBindStateObject( obj(), XGL_STATE_BIND_VIEWPORT, stateViewport );
1136 xglCmdBindStateObject( obj(), XGL_STATE_BIND_COLOR_BLEND, colorBlend);
1137 xglCmdBindStateObject( obj(), XGL_STATE_BIND_DEPTH_STENCIL, stateDepthStencil );
1138 xglCmdBindStateObject( obj(), XGL_STATE_BIND_MSAA, stateMsaa );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001139}
1140
1141void XglCommandBufferObj::AddRenderTarget(XglImage *renderTarget)
1142{
1143 m_renderTargets.push_back(renderTarget);
1144 m_renderTargetCount++;
1145}
1146
1147void XglCommandBufferObj::DrawIndexed(XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount)
1148{
Chia-I Wud28343c2014-12-28 15:12:48 +08001149 xglCmdDrawIndexed(obj(), firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001150}
1151
1152void XglCommandBufferObj::Draw(XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
1153{
Chia-I Wud28343c2014-12-28 15:12:48 +08001154 xglCmdDraw(obj(), firstVertex, vertexCount, firstInstance, instanceCount);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001155}
1156
1157void XglCommandBufferObj::QueueCommandBuffer(XGL_MEMORY_REF *memRefs, XGL_UINT32 numMemRefs)
1158{
1159 XGL_RESULT err = XGL_SUCCESS;
1160
1161 // submit the command buffer to the universal queue
Chia-I Wud28343c2014-12-28 15:12:48 +08001162 err = xglQueueSubmit( m_device->m_queue, 1, &obj(), numMemRefs, memRefs, NULL );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001163 ASSERT_XGL_SUCCESS( err );
1164
1165 err = xglQueueWaitIdle( m_device->m_queue );
1166 ASSERT_XGL_SUCCESS( err );
1167
1168 // Wait for work to finish before cleaning up.
1169 xglDeviceWaitIdle(m_device->device());
1170
1171}
1172void XglCommandBufferObj::BindPipeline(XGL_PIPELINE pipeline)
1173{
Chia-I Wud28343c2014-12-28 15:12:48 +08001174 xglCmdBindPipeline( obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, pipeline );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001175}
1176
1177void XglCommandBufferObj::BindDescriptorSet(XGL_DESCRIPTOR_SET descriptorSet)
1178{
1179 // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
Chia-I Wud28343c2014-12-28 15:12:48 +08001180 xglCmdBindDescriptorSet(obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, descriptorSet, 0 );
Tony Barbour30cc9e82014-12-17 11:53:55 -07001181}
1182void XglCommandBufferObj::BindIndexBuffer(XglIndexBufferObj *indexBuffer, XGL_UINT offset)
1183{
Chia-I Wua07fee62014-12-28 15:26:08 +08001184 xglCmdBindIndexData(obj(), indexBuffer->obj(), offset, indexBuffer->GetIndexType());
Tony Barbour30cc9e82014-12-17 11:53:55 -07001185}
1186void XglCommandBufferObj::BindVertexBuffer(XglConstantBufferObj *vertexBuffer, XGL_UINT offset, XGL_UINT binding)
1187{
Chia-I Wua07fee62014-12-28 15:26:08 +08001188 xglCmdBindVertexData(obj(), vertexBuffer->obj(), offset, binding);
Tony Barbour30cc9e82014-12-17 11:53:55 -07001189}