blob: 4dc377cdd68f2193f3929e8160969d973a253040 [file] [log] [blame]
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001/*
2 * XGL
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
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
Ian Elliott81ac44c2015-01-13 17:52:38 -070028#include "loader_platform.h"
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080029#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080030#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlisb8154982014-10-27 14:53:17 -060031#include "xgl_struct_string_helper.h"
Tobin Ehlisa701ef02014-11-27 15:43:39 -070032#include "xgl_struct_graphviz_helper.h"
Tobin Ehlise79df942014-11-18 16:38:08 -070033#include "draw_state.h"
Jon Ashburn2e9b5612014-12-22 13:38:27 -070034#include "layers_config.h"
Ian Elliott20f06872015-02-12 17:08:34 -070035// The following is #included again to catch certain OS-specific functions
36// being used:
37#include "loader_platform.h"
Jon Ashburn5a7be202015-02-16 08:46:53 -070038#include "layers_msg.h"
Tobin Ehlis8726b9f2014-10-24 12:01:45 -060039static XGL_LAYER_DISPATCH_TABLE nextTable;
40static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott81ac44c2015-01-13 17:52:38 -070041static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
42static int globalLockInitialized = 0;
43static loader_platform_thread_mutex globalLock;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070044
Tobin Ehlis26092022014-11-20 09:49:17 -070045// Return the size of the underlying struct based on struct type
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060046static size_t sTypeStructSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis26092022014-11-20 09:49:17 -070047{
48 switch (sType)
49 {
50 case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
51 return sizeof(XGL_APPLICATION_INFO);
52 case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
53 return sizeof(XGL_DEVICE_CREATE_INFO);
54 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
55 return sizeof(XGL_MEMORY_ALLOC_INFO);
56 case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
57 return sizeof(XGL_MEMORY_OPEN_INFO);
58 case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
59 return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070060 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
61 return sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070062 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
63 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070064 case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
65 return sizeof(XGL_EVENT_WAIT_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070066 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
67 return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
68 case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
69 return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
70 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
71 return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
72 case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
73 return sizeof(XGL_SHADER_CREATE_INFO);
74 case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
75 return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
76 case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
77 return sizeof(XGL_SAMPLER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070078 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
79 return sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
80 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
81 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
82 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
83 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
84 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
85 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
86 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
87 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070088 case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
89 return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
90 case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
91 return sizeof(XGL_EVENT_CREATE_INFO);
92 case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
93 return sizeof(XGL_FENCE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -060094 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -070095 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -060096 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -070097 return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
98 case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
99 return sizeof(XGL_QUERY_POOL_CREATE_INFO);
100 case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
101 return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
102 case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
103 return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700104 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
105 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700106 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
107 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700108 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
109 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700110 case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
111 return sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700112 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
113 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
114 case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
115 return sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700116 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
117 return sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700118 case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
119 return sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
120 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
121 return sizeof(XGL_IMAGE_CREATE_INFO);
122 case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
123 return sizeof(XGL_BUFFER_CREATE_INFO);
124 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
125 return sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
126 case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
127 return sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
128 case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
129 return sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
130 case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
131 return sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
132 case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
133 return sizeof(XGL_RENDER_PASS_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700134 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
135 return sizeof(XGL_LAYER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700136 case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
137 return sizeof(XGL_PIPELINE_BARRIER);
138 case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
139 return sizeof(XGL_MEMORY_BARRIER);
140 case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
141 return sizeof(XGL_BUFFER_MEMORY_BARRIER);
142 case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
143 return sizeof(XGL_IMAGE_MEMORY_BARRIER);
144 case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
145 return sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
146 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
147 return sizeof(XGL_UPDATE_SAMPLERS);
148 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
149 return sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
150 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
151 return sizeof(XGL_UPDATE_IMAGES);
152 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
153 return sizeof(XGL_UPDATE_BUFFERS);
154 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
155 return sizeof(XGL_UPDATE_AS_COPY);
156 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
157 return sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
158 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
159 return sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700160 default:
161 return 0;
162 }
163}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700164// Return the size of the underlying struct based on sType
165static size_t dynStateCreateInfoSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700166{
167 switch (sType)
168 {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700169 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
170 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
171 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
172 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
173 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
174 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
175 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
176 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700177 default:
178 return 0;
179 }
180}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700181// Return a string representation of CMD_TYPE enum
182static char* cmdTypeToString(CMD_TYPE cmd)
183{
184 switch (cmd)
185 {
186 case CMD_BINDPIPELINE:
187 return "CMD_BINDPIPELINE";
188 case CMD_BINDPIPELINEDELTA:
189 return "CMD_BINDPIPELINEDELTA";
190 case CMD_BINDDYNAMICSTATEOBJECT:
191 return "CMD_BINDDYNAMICSTATEOBJECT";
192 case CMD_BINDDESCRIPTORSET:
193 return "CMD_BINDDESCRIPTORSET";
194 case CMD_BINDINDEXBUFFER:
195 return "CMD_BINDINDEXBUFFER";
196 case CMD_BINDVERTEXBUFFER:
197 return "CMD_BINDVERTEXBUFFER";
198 case CMD_DRAW:
199 return "CMD_DRAW";
200 case CMD_DRAWINDEXED:
201 return "CMD_DRAWINDEXED";
202 case CMD_DRAWINDIRECT:
203 return "CMD_DRAWINDIRECT";
204 case CMD_DRAWINDEXEDINDIRECT:
205 return "CMD_DRAWINDEXEDINDIRECT";
206 case CMD_DISPATCH:
207 return "CMD_DISPATCH";
208 case CMD_DISPATCHINDIRECT:
209 return "CMD_DISPATCHINDIRECT";
210 case CMD_COPYBUFFER:
211 return "CMD_COPYBUFFER";
212 case CMD_COPYIMAGE:
213 return "CMD_COPYIMAGE";
214 case CMD_COPYBUFFERTOIMAGE:
215 return "CMD_COPYBUFFERTOIMAGE";
216 case CMD_COPYIMAGETOBUFFER:
217 return "CMD_COPYIMAGETOBUFFER";
218 case CMD_CLONEIMAGEDATA:
219 return "CMD_CLONEIMAGEDATA";
220 case CMD_UPDATEBUFFER:
221 return "CMD_UPDATEBUFFER";
222 case CMD_FILLBUFFER:
223 return "CMD_FILLBUFFER";
224 case CMD_CLEARCOLORIMAGE:
225 return "CMD_CLEARCOLORIMAGE";
226 case CMD_CLEARCOLORIMAGERAW:
227 return "CMD_CLEARCOLORIMAGERAW";
228 case CMD_CLEARDEPTHSTENCIL:
229 return "CMD_CLEARDEPTHSTENCIL";
230 case CMD_RESOLVEIMAGE:
231 return "CMD_RESOLVEIMAGE";
232 case CMD_SETEVENT:
233 return "CMD_SETEVENT";
234 case CMD_RESETEVENT:
235 return "CMD_RESETEVENT";
236 case CMD_WAITEVENTS:
237 return "CMD_WAITEVENTS";
238 case CMD_PIPELINEBARRIER:
239 return "CMD_PIPELINEBARRIER";
240 case CMD_BEGINQUERY:
241 return "CMD_BEGINQUERY";
242 case CMD_ENDQUERY:
243 return "CMD_ENDQUERY";
244 case CMD_RESETQUERYPOOL:
245 return "CMD_RESETQUERYPOOL";
246 case CMD_WRITETIMESTAMP:
247 return "CMD_WRITETIMESTAMP";
248 case CMD_INITATOMICCOUNTERS:
249 return "CMD_INITATOMICCOUNTERS";
250 case CMD_LOADATOMICCOUNTERS:
251 return "CMD_LOADATOMICCOUNTERS";
252 case CMD_SAVEATOMICCOUNTERS:
253 return "CMD_SAVEATOMICCOUNTERS";
254 case CMD_BEGINRENDERPASS:
255 return "CMD_BEGINRENDERPASS";
256 case CMD_ENDRENDERPASS:
257 return "CMD_ENDRENDERPASS";
258 default:
259 return "UNKNOWN";
260 }
261}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600262// Block of code at start here for managing/tracking Pipeline state that this layer cares about
263// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700264#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600265#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600266
Tobin Ehlis8cced212015-02-13 10:26:14 -0700267static uint64_t g_drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
268
Tobin Ehlis56a61072014-11-21 08:58:46 -0700269// TODO : Should be tracking lastBound per cmdBuffer and when draws occur, report based on that cmd buffer lastBound
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700270// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
271// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis8cced212015-02-13 10:26:14 -0700272static PIPELINE_NODE* g_pPipelineHead = NULL;
273static SAMPLER_NODE* g_pSamplerHead = NULL;
274static IMAGE_NODE* g_pImageHead = NULL;
275static BUFFER_NODE* g_pBufferHead = NULL;
276static GLOBAL_CB_NODE* g_pCmdBufferHead = NULL;
277static XGL_CMD_BUFFER g_lastCmdBuffer = NULL;
278#define MAX_BINDING 0xFFFFFFFF // Default vtxBinding value in CB Node to identify if no vtxBinding set
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600279
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700280static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
Tobin Ehlis56a61072014-11-21 08:58:46 -0700281
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700282static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700283{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700284 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700285 // Insert new node at head of appropriate LL
286 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700287 pStateNode->pNext = g_pDynamicStateHead[bindPoint];
288 g_pDynamicStateHead[bindPoint] = pStateNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700289 pStateNode->stateObj = state;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700290 pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700291 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700292 // VP has embedded ptr so need to handle that as special case
293 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pCreateInfo->sType) {
294 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pStateNode->pCreateInfo;
295 XGL_VIEWPORT** ppViewports = (XGL_VIEWPORT**)&pVPCI->pViewports;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700296 size_t vpSize = sizeof(XGL_VIEWPORT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700297 if (vpSize) {
298 *ppViewports = (XGL_VIEWPORT*)malloc(vpSize);
299 memcpy(*ppViewports, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pViewports, vpSize);
300 }
301 XGL_RECT** ppScissors = (XGL_RECT**)&pVPCI->pScissors;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700302 size_t scSize = sizeof(XGL_RECT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700303 if (scSize) {
304 *ppScissors = (XGL_RECT*)malloc(scSize);
305 memcpy(*ppScissors, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pScissors, scSize);
306 }
307 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700308 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700309}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700310// Free all allocated nodes for Dynamic State objs
311static void freeDynamicState()
312{
313 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
314 DYNAMIC_STATE_NODE* pStateNode = g_pDynamicStateHead[i];
315 DYNAMIC_STATE_NODE* pFreeMe = pStateNode;
316 while (pStateNode) {
317 pFreeMe = pStateNode;
318 pStateNode = pStateNode->pNext;
319 assert(pFreeMe->pCreateInfo);
320 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pFreeMe->pCreateInfo->sType) {
321 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pFreeMe->pCreateInfo;
322 if (pVPCI->pViewports) {
323 void** ppToFree = (void**)&pVPCI->pViewports;
324 free(*ppToFree);
325 }
326 if (pVPCI->pScissors) {
327 void** ppToFree = (void**)&pVPCI->pScissors;
328 free(*ppToFree);
329 }
330 }
331 free(pFreeMe->pCreateInfo);
332 free(pFreeMe);
333 }
334 }
335}
336// Free all sampler nodes
337static void freeSamplers()
338{
339 SAMPLER_NODE* pSampler = g_pSamplerHead;
340 SAMPLER_NODE* pFreeMe = pSampler;
341 while (pSampler) {
342 pFreeMe = pSampler;
343 pSampler = pSampler->pNext;
344 free(pFreeMe);
345 }
346}
347// Free all image nodes
348static void freeImages()
349{
350 IMAGE_NODE* pImage = g_pImageHead;
351 IMAGE_NODE* pFreeMe = pImage;
352 while (pImage) {
353 pFreeMe = pImage;
354 pImage = pImage->pNext;
355 free(pFreeMe);
356 }
357}
358// Free all buffer nodes
359static void freeBuffers()
360{
361 BUFFER_NODE* pBuffer = g_pBufferHead;
362 BUFFER_NODE* pFreeMe = pBuffer;
363 while (pBuffer) {
364 pFreeMe = pBuffer;
365 pBuffer = pBuffer->pNext;
366 free(pFreeMe);
367 }
368}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700369static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700370// Print the last bound dynamic state
Tobin Ehlis8cced212015-02-13 10:26:14 -0700371static void printDynamicState(const XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700372{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700373 GLOBAL_CB_NODE* pCB = getCBNode(cb);
374 if (pCB) {
375 loader_platform_thread_lock_mutex(&globalLock);
376 char str[1024];
377 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
378 if (pCB->lastBoundDynamicState[i]) {
379 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pCB->lastBoundDynamicState[i]->stateObj);
380 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
381 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pCB->lastBoundDynamicState[i]->pCreateInfo, " "));
382 break;
383 }
384 else {
385 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
386 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
387 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700388 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700389 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700390 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700391 else {
392 char str[1024];
393 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cb);
394 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
395 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700396}
397// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600398static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
399{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700400 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700401 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600402 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700403 if (pTrav->pipeline == pipeline) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700404 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600405 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700406 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600407 pTrav = pTrav->pNext;
408 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700409 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600410 return NULL;
411}
412
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700413// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700414// TODO : Use this function to display sampler info
415// commenting out for now to avoid warning about not being used
416/*
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700417static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
418{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700419 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700420 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700421 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700422 if (sampler == pTrav->sampler) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700423 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700424 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700425 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700426 pTrav = pTrav->pNext;
427 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700428 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700429 return NULL;
430}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700431*/
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700432
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600433// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700434// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600435static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
436{
Tobin Ehlis26092022014-11-20 09:49:17 -0700437 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700438 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis26092022014-11-20 09:49:17 -0700439 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700440 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
441 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600442 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700443 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700444 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis26092022014-11-20 09:49:17 -0700445 // Typically pNext is const so have to cast to avoid warning when we modify it here
446 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700447 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
448 // Special copy of Vtx info as it has embedded array
449 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700450 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pShadowTrav;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700451 pPipeline->vtxBindingCount = pVICI->bindingCount;
452 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700453 if (allocSize) {
454 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
455 memcpy(pPipeline->pVertexBindingDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
456 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700457 pPipeline->vtxAttributeCount = pVICI->attributeCount;
458 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700459 if (allocSize) {
460 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
461 memcpy(pPipeline->pVertexAttributeDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
462 }
463 }
464 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pTrav->sType) {
465 // Special copy of CB state as it has embedded array
466 XGL_PIPELINE_CB_STATE_CREATE_INFO *pCBCI = (XGL_PIPELINE_CB_STATE_CREATE_INFO*)pShadowTrav;
467 pPipeline->attachmentCount = pCBCI->attachmentCount;
468 uint32_t allocSize = pPipeline->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE);
469 if (allocSize) {
470 pPipeline->pAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE*)malloc(allocSize);
471 XGL_PIPELINE_CB_ATTACHMENT_STATE** ppAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE**)&pCBCI->pAttachments;
472 *ppAttachments = pPipeline->pAttachments;
473 memcpy(pPipeline->pAttachments, ((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pTrav)->pAttachments, allocSize);
474 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700475 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700476 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600477 }
478}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700479// Free the Pipeline nodes
480static void freePipelines()
481{
482 PIPELINE_NODE* pPipeline = g_pPipelineHead;
483 PIPELINE_NODE* pFreeMe = pPipeline;
484 while (pPipeline) {
485 pFreeMe = pPipeline;
486 GENERIC_HEADER* pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
487 GENERIC_HEADER* pShadowFree = pShadowTrav;
488 while (pShadowTrav) {
489 pShadowFree = pShadowTrav;
490 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
491 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pShadowFree->sType) {
492 // Free the vtx data shadowed directly into pPipeline node
493 if (pFreeMe->pVertexBindingDescriptions)
494 free(pFreeMe->pVertexBindingDescriptions);
495 if (pFreeMe->pVertexAttributeDescriptions)
496 free(pFreeMe->pVertexAttributeDescriptions);
497 }
498 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pShadowFree->sType) {
499 // Free attachment data shadowed into pPipeline node
500 if (pFreeMe->pAttachments)
501 free(pFreeMe->pAttachments);
502 }
503 free(pShadowFree);
504 }
505 pPipeline = pPipeline->pNext;
506 free(pFreeMe);
507 }
508}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600509// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600510
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700511// ptr to HEAD of LL of DS Regions
512static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700513// ptr to HEAD of LL of top-level Layouts
514static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700515
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700516// Return Region node ptr for specified region or else NULL
517static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
518{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700519 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700520 REGION_NODE* pTrav = g_pRegionHead;
521 while (pTrav) {
522 if (pTrav->region == region) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700523 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700524 return pTrav;
525 }
526 pTrav = pTrav->pNext;
527 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700528 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700529 return NULL;
530}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700531// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700532static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700533{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700534 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700535 REGION_NODE* pTrav = g_pRegionHead;
536 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700537 SET_NODE* pSet = pTrav->pSets;
538 while (pSet) {
539 if (pSet->set == set) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700540 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700541 return pSet;
542 }
543 pSet = pSet->pNext;
544 }
545 pTrav = pTrav->pNext;
546 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700547 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700548 return NULL;
549}
550
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700551// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorRegionUpdate() call sequence, otherwise XGL_FALSE
552static bool32_t dsUpdateActive(XGL_DESCRIPTOR_SET ds)
553{
554 SET_NODE* pTrav = getSetNode(ds);
555 if (pTrav) {
556 REGION_NODE* pRegion = NULL;
557 pRegion = getRegionNode(pTrav->region);
558 if (pRegion) {
559 return pRegion->updateActive;
560 }
561 }
562 return XGL_FALSE;
563}
564
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700565static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700566 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700567 LAYOUT_NODE* pTrav = g_pLayoutHead;
568 while (pTrav) {
569 if (pTrav->layout == layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700570 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700571 return pTrav;
572 }
573 pTrav = pTrav->pNext;
574 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700575 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700576 return NULL;
577}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600578
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700579static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
580{
581 switch (pUpdateStruct->sType)
582 {
583 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
584 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
585 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
586 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
587 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
588 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
589 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
590 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
591 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
592 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
593 default:
594 // TODO : Flag specific error for this case
595 return 0;
596 }
597}
598
599static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
600{
601 switch (pUpdateStruct->sType)
602 {
603 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700604 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700605 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700606 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700607 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700608 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700609 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700610 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700611 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
612 // TODO : Need to understand this case better and make sure code is correct
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700613 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700614 default:
615 // TODO : Flag specific error for this case
616 return 0;
617 }
618}
619
620// Verify that the descriptor type in the update struct matches what's expected by the layout
Tobin Ehlisefa84162015-02-17 09:54:13 -0700621static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, const LAYOUT_NODE* pLayout)//XGL_DESCRIPTOR_TYPE type)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700622{
623 // First get actual type of update
624 XGL_DESCRIPTOR_TYPE actualType;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700625 uint32_t i = 0;
626 uint32_t bound = getUpdateUpperBound(pUpdateStruct);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700627 switch (pUpdateStruct->sType)
628 {
629 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
630 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
631 break;
632 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
633 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
634 break;
635 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
636 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
637 break;
638 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
639 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
640 break;
641 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
642 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
643 break;
644 default:
645 // TODO : Flag specific error for this case
646 return 0;
647 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700648 for (i = ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index; i < bound; i++) {
649 if (pLayout->pTypes[i] != actualType)
650 return 0;
651 }
652 return 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700653}
654
655// Verify that update region for this update does not exceed max layout index for this type
656static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
657{
658 if (getUpdateUpperBound(pUpdateStruct) > layoutIdx)
659 return 0;
660 return 1;
661}
662
663// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
664// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
665static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
666{
667 GENERIC_HEADER* pNewNode = NULL;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700668 size_t array_size = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700669 size_t base_array_size = 0;
670 size_t total_array_size = 0;
671 XGL_UPDATE_BUFFERS* pUBCI;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700672 switch (pUpdate->sType)
673 {
674 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
675 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
676 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
677 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
678 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
679 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700680 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700681 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
682 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
683 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
684 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
685 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
686 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
687 memcpy((XGL_SAMPLER_IMAGE_VIEW_INFO*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i], &((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i], sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO));
688 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
689 memcpy((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i].pImageView, ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
690 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700691 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700692 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
693 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
694 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700695 base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
696 total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700697 XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews;
698 *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
699 for (uint32_t i = 0; i < ((XGL_UPDATE_IMAGES*)pNewNode)->count; i++) {
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700700 *pppLocalImageViews[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(*pppLocalImageViews + base_array_size + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700701 memcpy(*pppLocalImageViews[i], ((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
702 }
703 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700704 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700705 pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700706 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
707 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700708 base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count;
709 total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size;
710 XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews;
711 *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size);
712 for (uint32_t i = 0; i < pUBCI->count; i++) {
713 // Set ptr and then copy data into that ptr
714 *pppLocalBufferViews[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(*pppLocalBufferViews + base_array_size + (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * i));
715 memcpy(*pppLocalBufferViews[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));
716 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700717 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700718 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
719 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
720 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700721 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700722 default:
723 // TODO : Flag specific error for this case
724 return NULL;
725 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700726 // Make sure that pNext for the end of shadow copy is NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700727 pNewNode->pNext = NULL;
728 return pNewNode;
729}
730// For given ds, update it's mapping based on pUpdateChain linked-list
731static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
732{
733 SET_NODE* pSet = getSetNode(ds);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700734 LAYOUT_NODE* pLayout = NULL;
735 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI;
736 // TODO : If pCIList is NULL, flag error
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700737 GENERIC_HEADER* pUpdates = pUpdateChain;
738 // Perform all updates
739 while (pUpdates) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700740 pLayout = pSet->pLayouts;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700741 // For each update first find the layout section that it overlaps
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700742 while (pLayout && (pLayout->startIndex > getUpdateIndex(pUpdates))) {
743 pLayout = pLayout->pPriorSetLayout;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700744 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700745 if (!pLayout) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700746 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700747 sprintf(str, "Descriptor Set %p does not have index to match update index %u for update type %s!", ds, getUpdateIndex(pUpdates), string_XGL_STRUCTURE_TYPE(pUpdates->sType));
748 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700749 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700750 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700751 // Next verify that update is correct size
752 if (!validateUpdateSize(pUpdates, pLayout->endIndex)) {
753 char str[48*1024]; // TODO : Keep count of layout CI structs and size this string dynamically based on that count
754 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS} ");
755 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
756 sprintf(str, "Descriptor update type of %s is out of bounds for matching layout w/ CI:\n%s!", string_XGL_STRUCTURE_TYPE(pUpdates->sType), pDSstr);
757 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
758 free(pDSstr);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700759 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700760 else { // TODO : should we skip update on a type mismatch or force it?
Tobin Ehlisefa84162015-02-17 09:54:13 -0700761 // We have the right layout section, now verify that update is of the right type
762 if (!validateUpdateType(pUpdates, pLayout)) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700763 char str[1024];
Tobin Ehlisefa84162015-02-17 09:54:13 -0700764 sprintf(str, "Descriptor update type of %s does not match overlapping layout type!", string_XGL_STRUCTURE_TYPE(pUpdates->sType));
765 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700766 }
767 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700768 // Finally perform the update
769 // TODO : Info message that update successful
770 GENERIC_HEADER* pUpdateInsert = pSet->pUpdateStructs;
771 GENERIC_HEADER* pPrev = pUpdateInsert;
772 // Create new update struct for this set's shadow copy
773 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
774 if (NULL == pNewNode) {
775 char str[1024];
776 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
777 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700778 }
779 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700780 if (!pUpdateInsert) {
781 pSet->pUpdateStructs = pNewNode;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700782 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700783 else {
784 // Find either the existing, matching region, or end of list for initial update chain
Tobin Ehlis8cced212015-02-13 10:26:14 -0700785 // TODO : Need to validate this, I suspect there are holes in this algorithm
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700786 uint32_t totalIndex = 0;
787 while (pUpdateInsert && (getUpdateIndex(pUpdates) != totalIndex)) {
788 totalIndex = getUpdateUpperBound(pUpdates);
789 pPrev = pUpdateInsert;
790 pUpdateInsert = (GENERIC_HEADER*)pUpdateInsert->pNext;
791 }
792 pPrev->pNext = pNewNode;
793 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700794 }
795 }
796 }
797 }
798 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
799 }
800}
801// Free a shadowed update node
Tobin Ehlisefa84162015-02-17 09:54:13 -0700802static void freeShadowUpdateTree(GENERIC_HEADER* pUpdate)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700803{
Tobin Ehlisefa84162015-02-17 09:54:13 -0700804 GENERIC_HEADER* pShadowUpdate = pUpdate;
805 GENERIC_HEADER* pFreeUpdate = pShadowUpdate;
806 while(pShadowUpdate) {
807 pFreeUpdate = pShadowUpdate;
808 pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext;
809 uint32_t index = 0;
810 XGL_UPDATE_SAMPLERS* pUS = NULL;
811 XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
812 XGL_UPDATE_IMAGES* pUI = NULL;
813 XGL_UPDATE_BUFFERS* pUB = NULL;
814 void** ppToFree = NULL;
815 switch (pFreeUpdate->sType)
816 {
817 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
818 pUS = (XGL_UPDATE_SAMPLERS*)pFreeUpdate;
819 if (pUS->pSamplers) {
820 ppToFree = (void**)&pUS->pSamplers;
821 free(*ppToFree);
822 }
823 break;
824 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
825 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pFreeUpdate;
826 for (index = 0; index < pUST->count; index++) {
827 if (pUST->pSamplerImageViews[index].pImageView) {
828 ppToFree = (void**)&pUST->pSamplerImageViews[index].pImageView;
829 free(*ppToFree);
830 }
831 }
832 ppToFree = (void**)&pUST->pSamplerImageViews;
833 free(*ppToFree);
834 break;
835 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
836 pUI = (XGL_UPDATE_IMAGES*)pFreeUpdate;
837 if (pUI->pImageViews) {
838 ppToFree = (void**)&pUI->pImageViews;
839 free(*ppToFree);
840 }
841 break;
842 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
843 pUB = (XGL_UPDATE_BUFFERS*)pFreeUpdate;
844 if (pUB->pBufferViews) {
845 ppToFree = (void**)&pUB->pBufferViews;
846 free(*ppToFree);
847 }
848 break;
849 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
850 break;
851 default:
852 assert(0);
853 break;
854 }
855 free(pFreeUpdate);
856 }
857}
858// Free all DS Regions including their Sets & related sub-structs
859static void freeRegions()
860{
861 REGION_NODE* pRegion = g_pRegionHead;
862 REGION_NODE* pFreeMe = pRegion;
863 while (pRegion) {
864 pFreeMe = pRegion;
865 SET_NODE* pSet = pRegion->pSets;
866 SET_NODE* pFreeSet = pSet;
867 while (pSet) {
868 pFreeSet = pSet;
869 pSet = pSet->pNext;
870 // Freeing layouts handled in freeLayouts() function
871 // Free Update shadow struct tree
872 freeShadowUpdateTree(pFreeSet->pUpdateStructs);
873 free(pFreeSet);
874 }
875 pRegion = pRegion->pNext;
876 if (pFreeMe->createInfo.pTypeCount) {
877 void** ppToFree = (void**)&pFreeMe->createInfo.pTypeCount;
878 free(*ppToFree);
879 }
880 free(pFreeMe);
881 }
882}
883// WARN : Once freeLayouts() called, any layout ptrs in Region/Set data structure will be invalid
884static void freeLayouts()
885{
886 LAYOUT_NODE* pLayout = g_pLayoutHead;
887 LAYOUT_NODE* pFreeLayout = pLayout;
888 while (pLayout) {
889 pFreeLayout = pLayout;
890 GENERIC_HEADER* pTrav = (GENERIC_HEADER*)pLayout->pCreateInfoList;
891 while (pTrav) {
892 void* pToFree = (void*)pTrav;
893 pTrav = (GENERIC_HEADER*)pTrav->pNext;
894 free(pToFree);
895 }
896 pLayout = pLayout->pNext;
897 free(pFreeLayout);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700898 }
899}
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700900// Currently clearing a set is removing all previous updates to that set
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700901// TODO : Validate if this is correct clearing behavior
902static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
903{
904 SET_NODE* pSet = getSetNode(set);
905 if (!pSet) {
906 // TODO : Return error
907 }
908 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700909 freeShadowUpdateTree(pSet->pUpdateStructs);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700910 }
911}
912
913static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
914{
915 REGION_NODE* pRegion = getRegionNode(region);
916 if (!pRegion) {
917 char str[1024];
918 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
919 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
920 }
921 else
922 {
923 // For every set off of this region, clear it
924 SET_NODE* pSet = pRegion->pSets;
925 while (pSet) {
926 clearDescriptorSet(pSet->set);
927 }
928 }
929}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600930
Tobin Ehlis8cced212015-02-13 10:26:14 -0700931// Code here to manage the Cmd buffer LL
932static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700933{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700934 loader_platform_thread_lock_mutex(&globalLock);
935 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
936 while (pCB) {
937 if (cb == pCB->cmdBuffer) {
938 loader_platform_thread_unlock_mutex(&globalLock);
939 return pCB;
940 }
941 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700942 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700943 loader_platform_thread_unlock_mutex(&globalLock);
944 return NULL;
945}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700946// Free all CB Nodes
947static void freeCmdBuffers()
948{
949 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
950 GLOBAL_CB_NODE* pFreeMe = pCB;
951 while (pCB) {
952 pFreeMe = pCB;
953 CMD_NODE* pCmd = pCB->pCmds;
954 CMD_NODE* pFreeCmd = pCmd;
955 while (pCmd) {
956 pFreeCmd = pCmd;
957 pCmd = pCmd->pNext;
958 free(pFreeCmd);
959 }
960 pCB = pCB->pNextGlobalCBNode;
961 free(pFreeMe);
962 }
963}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700964static void addCmd(GLOBAL_CB_NODE* pCB, const CMD_TYPE cmd)
965{
966 CMD_NODE* pCmd = (CMD_NODE*)malloc(sizeof(CMD_NODE));
967 if (pCmd) {
968 // init cmd node and append to end of cmd LL
969 memset(pCmd, 0, sizeof(CMD_NODE));
970 pCB->numCmds++;
971 pCmd->cmdNumber = pCB->numCmds;
972 pCmd->type = cmd;
973 if (!pCB->pCmds) {
974 pCB->pCmds = pCmd;
975 }
976 else {
977 assert(pCB->lastCmd);
978 pCB->lastCmd->pNext = pCmd;
979 }
980 pCB->lastCmd = pCmd;
981 }
982 else {
983 char str[1024];
984 sprintf(str, "Out of memory while attempting to allocate new CMD_NODE for cmdBuffer %p", (void*)pCB->cmdBuffer);
985 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCB->cmdBuffer, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
986 }
987}
988static void resetCB(const XGL_CMD_BUFFER cb)
989{
990 GLOBAL_CB_NODE* pCB = getCBNode(cb);
991 if (pCB) {
992 CMD_NODE* pCur = pCB->pCmds;
993 CMD_NODE* pFreeMe = pCur;
994 while (pCur) {
995 pFreeMe = pCur;
996 pCur = pCur->pNext;
997 free(pFreeMe);
998 }
999 // Reset CB state
1000 GLOBAL_CB_NODE* pSaveNext = pCB->pNextGlobalCBNode;
1001 XGL_FLAGS saveFlags = pCB->flags;
1002 XGL_QUEUE_TYPE saveQT = pCB->queueType;
1003 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
1004 pCB->cmdBuffer = cb;
1005 pCB->flags = saveFlags;
1006 pCB->queueType = saveQT;
1007 pCB->pNextGlobalCBNode = pSaveNext;
1008 pCB->lastVtxBinding = MAX_BINDING;
1009 }
1010}
1011// Set the last bound dynamic state of given type
1012// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
1013static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
1014{
1015 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
1016 if (pCB) {
1017 g_lastCmdBuffer = cmdBuffer;
1018 addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT);
1019 loader_platform_thread_lock_mutex(&globalLock);
1020 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
1021 while (pTrav && (state != pTrav->stateObj)) {
1022 pTrav = pTrav->pNext;
1023 }
1024 if (!pTrav) {
1025 char str[1024];
1026 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1027 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
1028 }
1029 pCB->lastBoundDynamicState[sType] = pTrav;
1030 loader_platform_thread_unlock_mutex(&globalLock);
1031 }
1032 else {
1033 char str[1024];
1034 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
1035 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
1036 }
1037}
Tobin Ehlis8cced212015-02-13 10:26:14 -07001038// Print the last bound Gfx Pipeline
1039static void printPipeline(const XGL_CMD_BUFFER cb)
1040{
1041 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1042 if (pCB) {
1043 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1044 if (!pPipeTrav) {
1045 // nothing to print
1046 }
1047 else {
1048 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
1049 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001050 free(pipeStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001051 }
Tobin Ehlis56a61072014-11-21 08:58:46 -07001052 }
1053}
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001054// Dump subgraph w/ DS info
Tobin Ehlis8cced212015-02-13 10:26:14 -07001055static void dsDumpDot(const XGL_CMD_BUFFER cb, FILE* pOutFile)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001056{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001057 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1058 if (pCB && pCB->lastBoundDescriptorSet) {
1059 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1060 REGION_NODE* pRegion = getRegionNode(pSet->region);
1061 char tmp_str[1024];
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001062 fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n");
1063 sprintf(tmp_str, "Region (%p)", pRegion->region);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001064 char* pGVstr = xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str);
1065 fprintf(pOutFile, "%s", pGVstr);
1066 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001067 fprintf(pOutFile, "subgraph cluster_DescriptorSet\n{\nlabel=\"Descriptor Set (%p)\"\n", pSet->set);
1068 sprintf(tmp_str, "Descriptor Set (%p)", pSet->set);
1069 LAYOUT_NODE* pLayout = pSet->pLayouts;
1070 uint32_t layout_index = 0;
1071 while (pLayout) {
1072 ++layout_index;
1073 sprintf(tmp_str, "LAYOUT%u", layout_index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001074 pGVstr = xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str);
1075 fprintf(pOutFile, "%s", pGVstr);
1076 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001077 pLayout = pLayout->pNext;
1078 if (pLayout) {
1079 fprintf(pOutFile, "\"%s\" -> \"LAYOUT%u\" [];\n", tmp_str, layout_index+1);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001080 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001081 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001082 if (pSet->pUpdateStructs) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001083 pGVstr = dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates");
1084 fprintf(pOutFile, "%s", pGVstr);
1085 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001086 }
1087 fprintf(pOutFile, "}\n");
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001088 fprintf(pOutFile, "}\n");
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001089 pRegion = pRegion->pNext;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001090 }
1091}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001092
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001093// Dump a GraphViz dot file showing the pipeline
Tobin Ehlis8cced212015-02-13 10:26:14 -07001094static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001095{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001096 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1097 if (pCB) {
1098 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1099 if (pPipeTrav) {
1100 FILE* pOutFile;
1101 pOutFile = fopen(outFileName, "w");
1102 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1103 fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001104 char* pGVstr = NULL;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001105 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
1106 if (pCB->lastBoundDynamicState[i]) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001107 pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i));
1108 fprintf(pOutFile, "%s", pGVstr);
1109 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001110 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001111 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001112 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
1113 fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001114 pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD");
1115 fprintf(pOutFile, "%s", pGVstr);
1116 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001117 fprintf(pOutFile, "}\n");
1118 dsDumpDot(cb, pOutFile);
1119 fprintf(pOutFile, "}\n"); // close main graph "g"
1120 fclose(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001121 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001122 }
1123}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001124// Synch up currently bound pipeline settings with DS mappings
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001125// TODO : Update name. We don't really have to "synch" the descriptors anymore and "mapping" is outdated as well.
Tobin Ehlis8cced212015-02-13 10:26:14 -07001126static void synchDSMapping(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001127{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001128 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1129 if (pCB && pCB->lastBoundPipeline) {
1130 // First verify that we have a Node for bound pipeline
1131 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1132 char str[1024];
1133 if (!pPipeTrav) {
1134 sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline);
1135 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
1136 }
1137 else {
1138 // Verify Vtx binding
1139 if (MAX_BINDING != pCB->lastVtxBinding) {
1140 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) {
1141 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
1142 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1143 }
1144 else {
1145 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : ");
1146 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
1147 free(tmpStr);
1148 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001149 }
1150 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001151 }
1152}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001153// Print details of DS config to stdout
Tobin Ehlis8cced212015-02-13 10:26:14 -07001154static void printDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001155{
Tobin Ehlise79df942014-11-18 16:38:08 -07001156 char tmp_str[1024];
1157 char ds_config_str[1024*256] = {0}; // TODO : Currently making this buffer HUGE w/o overrun protection. Need to be smarter, start smaller, and grow as needed.
Tobin Ehlis8cced212015-02-13 10:26:14 -07001158 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1159 if (pCB) {
1160 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1161 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001162 // Print out region details
1163 sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region);
1164 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001165 char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " ");
1166 sprintf(ds_config_str, "%s", pRegionStr);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001167 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001168 free(pRegionStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001169 // Print out set details
1170 char prefix[10];
1171 uint32_t index = 0;
1172 sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set);
1173 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1174 LAYOUT_NODE* pLayout = pSet->pLayouts;
1175 while (pLayout) {
1176 // Print layout details
1177 sprintf(tmp_str, "Layout #%u, (object %p) for DS %p.", index+1, (void*)pLayout->layout, (void*)pSet->set);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001178 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001179 sprintf(prefix, " [L%u] ", index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001180 char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix);
1181 sprintf(ds_config_str, "%s", pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001182 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001183 free(pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001184 pLayout = pLayout->pPriorSetLayout;
1185 index++;
1186 }
1187 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
1188 if (pUpdate) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001189 sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
1190 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1191 sprintf(prefix, " [UC] ");
1192 sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix));
1193 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
1194 // TODO : If there is a "view" associated with this update, print CI for that view
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001195 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001196 else {
1197 sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set);
1198 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1199 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001200 }
1201}
1202
Tobin Ehlisd092d232015-02-13 13:30:07 -07001203static void printCB(const XGL_CMD_BUFFER cb)
1204{
1205 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1206 if (pCB) {
1207 char str[1024];
1208 CMD_NODE* pCmd = pCB->pCmds;
1209 sprintf(str, "Cmds in CB %p", (void*)cb);
1210 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
1211 while (pCmd) {
1212 sprintf(str, " CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type));
1213 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str);
1214 pCmd = pCmd->pNext;
1215 }
1216 }
1217 else {
1218 // Nothing to print
1219 }
1220}
1221
Tobin Ehlis8cced212015-02-13 10:26:14 -07001222static void synchAndDumpDot(const XGL_CMD_BUFFER cb)
Jeremy Hayes668ca052015-01-29 13:03:36 -07001223{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001224 synchDSMapping(cb);
1225 dumpDotFile(cb, "pipeline_dump.dot");
Jeremy Hayes668ca052015-01-29 13:03:36 -07001226}
1227
Tobin Ehlis8cced212015-02-13 10:26:14 -07001228static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001229{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001230 synchDSMapping(cb);
1231 printDSConfig(cb);
1232 printPipeline(cb);
1233 printDynamicState(cb);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001234 static int autoDumpOnce = 1;
1235 if (autoDumpOnce) {
1236 autoDumpOnce = 0;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001237 dumpDotFile(cb, "pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001238 // Convert dot to png if dot available
Ian Elliott81ac44c2015-01-13 17:52:38 -07001239#if defined(_WIN32)
1240// FIXME: NEED WINDOWS EQUIVALENT
1241#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07001242 if(access( "/usr/bin/dot", X_OK) != -1) {
1243 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
1244 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001245#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001246 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001247}
1248
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001249static void initDrawState(void)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001250{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001251 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001252 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001253 strOpt = getLayerOption("DrawStateReportLevel");
1254 if (strOpt != NULL)
1255 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001256
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001257 strOpt = getLayerOption("DrawStateDebugAction");
1258 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001259 g_debugAction = atoi(strOpt);
1260
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001261 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1262 {
1263 strOpt = getLayerOption("DrawStateLogFilename");
1264 if (strOpt)
1265 {
1266 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001267 }
1268 if (g_logFile == NULL)
1269 g_logFile = stdout;
1270 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001271 // initialize Layer dispatch table
1272 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001273 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001274 fpNextGPA = pCurObj->pGPA;
1275 assert(fpNextGPA);
1276
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001277 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1278
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001279 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001280 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001281
1282 if (!globalLockInitialized)
1283 {
1284 // TODO/TBD: Need to delete this mutex sometime. How??? One
1285 // suggestion is to call this during xglCreateInstance(), and then we
1286 // can clean it up during xglDestroyInstance(). However, that requires
1287 // that the layer have per-instance locks. We need to come back and
1288 // address this soon.
1289 loader_platform_thread_create_mutex(&globalLock);
1290 globalLockInitialized = 1;
1291 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001292}
1293
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001294XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1295{
1296 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1297 return result;
1298}
1299
1300XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1301{
1302 XGL_RESULT result = nextTable.DestroyInstance(instance);
1303 return result;
1304}
1305
1306XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1307{
1308 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1309 return result;
1310}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001311
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001312XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001313{
1314 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001315 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001316 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001317 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001318 return result;
1319}
1320
1321XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1322{
1323 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001324 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001325 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001326 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001327 return result;
1328}
1329
1330XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1331{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001332 // Free all the memory
1333 loader_platform_thread_lock_mutex(&globalLock);
1334 freePipelines();
1335 freeSamplers();
1336 freeImages();
1337 freeBuffers();
1338 freeCmdBuffers();
1339 freeDynamicState();
1340 freeRegions();
1341 freeLayouts();
1342 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001343 XGL_RESULT result = nextTable.DestroyDevice(device);
1344 return result;
1345}
1346
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001347XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001348{
1349 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001350 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001351 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001352 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001353 return result;
1354}
1355
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001356XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, size_t maxLayerCount, size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001357{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001358 if (gpu != NULL)
1359 {
1360 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1361 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001362 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001363 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001364 return result;
1365 } else
1366 {
1367 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1368 return XGL_ERROR_INVALID_POINTER;
1369 // This layer compatible with all GPUs
1370 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001371 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001372 return XGL_SUCCESS;
1373 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001374}
1375
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001376XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, uint32_t queueIndex, XGL_QUEUE* pQueue)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001377{
1378 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1379 return result;
1380}
1381
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001382XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001383{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001384 for (uint32_t i=0; i < cmdBufferCount; i++) {
1385 // Validate that cmd buffers have been updated
1386 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001387 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1388 return result;
1389}
1390
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001391XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001392{
1393 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1394 return result;
1395}
1396
1397XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1398{
1399 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1400 return result;
1401}
1402
1403XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1404{
1405 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1406 return result;
1407}
1408
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001409XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1410{
1411 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1412 return result;
1413}
1414
1415XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1416{
1417 XGL_RESULT result = nextTable.FreeMemory(mem);
1418 return result;
1419}
1420
1421XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1422{
1423 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1424 return result;
1425}
1426
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001427XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001428{
1429 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1430 return result;
1431}
1432
1433XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1434{
1435 XGL_RESULT result = nextTable.UnmapMemory(mem);
1436 return result;
1437}
1438
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001439XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const void* pSysMem, size_t memSize, XGL_GPU_MEMORY* pMem)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001440{
1441 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1442 return result;
1443}
1444
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001445XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1446{
1447 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001448 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001449 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001450 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001451 return result;
1452}
1453
1454XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1455{
1456 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1457 return result;
1458}
1459
1460XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1461{
1462 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1463 return result;
1464}
1465
1466XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1467{
1468 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1469 return result;
1470}
1471
1472XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1473{
1474 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1475 return result;
1476}
1477
1478XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1479{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001480 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001481 XGL_RESULT result = nextTable.DestroyObject(object);
1482 return result;
1483}
1484
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001485XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001486{
1487 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1488 return result;
1489}
1490
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001491XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001492{
Jon Ashburned62b412015-01-15 10:39:19 -07001493 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001494 return result;
1495}
1496
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001497XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemoryRange(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_SIZE rangeOffset, XGL_GPU_SIZE rangeSize, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1498{
1499 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1500 return result;
1501}
1502
1503XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindImageMemoryRange(XGL_IMAGE image, uint32_t allocationIdx, const XGL_IMAGE_MEMORY_BIND_INFO* bindInfo, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1504{
1505 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1506 return result;
1507}
1508
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001509XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1510{
1511 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1512 return result;
1513}
1514
1515XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1516{
1517 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1518 return result;
1519}
1520
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001521XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001522{
1523 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1524 return result;
1525}
1526
1527XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1528{
1529 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1530 return result;
1531}
1532
1533XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1534{
1535 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1536 return result;
1537}
1538
1539XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1540{
1541 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1542 return result;
1543}
1544
1545XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1546{
1547 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1548 return result;
1549}
1550
1551XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1552{
1553 XGL_RESULT result = nextTable.GetEventStatus(event);
1554 return result;
1555}
1556
1557XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1558{
1559 XGL_RESULT result = nextTable.SetEvent(event);
1560 return result;
1561}
1562
1563XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1564{
1565 XGL_RESULT result = nextTable.ResetEvent(event);
1566 return result;
1567}
1568
1569XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1570{
1571 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1572 return result;
1573}
1574
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001575XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001576{
1577 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1578 return result;
1579}
1580
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001581XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001582{
1583 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1584 return result;
1585}
1586
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001587XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1588{
1589 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001590 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001591 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001592 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1593 pNewNode->buffer = *pBuffer;
1594 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
1595 pNewNode->pNext = g_pBufferHead;
1596 g_pBufferHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001597 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001598 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001599 return result;
1600}
1601
1602XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1603{
1604 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1605 return result;
1606}
1607
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001608XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1609{
1610 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1611 return result;
1612}
1613
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001614XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1615{
1616 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1617 return result;
1618}
1619
1620XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1621{
1622 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1623 return result;
1624}
1625
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001626XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001627{
1628 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1629 return result;
1630}
1631
1632XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1633{
1634 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001635 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001636 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001637 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
1638 pNewNode->image = *pView;
1639 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1640 pNewNode->pNext = g_pImageHead;
1641 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001642 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001643 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001644 return result;
1645}
1646
1647XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1648{
1649 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1650 return result;
1651}
1652
1653XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1654{
1655 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1656 return result;
1657}
1658
1659XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1660{
1661 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1662 return result;
1663}
1664
1665XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1666{
1667 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1668 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001669 char str[1024];
1670 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1671 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001672 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001673 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001674 if (pTrav) {
1675 while (pTrav->pNext)
1676 pTrav = pTrav->pNext;
1677 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1678 pTrav = pTrav->pNext;
1679 }
1680 else {
1681 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001682 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001683 }
1684 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1685 pTrav->pipeline = *pPipeline;
1686 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001687 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001688 return result;
1689}
1690
1691XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1692{
1693 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1694 return result;
1695}
1696
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001697XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001698{
1699 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1700 return result;
1701}
1702
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001703XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, size_t dataSize, const void* pData, XGL_PIPELINE* pPipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001704{
1705 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1706 return result;
1707}
1708
1709XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1710{
1711 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1712 return result;
1713}
1714
1715XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1716{
1717 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001718 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07001719 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001720 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1721 pNewNode->sampler = *pSampler;
1722 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1723 pNewNode->pNext = g_pSamplerHead;
1724 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001725 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001726 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001727 return result;
1728}
1729
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001730XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(XGL_DEVICE device, XGL_FLAGS stageFlags, const uint32_t* pSetBindPoints, XGL_DESCRIPTOR_SET_LAYOUT priorSetLayout, const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList, XGL_DESCRIPTOR_SET_LAYOUT* pSetLayout)
1731{
1732 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1733 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001734 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
1735 if (NULL == pNewNode) {
1736 char str[1024];
1737 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
1738 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1739 }
1740 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001741 // TODO : API Currently missing a count here that we should multiply by struct size
1742 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8cced212015-02-13 10:26:14 -07001743 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001744 void* pCITrav = NULL;
1745 uint32_t totalCount = 0;
1746 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07001747 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001748 pCITrav = (void*)pSetLayoutInfoList->pNext;
1749 totalCount = pSetLayoutInfoList->count;
1750 }
1751 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
1752 while (pCITrav) {
1753 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
1754 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1755 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1756 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
1757 *ppNext = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
1758 }
1759 if (totalCount > 0) {
1760 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
1761 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
1762 while (pLCI) {
1763 for (uint32_t i = 0; i < pLCI->count; i++) {
1764 pNewNode->pTypes[i] = pLCI->descriptorType;
1765 }
1766 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
1767 }
1768 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001769 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001770 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001771 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07001772 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
1773 assert(i < XGL_NUM_SHADER_STAGE);
1774 if (stage & stageFlags)
1775 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07001776 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07001777 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001778 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001779 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
1780 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001781 if (NULL != priorSetLayout && pPriorNode == NULL) {
1782 char str[1024];
1783 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
1784 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1785 }
1786 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
1787 // Get count for prior layout
1788 pNewNode->startIndex = pPriorNode->endIndex + 1;
1789 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07001790 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001791 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001792 pNewNode->pPriorSetLayout = pPriorNode;
1793 // Put new node at Head of global Layer list
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001794 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001795 g_pLayoutHead = pNewNode;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001796 }
1797 return result;
1798}
1799
1800XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
1801{
1802 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1803 if (XGL_SUCCESS == result) {
1804 if (!g_pRegionHead) {
1805 char str[1024];
1806 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1807 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1808 }
1809 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001810 REGION_NODE* pRegionNode = g_pRegionHead;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001811 if (!pRegionNode) {
1812 char str[1024];
1813 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1814 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1815 }
1816 else {
1817 pRegionNode->updateActive = 1;
1818 }
1819 }
1820 }
1821 return result;
1822}
1823
1824XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
1825{
1826 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1827 if (XGL_SUCCESS == result) {
1828 if (!g_pRegionHead) {
1829 char str[1024];
1830 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1831 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1832 }
1833 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001834 REGION_NODE* pRegionNode = g_pRegionHead;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001835 if (!pRegionNode) {
1836 char str[1024];
1837 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1838 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1839 }
1840 else {
1841 if (!pRegionNode->updateActive) {
1842 char str[1024];
1843 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
1844 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
1845 }
1846 else {
1847 pRegionNode->updateActive = 0;
1848 }
1849 }
1850 }
1851 }
1852 return result;
1853}
1854
1855XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorRegion(XGL_DEVICE device, XGL_DESCRIPTOR_REGION_USAGE regionUsage, uint32_t maxSets, const XGL_DESCRIPTOR_REGION_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_REGION* pDescriptorRegion)
1856{
1857 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1858 if (XGL_SUCCESS == result) {
1859 // Insert this region into Global Region LL at head
1860 char str[1024];
1861 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
1862 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001863 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001864 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001865 if (NULL == pNewNode) {
1866 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001867 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001868 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1869 }
1870 else {
1871 memset(pNewNode, 0, sizeof(REGION_NODE));
1872 pNewNode->pNext = g_pRegionHead;
1873 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001874 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
1875 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
1876 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001877 if (typeCountSize) {
1878 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
1879 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
1880 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
1881 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001882 pNewNode->regionUsage = regionUsage;
1883 pNewNode->updateActive = 0;
1884 pNewNode->maxSets = maxSets;
1885 pNewNode->region = *pDescriptorRegion;
1886 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001887 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001888 }
1889 else {
1890 // Need to do anything if region create fails?
1891 }
1892 return result;
1893}
1894
1895XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
1896{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001897 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001898 if (XGL_SUCCESS == result) {
1899 clearDescriptorRegion(descriptorRegion);
1900 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001901 return result;
1902}
1903
1904XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_DESCRIPTOR_SET_USAGE setUsage, uint32_t count, const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts, XGL_DESCRIPTOR_SET* pDescriptorSets, uint32_t* pCount)
1905{
1906 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001907 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
1908 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
1909 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001910 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001911 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001912 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001913 }
1914 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001915 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001916 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001917 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001918 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001919 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001920 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001921 if (NULL == pNewNode) {
1922 char str[1024];
1923 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001924 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001925 }
1926 else {
1927 memset(pNewNode, 0, sizeof(SET_NODE));
1928 // Insert set at head of Set LL for this region
1929 pNewNode->pNext = pRegionNode->pSets;
1930 pRegionNode->pSets = pNewNode;
1931 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
1932 if (NULL == pLayout) {
1933 char str[1024];
1934 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
1935 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1936 }
1937 pNewNode->pLayouts = pLayout;
1938 pNewNode->region = descriptorRegion;
1939 pNewNode->set = pDescriptorSets[i];
1940 pNewNode->setUsage = setUsage;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001941 // TODO : Make sure to set this correctly
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001942 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001943 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001944 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001945 }
1946 }
1947 return result;
1948}
1949
1950XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
1951{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001952 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001953 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001954 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001955 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
1956}
1957
1958XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
1959{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001960 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001961 char str[1024];
1962 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
1963 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str);
1964 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001965 else {
1966 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
1967 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
1968 }
1969
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001970 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
1971}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001972
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001973XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicViewportState(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_VP_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001974{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001975 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001976 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001977 return result;
1978}
1979
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001980XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicRasterState(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_RS_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001981{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001982 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001983 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001984 return result;
1985}
1986
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001987XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicColorBlendState(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_CB_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001988{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001989 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001990 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001991 return result;
1992}
1993
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001994XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicDepthStencilState(XGL_DEVICE device, const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_DS_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001995{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001996 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001997 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001998 return result;
1999}
2000
2001XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2002{
2003 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002004 if (XGL_SUCCESS == result) {
2005 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
2006 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2007 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2008 g_pCmdBufferHead = pCB;
2009 pCB->cmdBuffer = *pCmdBuffer;
2010 pCB->flags = pCreateInfo->flags;
2011 pCB->queueType = pCreateInfo->queueType;
2012 pCB->lastVtxBinding = MAX_BINDING;
2013 g_lastCmdBuffer = *pCmdBuffer;
2014 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002015 return result;
2016}
2017
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002018XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002019{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002020 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002021 if (XGL_SUCCESS == result) {
2022 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlisd092d232015-02-13 13:30:07 -07002023 if (CB_NEW != pCB->state)
2024 resetCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002025 pCB->state = CB_UPDATE_ACTIVE;
2026 g_lastCmdBuffer = cmdBuffer;
2027 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002028 return result;
2029}
2030
2031XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2032{
2033 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002034 if (XGL_SUCCESS == result) {
2035 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2036 pCB->state = CB_UPDATE_COMPLETE;
2037 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002038 printCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002039 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002040 return result;
2041}
2042
2043XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2044{
2045 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002046 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002047 resetCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002048 g_lastCmdBuffer = cmdBuffer;
2049 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002050 return result;
2051}
2052
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002053XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002054{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002055 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2056 if (pCB) {
2057 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002058 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002059 if (getPipeline(pipeline)) {
2060 pCB->lastBoundPipeline = pipeline;
2061 }
2062 else {
2063 char str[1024];
2064 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2065 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2066 }
2067 synchAndDumpDot(cmdBuffer);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002068 }
2069 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002070 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002071 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2072 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002073 }
2074 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2075}
2076
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002077XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002078{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002079 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2080 if (pCB) {
2081 // TODO : Handle storing Pipeline Deltas to cmd buffer here
2082 g_lastCmdBuffer = cmdBuffer;
2083 synchAndDumpDot(cmdBuffer);
2084 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2085 }
2086 else {
2087 char str[1024];
2088 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2089 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2090 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002091 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2092}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002093
2094XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2095{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002096 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
2097 synchAndDumpDot(cmdBuffer);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002098 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2099}
2100
2101XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2102{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002103 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2104 if (pCB) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002105 g_lastCmdBuffer = cmdBuffer;
2106 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002107 if (getSetNode(descriptorSet)) {
2108 if (dsUpdateActive(descriptorSet)) {
2109 // TODO : Not sure if it's valid to made this check here. May need to make at QueueSubmit time
2110 char str[1024];
2111 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2112 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
2113 }
2114 loader_platform_thread_lock_mutex(&globalLock);
2115 pCB->lastBoundDescriptorSet = descriptorSet;
2116 loader_platform_thread_unlock_mutex(&globalLock);
2117 synchAndDumpDot(cmdBuffer);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002118 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002119 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2120 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002121 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002122 else {
2123 char str[1024];
2124 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2125 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2126 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002127 }
2128 else {
2129 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002130 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2131 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002132 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002133 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2134}
2135
2136XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2137{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002138 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2139 if (pCB) {
2140 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002141 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002142 // TODO : Track idxBuffer binding
2143 }
2144 else {
2145 char str[1024];
2146 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2147 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2148 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002149 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2150}
2151
2152XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding)
Chia-I Wu3b04af52014-11-08 10:48:20 +08002153{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002154 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2155 if (pCB) {
2156 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002157 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002158 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002159 }
2160 else {
2161 char str[1024];
2162 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2163 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2164 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002165 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002166}
2167
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002168XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002169{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002170 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2171 if (pCB) {
2172 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002173 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002174 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002175 char str[1024];
2176 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2177 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2178 synchAndPrintDSConfig(cmdBuffer);
2179 }
2180 else {
2181 char str[1024];
2182 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2183 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2184 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002185 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2186}
2187
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002188XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002189{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002190 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2191 if (pCB) {
2192 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002193 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002194 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002195 char str[1024];
2196 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2197 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2198 synchAndPrintDSConfig(cmdBuffer);
2199 }
2200 else {
2201 char str[1024];
2202 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2203 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2204 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002205 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2206}
2207
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002208XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002209{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002210 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2211 if (pCB) {
2212 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002213 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002214 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002215 char str[1024];
2216 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2217 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2218 synchAndPrintDSConfig(cmdBuffer);
2219 }
2220 else {
2221 char str[1024];
2222 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2223 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2224 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002225 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002226}
2227
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002228XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002229{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002230 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2231 if (pCB) {
2232 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002233 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002234 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002235 char str[1024];
2236 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2237 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2238 synchAndPrintDSConfig(cmdBuffer);
2239 }
2240 else {
2241 char str[1024];
2242 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2243 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2244 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002245 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002246}
2247
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002248XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002249{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002250 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2251 if (pCB) {
2252 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002253 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002254 }
2255 else {
2256 char str[1024];
2257 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2258 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2259 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002260 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2261}
2262
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002263XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002264{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002265 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2266 if (pCB) {
2267 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002268 addCmd(pCB, CMD_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002269 }
2270 else {
2271 char str[1024];
2272 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2273 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2274 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002275 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002276}
2277
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002278XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002279{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002280 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2281 if (pCB) {
2282 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002283 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002284 }
2285 else {
2286 char str[1024];
2287 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2288 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2289 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002290 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002291}
2292
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002293XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t regionCount, const XGL_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002294{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002295 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2296 if (pCB) {
2297 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002298 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002299 }
2300 else {
2301 char str[1024];
2302 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2303 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2304 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002305 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2306}
2307
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002308XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_IMAGE destImage, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002309{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002310 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2311 if (pCB) {
2312 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002313 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002314 }
2315 else {
2316 char str[1024];
2317 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2318 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2319 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002320 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002321}
2322
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002323XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002324{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002325 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2326 if (pCB) {
2327 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002328 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002329 }
2330 else {
2331 char str[1024];
2332 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2333 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2334 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002335 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002336}
2337
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002338XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002339{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002340 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2341 if (pCB) {
2342 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002343 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002344 }
2345 else {
2346 char str[1024];
2347 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2348 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2349 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002350 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002351}
2352
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002353XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2354{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002355 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2356 if (pCB) {
2357 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002358 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002359 }
2360 else {
2361 char str[1024];
2362 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2363 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2364 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002365 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2366}
2367
2368XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2369{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002370 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2371 if (pCB) {
2372 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002373 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002374 }
2375 else {
2376 char str[1024];
2377 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2378 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2379 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002380 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2381}
2382
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002383XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const float color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002384{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002385 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2386 if (pCB) {
2387 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002388 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002389 }
2390 else {
2391 char str[1024];
2392 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2393 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2394 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002395 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2396}
2397
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002398XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const uint32_t color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002399{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002400 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2401 if (pCB) {
2402 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002403 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002404 }
2405 else {
2406 char str[1024];
2407 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2408 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2409 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002410 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2411}
2412
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002413XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, float depth, uint32_t stencil, uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002414{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002415 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2416 if (pCB) {
2417 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002418 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002419 }
2420 else {
2421 char str[1024];
2422 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2423 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2424 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002425 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2426}
2427
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002428XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002429{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002430 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2431 if (pCB) {
2432 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002433 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002434 }
2435 else {
2436 char str[1024];
2437 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2438 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2439 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002440 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2441}
2442
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002443XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002444{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002445 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2446 if (pCB) {
2447 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002448 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002449 }
2450 else {
2451 char str[1024];
2452 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2453 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2454 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002455 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002456}
2457
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002458XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002459{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002460 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2461 if (pCB) {
2462 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002463 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002464 }
2465 else {
2466 char str[1024];
2467 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2468 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2469 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002470 nextTable.CmdResetEvent(cmdBuffer, event);
2471}
2472
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002473XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002474{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002475 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2476 if (pCB) {
2477 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002478 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002479 }
2480 else {
2481 char str[1024];
2482 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2483 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2484 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002485 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2486}
2487
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002488XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002489{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002490 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2491 if (pCB) {
2492 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002493 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002494 }
2495 else {
2496 char str[1024];
2497 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2498 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2499 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002500 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2501}
2502
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002503XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002504{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002505 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2506 if (pCB) {
2507 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002508 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002509 }
2510 else {
2511 char str[1024];
2512 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2513 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2514 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002515 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2516}
2517
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002518XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002519{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002520 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2521 if (pCB) {
2522 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002523 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002524 }
2525 else {
2526 char str[1024];
2527 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2528 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2529 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002530 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2531}
2532
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002533XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002534{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002535 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2536 if (pCB) {
2537 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002538 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002539 }
2540 else {
2541 char str[1024];
2542 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2543 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2544 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002545 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2546}
2547
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002548XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002549{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002550 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2551 if (pCB) {
2552 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002553 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002554 }
2555 else {
2556 char str[1024];
2557 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2558 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2559 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002560 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002561}
2562
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002563XGL_LAYER_EXPORT void XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002564{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002565 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2566 if (pCB) {
2567 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002568 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002569 }
2570 else {
2571 char str[1024];
2572 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2573 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2574 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002575 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2576}
2577
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002578XGL_LAYER_EXPORT void XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER srcBuffer, XGL_GPU_SIZE srcOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002579{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002580 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2581 if (pCB) {
2582 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002583 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002584 }
2585 else {
2586 char str[1024];
2587 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2588 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2589 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002590 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002591}
2592
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002593XGL_LAYER_EXPORT void XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002594{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002595 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2596 if (pCB) {
2597 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002598 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002599 }
2600 else {
2601 char str[1024];
2602 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2603 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2604 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002605 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2606}
2607
2608XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2609{
2610 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
2611 return result;
2612}
2613
2614XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
2615{
2616 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
2617 return result;
2618}
2619
2620XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2621{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002622 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2623 if (pCB) {
2624 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002625 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002626 }
2627 else {
2628 char str[1024];
2629 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2630 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2631 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002632 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
2633}
2634
2635XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2636{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002637 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2638 if (pCB) {
2639 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002640 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002641 }
2642 else {
2643 char str[1024];
2644 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2645 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2646 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002647 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002648}
2649
2650XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
2651{
2652 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
2653 return result;
2654}
2655
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002656XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002657{
Tobin Ehlise79df942014-11-18 16:38:08 -07002658 // This layer intercepts callbacks
2659 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
2660 if (!pNewDbgFuncNode)
2661 return XGL_ERROR_OUT_OF_MEMORY;
2662 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2663 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002664 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2665 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002666 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
2667 return result;
2668}
2669
2670XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
2671{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002672 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07002673 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
2674 while (pTrav) {
2675 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
2676 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002677 if (g_pDbgFunctionHead == pTrav)
2678 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07002679 free(pTrav);
2680 break;
2681 }
2682 pPrev = pTrav;
2683 pTrav = pTrav->pNext;
2684 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002685 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2686 return result;
2687}
2688
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002689XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002690{
2691 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2692 return result;
2693}
2694
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002695XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002696{
2697 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2698 return result;
2699}
2700
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002701XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002702{
2703 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2704 return result;
2705}
2706
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002707XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002708{
2709 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2710 return result;
2711}
2712
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002713XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002714{
2715 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2716}
2717
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002718XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002719{
2720 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2721}
2722
Ian Elliott81ac44c2015-01-13 17:52:38 -07002723#if defined(WIN32)
2724// FIXME: NEED WINDOWS EQUIVALENT
2725#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002726XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2727{
2728 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002729 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002730 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002731 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002732 return result;
2733}
2734
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002735XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, uint64_t* pMsc)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002736{
Chia-I Wu6204f342014-11-07 13:33:45 +08002737 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002738 return result;
2739}
2740
2741XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11CreatePresentableImage(XGL_DEVICE device, const XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
2742{
2743 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
2744 return result;
2745}
2746
2747XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2748{
2749 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2750 return result;
2751}
Ian Elliott81ac44c2015-01-13 17:52:38 -07002752#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07002753// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002754void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002755{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002756 // TODO : Currently just setting cmdBuffer based on global var
2757 dumpDotFile(g_lastCmdBuffer, outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002758}
2759
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002760void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07002761{
Ian Elliott81ac44c2015-01-13 17:52:38 -07002762#if defined(_WIN32)
2763// FIXME: NEED WINDOWS EQUIVALENT
2764 char str[1024];
2765 sprintf(str, "Cannot execute dot program yet on Windows.");
2766 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2767#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002768 char dotExe[32] = "/usr/bin/dot";
2769 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07002770 dumpDotFile(g_lastCmdBuffer, "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07002771 char dotCmd[1024];
2772 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
2773 system(dotCmd);
2774 remove("/tmp/tmp.dot");
2775 }
2776 else {
2777 char str[1024];
2778 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
2779 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2780 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07002781#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002782}
2783
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002784XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002785{
2786 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08002787 void *addr;
2788
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002789 if (gpu == NULL)
2790 return NULL;
2791 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002792 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002793
Chia-I Wu706533e2015-01-05 13:18:57 +08002794 addr = layer_intercept_proc(funcName);
2795 if (addr)
2796 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002797 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002798 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002799 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07002800 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002801 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002802 if (gpuw->pGPA == NULL)
2803 return NULL;
2804 return gpuw->pGPA(gpuw->nextObject, funcName);
2805 }
2806}