blob: e4c06a7f67145aa3f659d28b83a35baf20429f85 [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);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -070042// TODO : This can be much smarter, using separate locks for separate global data
Ian Elliott81ac44c2015-01-13 17:52:38 -070043static int globalLockInitialized = 0;
44static loader_platform_thread_mutex globalLock;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -070045#define ALLOC_DEBUG 0
46#if ALLOC_DEBUG
47static uint64_t g_alloc_count = 0;
48static uint64_t g_free_count = 0;
49#endif
Tobin Ehlis45662712015-02-23 09:06:28 -070050#define MAX_TID 513
51static loader_platform_thread_id tidMapping[MAX_TID] = {0};
52static uint32_t g_maxTID = 0;
53// Map actual TID to an index value and return that index
54// This keeps TIDs in range from 0-MAX_TID and simplifies compares between runs
55static uint32_t getTIDIndex() {
56 loader_platform_thread_id tid = loader_platform_get_thread_id();
57 for (uint32_t i = 0; i < g_maxTID; i++) {
58 if (tid == tidMapping[i])
59 return i;
60 }
61 // Don't yet have mapping, set it and return newly set index
62 uint32_t retVal = (uint32_t) g_maxTID;
63 tidMapping[g_maxTID++] = tid;
64 assert(g_maxTID < MAX_TID);
65 return retVal;
66}
Tobin Ehlis26092022014-11-20 09:49:17 -070067// Return the size of the underlying struct based on struct type
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060068static size_t sTypeStructSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis26092022014-11-20 09:49:17 -070069{
70 switch (sType)
71 {
72 case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
73 return sizeof(XGL_APPLICATION_INFO);
74 case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
75 return sizeof(XGL_DEVICE_CREATE_INFO);
76 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
77 return sizeof(XGL_MEMORY_ALLOC_INFO);
78 case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
79 return sizeof(XGL_MEMORY_OPEN_INFO);
80 case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
81 return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070082 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
83 return sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070084 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
85 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070086 case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
87 return sizeof(XGL_EVENT_WAIT_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070088 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
89 return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
90 case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
91 return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
92 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
93 return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
94 case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
95 return sizeof(XGL_SHADER_CREATE_INFO);
96 case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
97 return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
98 case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
99 return sizeof(XGL_SAMPLER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700100 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
101 return sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
102 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
103 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
104 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
105 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
106 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
107 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
108 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
109 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700110 case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
111 return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
112 case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
113 return sizeof(XGL_EVENT_CREATE_INFO);
114 case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
115 return sizeof(XGL_FENCE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600116 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700117 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600118 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700119 return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
120 case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
121 return sizeof(XGL_QUERY_POOL_CREATE_INFO);
122 case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
123 return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
124 case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
125 return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700126 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
127 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700128 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
129 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700130 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
131 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700132 case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
133 return sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700134 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
135 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
136 case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
137 return sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700138 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
139 return sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700140 case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
141 return sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
142 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
143 return sizeof(XGL_IMAGE_CREATE_INFO);
144 case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
145 return sizeof(XGL_BUFFER_CREATE_INFO);
146 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
147 return sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
148 case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
149 return sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
150 case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
151 return sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
152 case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
153 return sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
154 case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
155 return sizeof(XGL_RENDER_PASS_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700156 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
157 return sizeof(XGL_LAYER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700158 case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
159 return sizeof(XGL_PIPELINE_BARRIER);
160 case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
161 return sizeof(XGL_MEMORY_BARRIER);
162 case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
163 return sizeof(XGL_BUFFER_MEMORY_BARRIER);
164 case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
165 return sizeof(XGL_IMAGE_MEMORY_BARRIER);
166 case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
167 return sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
168 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
169 return sizeof(XGL_UPDATE_SAMPLERS);
170 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
171 return sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
172 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
173 return sizeof(XGL_UPDATE_IMAGES);
174 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
175 return sizeof(XGL_UPDATE_BUFFERS);
176 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
177 return sizeof(XGL_UPDATE_AS_COPY);
178 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
179 return sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
180 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
181 return sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700182 default:
183 return 0;
184 }
185}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700186// Return the size of the underlying struct based on sType
187static size_t dynStateCreateInfoSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700188{
189 switch (sType)
190 {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700191 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
192 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
193 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
194 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
195 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
196 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
197 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
198 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700199 default:
200 return 0;
201 }
202}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700203// Return a string representation of CMD_TYPE enum
204static char* cmdTypeToString(CMD_TYPE cmd)
205{
206 switch (cmd)
207 {
208 case CMD_BINDPIPELINE:
209 return "CMD_BINDPIPELINE";
210 case CMD_BINDPIPELINEDELTA:
211 return "CMD_BINDPIPELINEDELTA";
212 case CMD_BINDDYNAMICSTATEOBJECT:
213 return "CMD_BINDDYNAMICSTATEOBJECT";
214 case CMD_BINDDESCRIPTORSET:
215 return "CMD_BINDDESCRIPTORSET";
216 case CMD_BINDINDEXBUFFER:
217 return "CMD_BINDINDEXBUFFER";
218 case CMD_BINDVERTEXBUFFER:
219 return "CMD_BINDVERTEXBUFFER";
220 case CMD_DRAW:
221 return "CMD_DRAW";
222 case CMD_DRAWINDEXED:
223 return "CMD_DRAWINDEXED";
224 case CMD_DRAWINDIRECT:
225 return "CMD_DRAWINDIRECT";
226 case CMD_DRAWINDEXEDINDIRECT:
227 return "CMD_DRAWINDEXEDINDIRECT";
228 case CMD_DISPATCH:
229 return "CMD_DISPATCH";
230 case CMD_DISPATCHINDIRECT:
231 return "CMD_DISPATCHINDIRECT";
232 case CMD_COPYBUFFER:
233 return "CMD_COPYBUFFER";
234 case CMD_COPYIMAGE:
235 return "CMD_COPYIMAGE";
236 case CMD_COPYBUFFERTOIMAGE:
237 return "CMD_COPYBUFFERTOIMAGE";
238 case CMD_COPYIMAGETOBUFFER:
239 return "CMD_COPYIMAGETOBUFFER";
240 case CMD_CLONEIMAGEDATA:
241 return "CMD_CLONEIMAGEDATA";
242 case CMD_UPDATEBUFFER:
243 return "CMD_UPDATEBUFFER";
244 case CMD_FILLBUFFER:
245 return "CMD_FILLBUFFER";
246 case CMD_CLEARCOLORIMAGE:
247 return "CMD_CLEARCOLORIMAGE";
248 case CMD_CLEARCOLORIMAGERAW:
249 return "CMD_CLEARCOLORIMAGERAW";
250 case CMD_CLEARDEPTHSTENCIL:
251 return "CMD_CLEARDEPTHSTENCIL";
252 case CMD_RESOLVEIMAGE:
253 return "CMD_RESOLVEIMAGE";
254 case CMD_SETEVENT:
255 return "CMD_SETEVENT";
256 case CMD_RESETEVENT:
257 return "CMD_RESETEVENT";
258 case CMD_WAITEVENTS:
259 return "CMD_WAITEVENTS";
260 case CMD_PIPELINEBARRIER:
261 return "CMD_PIPELINEBARRIER";
262 case CMD_BEGINQUERY:
263 return "CMD_BEGINQUERY";
264 case CMD_ENDQUERY:
265 return "CMD_ENDQUERY";
266 case CMD_RESETQUERYPOOL:
267 return "CMD_RESETQUERYPOOL";
268 case CMD_WRITETIMESTAMP:
269 return "CMD_WRITETIMESTAMP";
270 case CMD_INITATOMICCOUNTERS:
271 return "CMD_INITATOMICCOUNTERS";
272 case CMD_LOADATOMICCOUNTERS:
273 return "CMD_LOADATOMICCOUNTERS";
274 case CMD_SAVEATOMICCOUNTERS:
275 return "CMD_SAVEATOMICCOUNTERS";
276 case CMD_BEGINRENDERPASS:
277 return "CMD_BEGINRENDERPASS";
278 case CMD_ENDRENDERPASS:
279 return "CMD_ENDRENDERPASS";
280 default:
281 return "UNKNOWN";
282 }
283}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600284// Block of code at start here for managing/tracking Pipeline state that this layer cares about
285// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700286#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600287#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600288
Tobin Ehlis8cced212015-02-13 10:26:14 -0700289static uint64_t g_drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
290
Tobin Ehlis56a61072014-11-21 08:58:46 -0700291// 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 -0700292// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
293// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis8cced212015-02-13 10:26:14 -0700294static PIPELINE_NODE* g_pPipelineHead = NULL;
295static SAMPLER_NODE* g_pSamplerHead = NULL;
296static IMAGE_NODE* g_pImageHead = NULL;
297static BUFFER_NODE* g_pBufferHead = NULL;
298static GLOBAL_CB_NODE* g_pCmdBufferHead = NULL;
Tobin Ehlis45662712015-02-23 09:06:28 -0700299static XGL_CMD_BUFFER g_lastCmdBuffer[MAX_TID] = {NULL};
Tobin Ehlis8cced212015-02-13 10:26:14 -0700300#define MAX_BINDING 0xFFFFFFFF // Default vtxBinding value in CB Node to identify if no vtxBinding set
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600301
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700302static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
Tobin Ehlis56a61072014-11-21 08:58:46 -0700303
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700304static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700305{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700306 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700307 // Insert new node at head of appropriate LL
308 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700309#if ALLOC_DEBUG
310 printf("Alloc1 #%lu pStateNode addr(%p)\n", ++g_alloc_count, (void*)pStateNode);
311#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700312 pStateNode->pNext = g_pDynamicStateHead[bindPoint];
313 g_pDynamicStateHead[bindPoint] = pStateNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700314 pStateNode->stateObj = state;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700315 pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700316#if ALLOC_DEBUG
317 printf("Alloc2 #%lu pStateNode->pCreateInfo addr(%p)\n", ++g_alloc_count, (void*)pStateNode->pCreateInfo);
318#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700319 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700320 // VP has embedded ptr so need to handle that as special case
321 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pCreateInfo->sType) {
322 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pStateNode->pCreateInfo;
323 XGL_VIEWPORT** ppViewports = (XGL_VIEWPORT**)&pVPCI->pViewports;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700324 size_t vpSize = sizeof(XGL_VIEWPORT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700325 if (vpSize) {
326 *ppViewports = (XGL_VIEWPORT*)malloc(vpSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700327#if ALLOC_DEBUG
328 printf("Alloc3 #%lu *ppViewports addr(%p)\n", ++g_alloc_count, (void*)*ppViewports);
329#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700330 memcpy(*ppViewports, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pViewports, vpSize);
331 }
332 XGL_RECT** ppScissors = (XGL_RECT**)&pVPCI->pScissors;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700333 size_t scSize = sizeof(XGL_RECT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700334 if (scSize) {
335 *ppScissors = (XGL_RECT*)malloc(scSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700336#if ALLOC_DEBUG
337 printf("Alloc4 #%lu *ppScissors addr(%p)\n", ++g_alloc_count, (void*)*ppScissors);
338#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700339 memcpy(*ppScissors, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pScissors, scSize);
340 }
341 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700342 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700343}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700344// Free all allocated nodes for Dynamic State objs
345static void freeDynamicState()
346{
347 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
348 DYNAMIC_STATE_NODE* pStateNode = g_pDynamicStateHead[i];
349 DYNAMIC_STATE_NODE* pFreeMe = pStateNode;
350 while (pStateNode) {
351 pFreeMe = pStateNode;
352 pStateNode = pStateNode->pNext;
353 assert(pFreeMe->pCreateInfo);
354 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pFreeMe->pCreateInfo->sType) {
355 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pFreeMe->pCreateInfo;
356 if (pVPCI->pViewports) {
357 void** ppToFree = (void**)&pVPCI->pViewports;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700358#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700359 printf("Free3 #%lu pViewports addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700360#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700361 free(*ppToFree);
362 }
363 if (pVPCI->pScissors) {
364 void** ppToFree = (void**)&pVPCI->pScissors;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700365#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700366 printf("Free4 #%lu pScissors addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700367#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700368 free(*ppToFree);
369 }
370 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700371#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700372 printf("Free2 #%lu pStateNode->CreateInfo addr(%p)\n", ++g_free_count, (void*)pFreeMe->pCreateInfo);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700373#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700374 free(pFreeMe->pCreateInfo);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700375#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700376 printf("Free1 #%lu pStateNode addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700377#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700378 free(pFreeMe);
379 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700380 g_pDynamicStateHead[i] = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700381 }
382}
383// Free all sampler nodes
384static void freeSamplers()
385{
386 SAMPLER_NODE* pSampler = g_pSamplerHead;
387 SAMPLER_NODE* pFreeMe = pSampler;
388 while (pSampler) {
389 pFreeMe = pSampler;
390 pSampler = pSampler->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700391#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700392 printf("Free25 #%lu pSampler addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700393#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700394 free(pFreeMe);
395 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700396 g_pSamplerHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700397}
Tobin Ehlis59d32c42015-02-24 09:16:47 -0700398static XGL_IMAGE_VIEW_CREATE_INFO* getImageViewCreateInfo(XGL_IMAGE_VIEW view)
399{
400 loader_platform_thread_lock_mutex(&globalLock);
401 IMAGE_NODE* pTrav = g_pImageHead;
402 while (pTrav) {
403 if (view == pTrav->image) {
404 loader_platform_thread_unlock_mutex(&globalLock);
405 return &pTrav->createInfo;
406 }
407 pTrav = pTrav->pNext;
408 }
409 loader_platform_thread_unlock_mutex(&globalLock);
410 return NULL;
411}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700412// Free all image nodes
413static void freeImages()
414{
415 IMAGE_NODE* pImage = g_pImageHead;
416 IMAGE_NODE* pFreeMe = pImage;
417 while (pImage) {
418 pFreeMe = pImage;
419 pImage = pImage->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700420#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700421 printf("Free22 #%lu pImage addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700422#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700423 free(pFreeMe);
424 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700425 g_pImageHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700426}
Tobin Ehlis59d32c42015-02-24 09:16:47 -0700427static XGL_BUFFER_VIEW_CREATE_INFO* getBufferViewCreateInfo(XGL_BUFFER_VIEW view)
428{
429 loader_platform_thread_lock_mutex(&globalLock);
430 BUFFER_NODE* pTrav = g_pBufferHead;
431 while (pTrav) {
432 if (view == pTrav->buffer) {
433 loader_platform_thread_unlock_mutex(&globalLock);
434 return &pTrav->createInfo;
435 }
436 pTrav = pTrav->pNext;
437 }
438 loader_platform_thread_unlock_mutex(&globalLock);
439 return NULL;
440}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700441// Free all buffer nodes
442static void freeBuffers()
443{
444 BUFFER_NODE* pBuffer = g_pBufferHead;
445 BUFFER_NODE* pFreeMe = pBuffer;
446 while (pBuffer) {
447 pFreeMe = pBuffer;
448 pBuffer = pBuffer->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700449#if ALLOC_DEBUG
450 printf("Free21 #%lu pBuffer addr(%p)\n", ++g_free_count, (void*)pFreeMe);
451#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700452 free(pFreeMe);
453 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700454 g_pBufferHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700455}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700456static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700457// Print the last bound dynamic state
Tobin Ehlis8cced212015-02-13 10:26:14 -0700458static void printDynamicState(const XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700459{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700460 GLOBAL_CB_NODE* pCB = getCBNode(cb);
461 if (pCB) {
462 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700463 char str[4*1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -0700464 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
465 if (pCB->lastBoundDynamicState[i]) {
466 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pCB->lastBoundDynamicState[i]->stateObj);
467 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
468 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pCB->lastBoundDynamicState[i]->pCreateInfo, " "));
469 break;
470 }
471 else {
472 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
473 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
474 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700475 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700476 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700477 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700478 else {
479 char str[1024];
480 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cb);
481 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
482 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700483}
484// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600485static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
486{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700487 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700488 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600489 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700490 if (pTrav->pipeline == pipeline) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700491 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600492 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700493 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600494 pTrav = pTrav->pNext;
495 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700496 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600497 return NULL;
498}
499
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700500// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
501static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
502{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700503 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700504 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700505 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700506 if (sampler == pTrav->sampler) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700507 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700508 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700509 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700510 pTrav = pTrav->pNext;
511 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700512 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700513 return NULL;
514}
515
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600516// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700517// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600518static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
519{
Tobin Ehlis26092022014-11-20 09:49:17 -0700520 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700521 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700522#if ALLOC_DEBUG
523 printf("Alloc5 #%lu pPipeline->pCreateTree addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pCreateTree);
524#endif
Tobin Ehlis26092022014-11-20 09:49:17 -0700525 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700526 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
527 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600528 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700529 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700530 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700531#if ALLOC_DEBUG
532 printf("Alloc6 #%lu pShadowTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pShadowTrav->pNext);
533#endif
Tobin Ehlis26092022014-11-20 09:49:17 -0700534 // Typically pNext is const so have to cast to avoid warning when we modify it here
535 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700536 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
537 // Special copy of Vtx info as it has embedded array
538 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700539 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pShadowTrav;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700540 pPipeline->vtxBindingCount = pVICI->bindingCount;
541 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700542 if (allocSize) {
543 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700544#if ALLOC_DEBUG
545 printf("Alloc7 #%lu pPipeline->pVertexBindingDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexBindingDescriptions);
546#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700547 memcpy(pPipeline->pVertexBindingDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
548 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700549 pPipeline->vtxAttributeCount = pVICI->attributeCount;
550 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700551 if (allocSize) {
552 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700553#if ALLOC_DEBUG
554 printf("Alloc8 #%lu pPipeline->pVertexAttributeDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexAttributeDescriptions);
555#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700556 memcpy(pPipeline->pVertexAttributeDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
557 }
558 }
559 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pTrav->sType) {
560 // Special copy of CB state as it has embedded array
561 XGL_PIPELINE_CB_STATE_CREATE_INFO *pCBCI = (XGL_PIPELINE_CB_STATE_CREATE_INFO*)pShadowTrav;
562 pPipeline->attachmentCount = pCBCI->attachmentCount;
563 uint32_t allocSize = pPipeline->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE);
564 if (allocSize) {
565 pPipeline->pAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700566#if ALLOC_DEBUG
567 printf("Alloc9 #%lu pPipeline->pAttachments addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pAttachments);
568#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700569 XGL_PIPELINE_CB_ATTACHMENT_STATE** ppAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE**)&pCBCI->pAttachments;
570 *ppAttachments = pPipeline->pAttachments;
571 memcpy(pPipeline->pAttachments, ((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pTrav)->pAttachments, allocSize);
572 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700573 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700574 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600575 }
576}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700577// Free the Pipeline nodes
578static void freePipelines()
579{
580 PIPELINE_NODE* pPipeline = g_pPipelineHead;
581 PIPELINE_NODE* pFreeMe = pPipeline;
582 while (pPipeline) {
583 pFreeMe = pPipeline;
584 GENERIC_HEADER* pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
585 GENERIC_HEADER* pShadowFree = pShadowTrav;
586 while (pShadowTrav) {
587 pShadowFree = pShadowTrav;
588 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
589 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pShadowFree->sType) {
590 // Free the vtx data shadowed directly into pPipeline node
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700591 if (pFreeMe->pVertexBindingDescriptions) {
592#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700593 printf("Free7 #%lu pVertexBindingDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexBindingDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700594#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700595 free(pFreeMe->pVertexBindingDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700596 }
597 if (pFreeMe->pVertexAttributeDescriptions) {
598#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700599 printf("Free8 #%lu pVertexAttributeDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexAttributeDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700600#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700601 free(pFreeMe->pVertexAttributeDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700602 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700603 }
604 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pShadowFree->sType) {
605 // Free attachment data shadowed into pPipeline node
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700606 if (pFreeMe->pAttachments) {
607#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700608 printf("Free9 #%lu pAttachments addr(%p)\n", ++g_free_count, (void*)pFreeMe->pAttachments);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700609#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700610 free(pFreeMe->pAttachments);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700611 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700612 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700613#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700614 printf("Free5 & Free6 #%lu pShadowNode addr(%p)\n", ++g_free_count, (void*)pShadowFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700615#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700616 free(pShadowFree);
617 }
618 pPipeline = pPipeline->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700619#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700620 printf("Free23 & Free24 #%lu pPipeline addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700621#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700622 free(pFreeMe);
623 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700624 g_pPipelineHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700625}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600626// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600627
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700628// ptr to HEAD of LL of DS Regions
629static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700630// ptr to HEAD of LL of top-level Layouts
631static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700632
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700633// Return Region node ptr for specified region or else NULL
634static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
635{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700636 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700637 REGION_NODE* pTrav = g_pRegionHead;
638 while (pTrav) {
639 if (pTrav->region == region) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700640 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700641 return pTrav;
642 }
643 pTrav = pTrav->pNext;
644 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700645 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700646 return NULL;
647}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700648// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700649static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700650{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700651 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700652 REGION_NODE* pTrav = g_pRegionHead;
653 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700654 SET_NODE* pSet = pTrav->pSets;
655 while (pSet) {
656 if (pSet->set == set) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700657 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700658 return pSet;
659 }
660 pSet = pSet->pNext;
661 }
662 pTrav = pTrav->pNext;
663 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700664 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700665 return NULL;
666}
667
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700668// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorRegionUpdate() call sequence, otherwise XGL_FALSE
669static bool32_t dsUpdateActive(XGL_DESCRIPTOR_SET ds)
670{
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700671 // Note, both "get" functions use global mutex so this guy does not
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700672 SET_NODE* pTrav = getSetNode(ds);
673 if (pTrav) {
674 REGION_NODE* pRegion = NULL;
675 pRegion = getRegionNode(pTrav->region);
676 if (pRegion) {
677 return pRegion->updateActive;
678 }
679 }
680 return XGL_FALSE;
681}
682
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700683static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700684 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700685 LAYOUT_NODE* pTrav = g_pLayoutHead;
686 while (pTrav) {
687 if (pTrav->layout == layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700688 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700689 return pTrav;
690 }
691 pTrav = pTrav->pNext;
692 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700693 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700694 return NULL;
695}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600696
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700697static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
698{
699 switch (pUpdateStruct->sType)
700 {
701 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
702 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
703 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
704 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
705 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
706 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
707 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
708 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
709 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
710 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
711 default:
712 // TODO : Flag specific error for this case
713 return 0;
714 }
715}
716
717static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
718{
719 switch (pUpdateStruct->sType)
720 {
721 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700722 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700723 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700724 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700725 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700726 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700727 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700728 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700729 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
730 // TODO : Need to understand this case better and make sure code is correct
Tobin Ehlis82871a82015-02-19 09:55:18 -0700731 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700732 default:
733 // TODO : Flag specific error for this case
734 return 0;
735 }
736}
737
738// Verify that the descriptor type in the update struct matches what's expected by the layout
Tobin Ehlisefa84162015-02-17 09:54:13 -0700739static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, const LAYOUT_NODE* pLayout)//XGL_DESCRIPTOR_TYPE type)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700740{
741 // First get actual type of update
742 XGL_DESCRIPTOR_TYPE actualType;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700743 uint32_t i = 0;
744 uint32_t bound = getUpdateUpperBound(pUpdateStruct);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700745 switch (pUpdateStruct->sType)
746 {
747 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
748 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
749 break;
750 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
751 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
752 break;
753 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
754 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
755 break;
756 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
757 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
758 break;
759 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
760 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
761 break;
762 default:
763 // TODO : Flag specific error for this case
764 return 0;
765 }
Tobin Ehlis82871a82015-02-19 09:55:18 -0700766 for (i = getUpdateIndex(pUpdateStruct); i < bound; i++) {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700767 if (pLayout->pTypes[i] != actualType)
768 return 0;
769 }
770 return 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700771}
772
773// Verify that update region for this update does not exceed max layout index for this type
774static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
775{
Tobin Ehlis82871a82015-02-19 09:55:18 -0700776 if ((getUpdateUpperBound(pUpdateStruct)-1) > layoutIdx)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700777 return 0;
778 return 1;
779}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700780// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
781// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700782// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700783static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
784{
785 GENERIC_HEADER* pNewNode = NULL;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700786 size_t array_size = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700787 size_t base_array_size = 0;
788 size_t total_array_size = 0;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700789 size_t baseBuffAddr = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700790 XGL_UPDATE_BUFFERS* pUBCI;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700791 XGL_UPDATE_IMAGES* pUICI;
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700792 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700793 switch (pUpdate->sType)
794 {
795 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
796 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700797#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700798 printf("Alloc10 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700799#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700800 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
801 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
802 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700803#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700804 printf("Alloc11 #%lu pNewNode->pSamplers addr(%p)\n", ++g_alloc_count, (void*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700805#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700806 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700807 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700808 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
809 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700810#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700811 printf("Alloc12 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700812#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700813 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
814 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
815 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700816#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700817 printf("Alloc13 #%lu pNewNode->pSamplerImageViews addr(%p)\n", ++g_alloc_count, (void*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700818#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700819 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
820 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));
821 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700822#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700823 printf("Alloc14 #%lu pSamplerImageViews)[%u].pImageView addr(%p)\n", ++g_alloc_count, i, (void*)((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700824#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700825 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));
826 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700827 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700828 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700829 pUICI = (XGL_UPDATE_IMAGES*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700830 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700831#if ALLOC_DEBUG
832 printf("Alloc15 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
833#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700834 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700835 base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
836 total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700837 XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews;
838 *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700839#if ALLOC_DEBUG
840 printf("Alloc16 #%lu *pppLocalImageViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalImageViews);
841#endif
842 baseBuffAddr = (size_t)(*pppLocalImageViews) + base_array_size;
843 for (uint32_t i = 0; i < pUICI->count; i++) {
Tobin Ehlisfdbc68c2015-02-19 13:14:59 -0700844 (*pppLocalImageViews)[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));
845 memcpy((*pppLocalImageViews)[i], pUICI->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700846 }
847 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700848 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700849 pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700850 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700851#if ALLOC_DEBUG
852 printf("Alloc17 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
853#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700854 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700855 base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count;
856 total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size;
857 XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews;
858 *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700859#if ALLOC_DEBUG
860 printf("Alloc18 #%lu *pppLocalBufferViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalBufferViews);
861#endif
862 baseBuffAddr = (size_t)(*pppLocalBufferViews) + base_array_size;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700863 for (uint32_t i = 0; i < pUBCI->count; i++) {
864 // Set ptr and then copy data into that ptr
Tobin Ehlisfdbc68c2015-02-19 13:14:59 -0700865 (*pppLocalBufferViews)[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)));
866 memcpy((*pppLocalBufferViews)[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700867 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700868 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700869 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
870 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700871#if ALLOC_DEBUG
872 printf("Alloc19 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
873#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700874 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700875 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700876 default:
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700877 sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in xglUpdateDescriptors() struct tree", string_XGL_STRUCTURE_TYPE(pUpdate->sType), pUpdate->sType);
878 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_INVALID_UPDATE_STRUCT, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700879 return NULL;
880 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700881 // Make sure that pNext for the end of shadow copy is NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700882 pNewNode->pNext = NULL;
883 return pNewNode;
884}
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700885// For given ds, update its mapping based on pUpdateChain linked-list
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700886static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
887{
888 SET_NODE* pSet = getSetNode(ds);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700889 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700890 LAYOUT_NODE* pLayout = NULL;
Tobin Ehlis365c2dc2015-02-25 11:46:39 -0700891 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI = NULL;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700892 // TODO : If pCIList is NULL, flag error
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700893 GENERIC_HEADER* pUpdates = pUpdateChain;
894 // Perform all updates
895 while (pUpdates) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700896 pLayout = pSet->pLayouts;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700897 // For each update first find the layout section that it overlaps
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700898 while (pLayout && (pLayout->startIndex > getUpdateIndex(pUpdates))) {
899 pLayout = pLayout->pPriorSetLayout;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700900 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700901 if (!pLayout) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700902 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700903 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));
904 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700905 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700906 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700907 // Next verify that update is correct size
908 if (!validateUpdateSize(pUpdates, pLayout->endIndex)) {
909 char str[48*1024]; // TODO : Keep count of layout CI structs and size this string dynamically based on that count
Tobin Ehlisefa84162015-02-17 09:54:13 -0700910 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
Tobin Ehlis365c2dc2015-02-25 11:46:39 -0700911 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS} ");
Tobin Ehlisefa84162015-02-17 09:54:13 -0700912 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);
913 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
914 free(pDSstr);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700915 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700916 else { // TODO : should we skip update on a type mismatch or force it?
Tobin Ehlisefa84162015-02-17 09:54:13 -0700917 // We have the right layout section, now verify that update is of the right type
918 if (!validateUpdateType(pUpdates, pLayout)) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700919 char str[1024];
Tobin Ehlisefa84162015-02-17 09:54:13 -0700920 sprintf(str, "Descriptor update type of %s does not match overlapping layout type!", string_XGL_STRUCTURE_TYPE(pUpdates->sType));
921 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700922 }
923 else {
Tobin Ehlis82871a82015-02-19 09:55:18 -0700924 // Save the update info
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700925 // TODO : Info message that update successful
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700926 // Create new update struct for this set's shadow copy
927 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
928 if (NULL == pNewNode) {
929 char str[1024];
930 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
931 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700932 }
933 else {
Tobin Ehlis82871a82015-02-19 09:55:18 -0700934 // Insert shadow node into LL of updates for this set
935 pNewNode->pNext = pSet->pUpdateStructs;
936 pSet->pUpdateStructs = pNewNode;
937 // Now update appropriate descriptor(s) to point to new Update node
938 for (uint32_t i = getUpdateIndex(pUpdates); i < getUpdateUpperBound(pUpdates); i++) {
939 pSet->ppDescriptors[i] = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700940 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700941 }
942 }
943 }
944 }
945 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
946 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700947 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700948}
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700949// Free the shadowed update node for this Set
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700950// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700951static void freeShadowUpdateTree(SET_NODE* pSet)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700952{
Tobin Ehlis8733adc2015-02-23 16:09:58 -0700953 GENERIC_HEADER* pShadowUpdate = pSet->pUpdateStructs;
954 pSet->pUpdateStructs = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700955 GENERIC_HEADER* pFreeUpdate = pShadowUpdate;
956 while(pShadowUpdate) {
957 pFreeUpdate = pShadowUpdate;
958 pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext;
959 uint32_t index = 0;
960 XGL_UPDATE_SAMPLERS* pUS = NULL;
961 XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
962 XGL_UPDATE_IMAGES* pUI = NULL;
963 XGL_UPDATE_BUFFERS* pUB = NULL;
964 void** ppToFree = NULL;
965 switch (pFreeUpdate->sType)
966 {
967 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
968 pUS = (XGL_UPDATE_SAMPLERS*)pFreeUpdate;
969 if (pUS->pSamplers) {
970 ppToFree = (void**)&pUS->pSamplers;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700971#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700972 printf("Free11 #%lu pSamplers addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700973#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700974 free(*ppToFree);
975 }
976 break;
977 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
978 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pFreeUpdate;
979 for (index = 0; index < pUST->count; index++) {
980 if (pUST->pSamplerImageViews[index].pImageView) {
981 ppToFree = (void**)&pUST->pSamplerImageViews[index].pImageView;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700982#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700983 printf("Free14 #%lu pImageView addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700984#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700985 free(*ppToFree);
986 }
987 }
988 ppToFree = (void**)&pUST->pSamplerImageViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700989#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700990 printf("Free13 #%lu pSamplerImageViews addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700991#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700992 free(*ppToFree);
993 break;
994 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
995 pUI = (XGL_UPDATE_IMAGES*)pFreeUpdate;
996 if (pUI->pImageViews) {
997 ppToFree = (void**)&pUI->pImageViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700998#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700999 printf("Free16 #%lu pImageViews addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001000#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001001 free(*ppToFree);
1002 }
1003 break;
1004 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
1005 pUB = (XGL_UPDATE_BUFFERS*)pFreeUpdate;
1006 if (pUB->pBufferViews) {
1007 ppToFree = (void**)&pUB->pBufferViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001008#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001009 printf("Free18 #%lu pBufferViews addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001010#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001011 free(*ppToFree);
1012 }
1013 break;
1014 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
1015 break;
1016 default:
1017 assert(0);
1018 break;
1019 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001020#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001021 printf("Free10, Free12, Free15, Free17, Free19 #%lu pUpdateNode addr(%p)\n", ++g_free_count, (void*)pFreeUpdate);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001022#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001023 free(pFreeUpdate);
1024 }
1025}
1026// Free all DS Regions including their Sets & related sub-structs
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001027// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001028static void freeRegions()
1029{
1030 REGION_NODE* pRegion = g_pRegionHead;
1031 REGION_NODE* pFreeMe = pRegion;
1032 while (pRegion) {
1033 pFreeMe = pRegion;
1034 SET_NODE* pSet = pRegion->pSets;
1035 SET_NODE* pFreeSet = pSet;
1036 while (pSet) {
1037 pFreeSet = pSet;
1038 pSet = pSet->pNext;
1039 // Freeing layouts handled in freeLayouts() function
1040 // Free Update shadow struct tree
Tobin Ehlis8733adc2015-02-23 16:09:58 -07001041 freeShadowUpdateTree(pFreeSet);
Tobin Ehlis82871a82015-02-19 09:55:18 -07001042 if (pFreeSet->ppDescriptors) {
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001043#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07001044 printf("Free35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_free_count, (void*)pFreeSet->ppDescriptors);
1045#endif
1046 free(pFreeSet->ppDescriptors);
1047 }
1048#if ALLOC_DEBUG
1049 printf("Free32 #%lu pSet addr(%p)\n", ++g_free_count, (void*)pFreeSet);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001050#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001051 free(pFreeSet);
1052 }
1053 pRegion = pRegion->pNext;
1054 if (pFreeMe->createInfo.pTypeCount) {
1055 void** ppToFree = (void**)&pFreeMe->createInfo.pTypeCount;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001056#if ALLOC_DEBUG
1057 printf("Free31 #%lu pTypeCount addr(%p)\n", ++g_free_count, (void*)*ppToFree);
1058#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001059 free(*ppToFree);
1060 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001061#if ALLOC_DEBUG
1062 printf("Free30 #%lu pRegion addr(%p)\n", ++g_free_count, (void*)pFreeMe);
1063#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001064 free(pFreeMe);
1065 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001066 g_pRegionHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001067}
1068// WARN : Once freeLayouts() called, any layout ptrs in Region/Set data structure will be invalid
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001069// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001070static void freeLayouts()
1071{
1072 LAYOUT_NODE* pLayout = g_pLayoutHead;
1073 LAYOUT_NODE* pFreeLayout = pLayout;
1074 while (pLayout) {
1075 pFreeLayout = pLayout;
1076 GENERIC_HEADER* pTrav = (GENERIC_HEADER*)pLayout->pCreateInfoList;
1077 while (pTrav) {
1078 void* pToFree = (void*)pTrav;
1079 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001080#if ALLOC_DEBUG
1081 printf("Free27 & Free28 #%lu pLayoutCITree addr(%p)\n", ++g_free_count, (void*)pToFree);
1082#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001083 free(pToFree);
1084 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001085 if (pLayout->pTypes) {
1086#if ALLOC_DEBUG
1087 printf("Free29 #%lu pLayout->pTypes addr(%p)\n", ++g_free_count, (void*)pLayout->pTypes);
1088#endif
1089 free(pLayout->pTypes);
1090 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07001091 pLayout = pLayout->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001092#if ALLOC_DEBUG
1093 printf("Free26 #%lu pLayout addr(%p)\n", ++g_free_count, (void*)pFreeLayout);
1094#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001095 free(pFreeLayout);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001096 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001097 g_pLayoutHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001098}
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001099// Currently clearing a set is removing all previous updates to that set
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001100// TODO : Validate if this is correct clearing behavior
1101static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
1102{
1103 SET_NODE* pSet = getSetNode(set);
1104 if (!pSet) {
1105 // TODO : Return error
1106 }
1107 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001108 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8733adc2015-02-23 16:09:58 -07001109 freeShadowUpdateTree(pSet);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001110 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001111 }
1112}
1113
1114static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
1115{
1116 REGION_NODE* pRegion = getRegionNode(region);
1117 if (!pRegion) {
1118 char str[1024];
1119 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
1120 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
1121 }
1122 else
1123 {
1124 // For every set off of this region, clear it
1125 SET_NODE* pSet = pRegion->pSets;
1126 while (pSet) {
1127 clearDescriptorSet(pSet->set);
1128 }
1129 }
1130}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001131
Tobin Ehlis8cced212015-02-13 10:26:14 -07001132// Code here to manage the Cmd buffer LL
1133static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -07001134{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001135 loader_platform_thread_lock_mutex(&globalLock);
1136 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
1137 while (pCB) {
1138 if (cb == pCB->cmdBuffer) {
1139 loader_platform_thread_unlock_mutex(&globalLock);
1140 return pCB;
1141 }
1142 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -07001143 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001144 loader_platform_thread_unlock_mutex(&globalLock);
1145 return NULL;
1146}
Tobin Ehlisefa84162015-02-17 09:54:13 -07001147// Free all CB Nodes
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001148// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001149static void freeCmdBuffers()
1150{
1151 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
1152 GLOBAL_CB_NODE* pFreeMe = pCB;
1153 while (pCB) {
1154 pFreeMe = pCB;
1155 CMD_NODE* pCmd = pCB->pCmds;
1156 CMD_NODE* pFreeCmd = pCmd;
1157 while (pCmd) {
1158 pFreeCmd = pCmd;
1159 pCmd = pCmd->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001160#if ALLOC_DEBUG
1161 printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeCmd);
1162#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001163 free(pFreeCmd);
1164 }
1165 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001166#if ALLOC_DEBUG
1167 printf("Free33 #%lu pCB addr(%p)\n", ++g_free_count, (void*)pFreeMe);
1168#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001169 free(pFreeMe);
1170 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001171 g_pCmdBufferHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001172}
Tobin Ehlisd092d232015-02-13 13:30:07 -07001173static void addCmd(GLOBAL_CB_NODE* pCB, const CMD_TYPE cmd)
1174{
1175 CMD_NODE* pCmd = (CMD_NODE*)malloc(sizeof(CMD_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001176#if ALLOC_DEBUG
1177 printf("Alloc20 #%lu pCmd addr(%p)\n", ++g_alloc_count, (void*)pCmd);
1178#endif
Tobin Ehlisd092d232015-02-13 13:30:07 -07001179 if (pCmd) {
1180 // init cmd node and append to end of cmd LL
1181 memset(pCmd, 0, sizeof(CMD_NODE));
1182 pCB->numCmds++;
1183 pCmd->cmdNumber = pCB->numCmds;
1184 pCmd->type = cmd;
1185 if (!pCB->pCmds) {
1186 pCB->pCmds = pCmd;
1187 }
1188 else {
1189 assert(pCB->lastCmd);
1190 pCB->lastCmd->pNext = pCmd;
1191 }
1192 pCB->lastCmd = pCmd;
1193 }
1194 else {
1195 char str[1024];
1196 sprintf(str, "Out of memory while attempting to allocate new CMD_NODE for cmdBuffer %p", (void*)pCB->cmdBuffer);
1197 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCB->cmdBuffer, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1198 }
1199}
1200static void resetCB(const XGL_CMD_BUFFER cb)
1201{
1202 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1203 if (pCB) {
1204 CMD_NODE* pCur = pCB->pCmds;
1205 CMD_NODE* pFreeMe = pCur;
1206 while (pCur) {
1207 pFreeMe = pCur;
1208 pCur = pCur->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001209#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001210 printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001211#endif
Tobin Ehlisd092d232015-02-13 13:30:07 -07001212 free(pFreeMe);
1213 }
1214 // Reset CB state
1215 GLOBAL_CB_NODE* pSaveNext = pCB->pNextGlobalCBNode;
1216 XGL_FLAGS saveFlags = pCB->flags;
1217 XGL_QUEUE_TYPE saveQT = pCB->queueType;
1218 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
1219 pCB->cmdBuffer = cb;
1220 pCB->flags = saveFlags;
1221 pCB->queueType = saveQT;
1222 pCB->pNextGlobalCBNode = pSaveNext;
1223 pCB->lastVtxBinding = MAX_BINDING;
1224 }
1225}
1226// Set the last bound dynamic state of given type
1227// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
1228static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
1229{
1230 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
1231 if (pCB) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001232 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07001233 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07001234 addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT);
Tobin Ehlisd092d232015-02-13 13:30:07 -07001235 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
1236 while (pTrav && (state != pTrav->stateObj)) {
1237 pTrav = pTrav->pNext;
1238 }
1239 if (!pTrav) {
1240 char str[1024];
1241 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1242 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
1243 }
1244 pCB->lastBoundDynamicState[sType] = pTrav;
1245 loader_platform_thread_unlock_mutex(&globalLock);
1246 }
1247 else {
1248 char str[1024];
1249 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
1250 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
1251 }
1252}
Tobin Ehlis8cced212015-02-13 10:26:14 -07001253// Print the last bound Gfx Pipeline
1254static void printPipeline(const XGL_CMD_BUFFER cb)
1255{
1256 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1257 if (pCB) {
1258 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1259 if (!pPipeTrav) {
1260 // nothing to print
1261 }
1262 else {
1263 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
1264 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001265 free(pipeStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001266 }
Tobin Ehlis56a61072014-11-21 08:58:46 -07001267 }
1268}
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001269// Dump subgraph w/ DS info
Tobin Ehlis8cced212015-02-13 10:26:14 -07001270static void dsDumpDot(const XGL_CMD_BUFFER cb, FILE* pOutFile)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001271{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001272 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1273 if (pCB && pCB->lastBoundDescriptorSet) {
1274 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1275 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001276 char tmp_str[4*1024];
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001277 fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n");
1278 sprintf(tmp_str, "Region (%p)", pRegion->region);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001279 char* pGVstr = xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str);
1280 fprintf(pOutFile, "%s", pGVstr);
1281 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001282 fprintf(pOutFile, "subgraph cluster_DescriptorSet\n{\nlabel=\"Descriptor Set (%p)\"\n", pSet->set);
1283 sprintf(tmp_str, "Descriptor Set (%p)", pSet->set);
1284 LAYOUT_NODE* pLayout = pSet->pLayouts;
1285 uint32_t layout_index = 0;
1286 while (pLayout) {
1287 ++layout_index;
1288 sprintf(tmp_str, "LAYOUT%u", layout_index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001289 pGVstr = xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str);
1290 fprintf(pOutFile, "%s", pGVstr);
1291 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001292 pLayout = pLayout->pNext;
1293 if (pLayout) {
1294 fprintf(pOutFile, "\"%s\" -> \"LAYOUT%u\" [];\n", tmp_str, layout_index+1);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001295 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001296 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001297 if (pSet->pUpdateStructs) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001298 pGVstr = dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates");
1299 fprintf(pOutFile, "%s", pGVstr);
1300 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001301 }
Tobin Ehlis59d32c42015-02-24 09:16:47 -07001302 if (pSet->ppDescriptors) {
1303 //void* pDesc = NULL;
1304 fprintf(pOutFile, "\"DESCRIPTORS\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"desc\">DESCRIPTORS</TD></TR>");
1305 uint32_t i = 0;
1306 for (i=0; i < pSet->descriptorCount; i++) {
1307 if (pSet->ppDescriptors[i]) {
1308 fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", i, i);
1309 }
1310 }
1311 fprintf(pOutFile, "</TABLE>>\n];\n");
1312 // Now add the views that are mapped to active descriptors
1313 XGL_UPDATE_SAMPLERS* pUS = NULL;
1314 XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
1315 XGL_UPDATE_IMAGES* pUI = NULL;
1316 XGL_UPDATE_BUFFERS* pUB = NULL;
1317 XGL_UPDATE_AS_COPY* pUAC = NULL;
1318 XGL_SAMPLER_CREATE_INFO* pSCI = NULL;
1319 XGL_IMAGE_VIEW_CREATE_INFO* pIVCI = NULL;
1320 XGL_BUFFER_VIEW_CREATE_INFO* pBVCI = NULL;
1321 for (i=0; i < pSet->descriptorCount; i++) {
1322 if (pSet->ppDescriptors[i]) {
1323 switch (pSet->ppDescriptors[i]->sType)
1324 {
1325 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
1326 pUS = (XGL_UPDATE_SAMPLERS*)pSet->ppDescriptors[i];
1327 pSCI = getSamplerCreateInfo(pUS->pSamplers[i-pUS->index]);
1328 if (pSCI) {
1329 sprintf(tmp_str, "SAMPLER%u", i);
1330 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str));
1331 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1332 }
1333 break;
1334 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
1335 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pSet->ppDescriptors[i];
1336 pSCI = getSamplerCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pSampler);
1337 if (pSCI) {
1338 sprintf(tmp_str, "SAMPLER%u", i);
1339 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str));
1340 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1341 }
1342 pIVCI = getImageViewCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pImageView->view);
1343 if (pIVCI) {
1344 sprintf(tmp_str, "IMAGE_VIEW%u", i);
1345 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str));
1346 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1347 }
1348 break;
1349 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
1350 pUI = (XGL_UPDATE_IMAGES*)pSet->ppDescriptors[i];
1351 pIVCI = getImageViewCreateInfo(pUI->pImageViews[i-pUI->index]->view);
1352 if (pIVCI) {
1353 sprintf(tmp_str, "IMAGE_VIEW%u", i);
1354 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str));
1355 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1356 }
1357 break;
1358 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
1359 pUB = (XGL_UPDATE_BUFFERS*)pSet->ppDescriptors[i];
1360 pBVCI = getBufferViewCreateInfo(pUB->pBufferViews[i-pUB->index]->view);
1361 if (pBVCI) {
1362 sprintf(tmp_str, "BUFFER_VIEW%u", i);
1363 fprintf(pOutFile, "%s", xgl_gv_print_xgl_buffer_view_create_info(pBVCI, tmp_str));
1364 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1365 }
1366 break;
1367 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
1368 pUAC = (XGL_UPDATE_AS_COPY*)pSet->ppDescriptors[i];
1369 // TODO : Need to validate this code
1370 // Save off pNext and set to NULL while printing this struct, then restore it
1371 void** ppNextPtr = (void*)&pUAC->pNext;
1372 void* pSaveNext = *ppNextPtr;
1373 *ppNextPtr = NULL;
1374 sprintf(tmp_str, "UPDATE_AS_COPY%u", i);
1375 fprintf(pOutFile, "%s", xgl_gv_print_xgl_update_as_copy(pUAC, tmp_str));
1376 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
1377 // Restore next ptr
1378 *ppNextPtr = pSaveNext;
1379 break;
1380 default:
1381 break;
1382 }
1383 }
1384 }
1385 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001386 fprintf(pOutFile, "}\n");
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001387 fprintf(pOutFile, "}\n");
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001388 pRegion = pRegion->pNext;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001389 }
1390}
Tobin Ehlisc6310db2015-02-24 15:40:22 -07001391// Dump a GraphViz dot file showing the Cmd Buffers
1392static void cbDumpDotFile(char *outFileName)
1393{
1394 // Print CB Chain for each CB
1395 FILE* pOutFile;
1396 pOutFile = fopen(outFileName, "w");
1397 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1398 fprintf(pOutFile, "subgraph cluster_cmdBuffers\n{\nlabel=\"Command Buffers\"\n");
1399 for (uint32_t i=0; i < MAX_TID; i++) {
1400 if (g_lastCmdBuffer[i]) {
1401 GLOBAL_CB_NODE* pCB = getCBNode(g_lastCmdBuffer[i]);
1402 if (pCB) {
1403 fprintf(pOutFile, "subgraph cluster_cmdBuffer%u\n{\nlabel=\"Command Buffer #%u\"\n", i, i);
1404 CMD_NODE* pCmd = pCB->pCmds;
1405 uint32_t instNum = 0;
1406 while (pCmd) {
1407 if (instNum)
1408 fprintf(pOutFile, "\"CB%pCMD%u\" -> \"CB%pCMD%u\" [];\n", (void*)pCB->cmdBuffer, instNum-1, (void*)pCB->cmdBuffer, instNum);
1409 fprintf(pOutFile, "\"CB%pCMD%u\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD>CMD#</TD><TD>%u</TD></TR><TR><TD>CMD Type</TD><TD>%s</TD></TR></TABLE>>\n];\n", (void*)pCB->cmdBuffer, instNum, instNum, cmdTypeToString(pCmd->type));
1410 ++instNum;
1411 pCmd = pCmd->pNext;
1412 }
1413 fprintf(pOutFile, "}\n");
1414 }
1415 }
1416 }
1417 fprintf(pOutFile, "}\n");
1418 fprintf(pOutFile, "}\n"); // close main graph "g"
1419 fclose(pOutFile);
1420}
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001421// Dump a GraphViz dot file showing the pipeline
Tobin Ehlis8cced212015-02-13 10:26:14 -07001422static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001423{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001424 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1425 if (pCB) {
1426 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1427 if (pPipeTrav) {
1428 FILE* pOutFile;
1429 pOutFile = fopen(outFileName, "w");
1430 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1431 fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001432 char* pGVstr = NULL;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001433 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07001434 if (pCB->lastBoundDynamicState[i] && pCB->lastBoundDynamicState[i]->pCreateInfo) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001435 pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i));
1436 fprintf(pOutFile, "%s", pGVstr);
1437 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001438 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001439 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001440 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
1441 fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001442 pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD");
1443 fprintf(pOutFile, "%s", pGVstr);
1444 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001445 fprintf(pOutFile, "}\n");
1446 dsDumpDot(cb, pOutFile);
1447 fprintf(pOutFile, "}\n"); // close main graph "g"
1448 fclose(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001449 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001450 }
1451}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001452// Synch up currently bound pipeline settings with DS mappings
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001453// 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 -07001454static void synchDSMapping(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001455{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001456 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1457 if (pCB && pCB->lastBoundPipeline) {
1458 // First verify that we have a Node for bound pipeline
1459 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1460 char str[1024];
1461 if (!pPipeTrav) {
1462 sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline);
1463 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
1464 }
1465 else {
1466 // Verify Vtx binding
1467 if (MAX_BINDING != pCB->lastVtxBinding) {
1468 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) {
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001469 if (0 == pPipeTrav->vtxBindingCount) {
1470 sprintf(str, "Vtx Buffer Index %u was bound, but no vtx buffers are attached to PSO.", pCB->lastVtxBinding);
1471 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1472 }
1473 else {
1474 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
1475 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1476 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001477 }
1478 else {
1479 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : ");
1480 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
1481 free(tmpStr);
1482 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001483 }
1484 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001485 }
1486}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001487// Print details of DS config to stdout
Tobin Ehlis8cced212015-02-13 10:26:14 -07001488static void printDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001489{
Tobin Ehlise79df942014-11-18 16:38:08 -07001490 char tmp_str[1024];
1491 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 -07001492 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1493 if (pCB) {
1494 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1495 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001496 // Print out region details
1497 sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region);
1498 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001499 char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " ");
1500 sprintf(ds_config_str, "%s", pRegionStr);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001501 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001502 free(pRegionStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001503 // Print out set details
1504 char prefix[10];
1505 uint32_t index = 0;
1506 sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set);
1507 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1508 LAYOUT_NODE* pLayout = pSet->pLayouts;
1509 while (pLayout) {
1510 // Print layout details
1511 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 -07001512 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001513 sprintf(prefix, " [L%u] ", index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001514 char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix);
1515 sprintf(ds_config_str, "%s", pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001516 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001517 free(pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001518 pLayout = pLayout->pPriorSetLayout;
1519 index++;
1520 }
1521 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
1522 if (pUpdate) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001523 sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
1524 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1525 sprintf(prefix, " [UC] ");
1526 sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix));
1527 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
1528 // TODO : If there is a "view" associated with this update, print CI for that view
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001529 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001530 else {
1531 sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set);
1532 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1533 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001534 }
1535}
1536
Tobin Ehlisd092d232015-02-13 13:30:07 -07001537static void printCB(const XGL_CMD_BUFFER cb)
1538{
1539 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1540 if (pCB) {
1541 char str[1024];
1542 CMD_NODE* pCmd = pCB->pCmds;
1543 sprintf(str, "Cmds in CB %p", (void*)cb);
1544 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
1545 while (pCmd) {
1546 sprintf(str, " CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type));
1547 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str);
1548 pCmd = pCmd->pNext;
1549 }
1550 }
1551 else {
1552 // Nothing to print
1553 }
1554}
1555
Jeremy Hayes668ca052015-01-29 13:03:36 -07001556
Tobin Ehlis8cced212015-02-13 10:26:14 -07001557static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001558{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001559 synchDSMapping(cb);
1560 printDSConfig(cb);
1561 printPipeline(cb);
1562 printDynamicState(cb);
Tobin Ehlis224dd812015-02-19 15:26:49 -07001563 static int autoDumpOnce = 0;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001564 if (autoDumpOnce) {
1565 autoDumpOnce = 0;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001566 dumpDotFile(cb, "pipeline_dump.dot");
Tobin Ehlisc6310db2015-02-24 15:40:22 -07001567 cbDumpDotFile("cb_dump.dot");
Ian Elliott81ac44c2015-01-13 17:52:38 -07001568#if defined(_WIN32)
1569// FIXME: NEED WINDOWS EQUIVALENT
1570#else // WIN32
Jeremy Hayes9c50d832015-02-12 16:15:58 -07001571 // Convert dot to svg if dot available
Tobin Ehlis266473d2014-12-16 17:34:50 -07001572 if(access( "/usr/bin/dot", X_OK) != -1) {
Jeremy Hayes9c50d832015-02-12 16:15:58 -07001573 system("/usr/bin/dot pipeline_dump.dot -Tsvg -o pipeline_dump.svg");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001574 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001575#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001576 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001577}
1578
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001579static void initDrawState(void)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001580{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001581 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001582 // initialize DrawState options
Mark Lobodzinskic5eaea62015-02-25 12:23:20 -06001583 g_reportingLevel = (XGL_LAYER_DBG_REPORT_LEVEL)getLayerOptionEnum("MemTrackerReportLevel");
1584 g_debugAction = (XGL_LAYER_DBG_ACTION)getLayerOptionEnum("MemTrackerDebugAction");
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001585
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001586 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1587 {
1588 strOpt = getLayerOption("DrawStateLogFilename");
1589 if (strOpt)
1590 {
1591 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001592 }
1593 if (g_logFile == NULL)
1594 g_logFile = stdout;
1595 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001596 // initialize Layer dispatch table
1597 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001598 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001599 fpNextGPA = pCurObj->pGPA;
1600 assert(fpNextGPA);
1601
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001602 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1603
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001604 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001605 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001606
1607 if (!globalLockInitialized)
1608 {
1609 // TODO/TBD: Need to delete this mutex sometime. How??? One
1610 // suggestion is to call this during xglCreateInstance(), and then we
1611 // can clean it up during xglDestroyInstance(). However, that requires
1612 // that the layer have per-instance locks. We need to come back and
1613 // address this soon.
1614 loader_platform_thread_create_mutex(&globalLock);
1615 globalLockInitialized = 1;
1616 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001617}
1618
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001619XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1620{
1621 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1622 return result;
1623}
1624
1625XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1626{
1627 XGL_RESULT result = nextTable.DestroyInstance(instance);
1628 return result;
1629}
1630
1631XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1632{
1633 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1634 return result;
1635}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001636
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001637XGL_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 -06001638{
1639 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001640 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001641 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001642 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001643 return result;
1644}
1645
1646XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1647{
1648 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001649 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001650 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001651 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001652 return result;
1653}
1654
1655XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1656{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001657 // Free all the memory
1658 loader_platform_thread_lock_mutex(&globalLock);
1659 freePipelines();
1660 freeSamplers();
1661 freeImages();
1662 freeBuffers();
1663 freeCmdBuffers();
1664 freeDynamicState();
1665 freeRegions();
1666 freeLayouts();
1667 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001668 XGL_RESULT result = nextTable.DestroyDevice(device);
1669 return result;
1670}
1671
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001672XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001673{
1674 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001675 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001676 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001677 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001678 return result;
1679}
1680
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001681XGL_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 -06001682{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001683 if (gpu != NULL)
1684 {
1685 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1686 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001687 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001688 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001689 return result;
1690 } else
1691 {
1692 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1693 return XGL_ERROR_INVALID_POINTER;
1694 // This layer compatible with all GPUs
1695 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001696 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001697 return XGL_SUCCESS;
1698 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001699}
1700
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001701XGL_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 -06001702{
1703 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1704 return result;
1705}
1706
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001707XGL_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 -06001708{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001709 for (uint32_t i=0; i < cmdBufferCount; i++) {
1710 // Validate that cmd buffers have been updated
1711 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001712 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1713 return result;
1714}
1715
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001716XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001717{
1718 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1719 return result;
1720}
1721
1722XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1723{
1724 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1725 return result;
1726}
1727
1728XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1729{
1730 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1731 return result;
1732}
1733
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001734XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1735{
1736 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1737 return result;
1738}
1739
1740XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1741{
1742 XGL_RESULT result = nextTable.FreeMemory(mem);
1743 return result;
1744}
1745
1746XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1747{
1748 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1749 return result;
1750}
1751
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001752XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001753{
1754 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1755 return result;
1756}
1757
1758XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1759{
1760 XGL_RESULT result = nextTable.UnmapMemory(mem);
1761 return result;
1762}
1763
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001764XGL_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 -06001765{
1766 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1767 return result;
1768}
1769
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001770XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1771{
1772 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001773 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001774 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001775 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001776 return result;
1777}
1778
1779XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1780{
1781 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1782 return result;
1783}
1784
1785XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1786{
1787 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1788 return result;
1789}
1790
1791XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1792{
1793 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1794 return result;
1795}
1796
1797XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1798{
1799 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1800 return result;
1801}
1802
1803XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1804{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001805 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001806 XGL_RESULT result = nextTable.DestroyObject(object);
1807 return result;
1808}
1809
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001810XGL_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 -06001811{
1812 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1813 return result;
1814}
1815
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001816XGL_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 -06001817{
Jon Ashburned62b412015-01-15 10:39:19 -07001818 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001819 return result;
1820}
1821
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001822XGL_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)
1823{
1824 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1825 return result;
1826}
1827
1828XGL_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)
1829{
1830 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1831 return result;
1832}
1833
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001834XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1835{
1836 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1837 return result;
1838}
1839
1840XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1841{
1842 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1843 return result;
1844}
1845
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001846XGL_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 -06001847{
1848 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1849 return result;
1850}
1851
1852XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1853{
1854 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1855 return result;
1856}
1857
1858XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1859{
1860 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1861 return result;
1862}
1863
1864XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1865{
1866 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1867 return result;
1868}
1869
1870XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1871{
1872 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1873 return result;
1874}
1875
1876XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1877{
1878 XGL_RESULT result = nextTable.GetEventStatus(event);
1879 return result;
1880}
1881
1882XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1883{
1884 XGL_RESULT result = nextTable.SetEvent(event);
1885 return result;
1886}
1887
1888XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1889{
1890 XGL_RESULT result = nextTable.ResetEvent(event);
1891 return result;
1892}
1893
1894XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1895{
1896 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1897 return result;
1898}
1899
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001900XGL_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 -06001901{
1902 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1903 return result;
1904}
1905
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001906XGL_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 -06001907{
1908 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1909 return result;
1910}
1911
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001912XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1913{
1914 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
1915 return result;
1916}
1917
1918XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1919{
1920 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Tobin Ehlis59d32c42015-02-24 09:16:47 -07001921 if (XGL_SUCCESS == result) {
1922 loader_platform_thread_lock_mutex(&globalLock);
1923 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1924#if ALLOC_DEBUG
1925 printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1926#endif
1927 pNewNode->buffer = *pView;
1928 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO));
1929 pNewNode->pNext = g_pBufferHead;
1930 g_pBufferHead = pNewNode;
1931 loader_platform_thread_unlock_mutex(&globalLock);
1932 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001933 return result;
1934}
1935
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001936XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1937{
1938 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1939 return result;
1940}
1941
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001942XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1943{
1944 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1945 return result;
1946}
1947
1948XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1949{
1950 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1951 return result;
1952}
1953
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001954XGL_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 -06001955{
1956 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1957 return result;
1958}
1959
1960XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1961{
1962 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001963 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001964 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001965 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001966#if ALLOC_DEBUG
1967 printf("Alloc22 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1968#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001969 pNewNode->image = *pView;
1970 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1971 pNewNode->pNext = g_pImageHead;
1972 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001973 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001974 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001975 return result;
1976}
1977
1978XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1979{
1980 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1981 return result;
1982}
1983
1984XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1985{
1986 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1987 return result;
1988}
1989
1990XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1991{
1992 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1993 return result;
1994}
1995
1996XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1997{
1998 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1999 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07002000 char str[1024];
2001 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
2002 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07002003 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002004 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002005 if (pTrav) {
2006 while (pTrav->pNext)
2007 pTrav = pTrav->pNext;
2008 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002009#if ALLOC_DEBUG
2010 printf("Alloc23 #%lu pTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pTrav->pNext);
2011#endif
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002012 pTrav = pTrav->pNext;
2013 }
2014 else {
2015 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002016#if ALLOC_DEBUG
2017 printf("Alloc24 #%lu pTrav addr(%p)\n", ++g_alloc_count, (void*)pTrav);
2018#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002019 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002020 }
2021 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
2022 pTrav->pipeline = *pPipeline;
2023 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07002024 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002025 return result;
2026}
2027
2028XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
2029{
2030 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
2031 return result;
2032}
2033
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002034XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002035{
2036 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
2037 return result;
2038}
2039
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002040XGL_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 -06002041{
2042 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
2043 return result;
2044}
2045
2046XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
2047{
2048 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
2049 return result;
2050}
2051
2052XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
2053{
2054 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002055 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07002056 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002057 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002058#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002059 printf("Alloc25 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002060#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002061 pNewNode->sampler = *pSampler;
2062 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
2063 pNewNode->pNext = g_pSamplerHead;
2064 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002065 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002066 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002067 return result;
2068}
2069
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002070XGL_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)
2071{
2072 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
2073 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002074 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002075#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002076 printf("Alloc26 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002077#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002078 if (NULL == pNewNode) {
2079 char str[1024];
2080 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
2081 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2082 }
2083 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002084 // TODO : API Currently missing a count here that we should multiply by struct size
2085 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002086#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002087 printf("Alloc27 #%lu pNewNode->pCreateInfoList addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pCreateInfoList);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002088#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002089 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002090 void* pCITrav = NULL;
2091 uint32_t totalCount = 0;
2092 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07002093 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002094 pCITrav = (void*)pSetLayoutInfoList->pNext;
2095 totalCount = pSetLayoutInfoList->count;
2096 }
2097 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
2098 while (pCITrav) {
2099 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
2100 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002101#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002102 printf("Alloc28 #%lu *ppNext addr(%p)\n", ++g_alloc_count, (void*)*ppNext);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002103#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002104 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
2105 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002106 ppNext = (void**)&((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002107 }
2108 if (totalCount > 0) {
2109 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002110#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002111 printf("Alloc29 #%lu pNewNode->pTypes addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pTypes);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002112#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002113 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002114 uint32_t offset = 0;
2115 uint32_t i = 0;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002116 while (pLCI) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07002117 for (i = 0; i < pLCI->count; i++) {
2118 pNewNode->pTypes[offset + i] = pLCI->descriptorType;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002119 }
Tobin Ehlis82871a82015-02-19 09:55:18 -07002120 offset += i;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002121 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
2122 }
2123 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002124 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002125 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002126 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002127 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
2128 assert(i < XGL_NUM_SHADER_STAGE);
2129 if (stage & stageFlags)
2130 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07002131 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002132 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002133 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002134 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
2135 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002136 if (NULL != priorSetLayout && pPriorNode == NULL) {
2137 char str[1024];
2138 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
2139 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2140 }
2141 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
2142 // Get count for prior layout
2143 pNewNode->startIndex = pPriorNode->endIndex + 1;
2144 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07002145 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002146 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002147 pNewNode->pPriorSetLayout = pPriorNode;
2148 // Put new node at Head of global Layer list
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002149 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002150 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002151 g_pLayoutHead = pNewNode;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002152 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002153 }
2154 return result;
2155}
2156
2157XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
2158{
2159 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
2160 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002161 loader_platform_thread_lock_mutex(&globalLock);
2162 REGION_NODE* pRegionNode = g_pRegionHead;
2163 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002164 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002165 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2166 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002167 }
2168 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002169 pRegionNode->updateActive = 1;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002170 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002171 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002172 }
2173 return result;
2174}
2175
2176XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
2177{
2178 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
2179 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002180 loader_platform_thread_lock_mutex(&globalLock);
2181 REGION_NODE* pRegionNode = g_pRegionHead;
2182 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002183 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002184 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2185 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002186 }
2187 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002188 if (!pRegionNode->updateActive) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002189 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002190 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
2191 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002192 }
2193 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002194 pRegionNode->updateActive = 0;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002195 }
2196 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002197 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002198 }
2199 return result;
2200}
2201
2202XGL_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)
2203{
2204 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
2205 if (XGL_SUCCESS == result) {
2206 // Insert this region into Global Region LL at head
2207 char str[1024];
2208 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
2209 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002210 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002211 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002212#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002213 printf("Alloc30 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002214#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002215 if (NULL == pNewNode) {
2216 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002217 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002218 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2219 }
2220 else {
2221 memset(pNewNode, 0, sizeof(REGION_NODE));
2222 pNewNode->pNext = g_pRegionHead;
2223 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002224 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
2225 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
2226 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07002227 if (typeCountSize) {
2228 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
2229 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002230#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002231 printf("Alloc31 #%lu *ppTypeCount addr(%p)\n", ++g_alloc_count, (void*)*ppTypeCount);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002232#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002233 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
2234 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002235 pNewNode->regionUsage = regionUsage;
2236 pNewNode->updateActive = 0;
2237 pNewNode->maxSets = maxSets;
2238 pNewNode->region = *pDescriptorRegion;
2239 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002240 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002241 }
2242 else {
2243 // Need to do anything if region create fails?
2244 }
2245 return result;
2246}
2247
2248XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
2249{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002250 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002251 if (XGL_SUCCESS == result) {
2252 clearDescriptorRegion(descriptorRegion);
2253 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002254 return result;
2255}
2256
2257XGL_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)
2258{
2259 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002260 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
2261 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
2262 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002263 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002264 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002265 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002266 }
2267 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002268 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002269 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002270 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002271 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002272 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002273 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002274#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07002275 printf("Alloc32 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002276#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002277 if (NULL == pNewNode) {
2278 char str[1024];
2279 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002280 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 -07002281 }
2282 else {
2283 memset(pNewNode, 0, sizeof(SET_NODE));
2284 // Insert set at head of Set LL for this region
2285 pNewNode->pNext = pRegionNode->pSets;
2286 pRegionNode->pSets = pNewNode;
2287 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
2288 if (NULL == pLayout) {
2289 char str[1024];
2290 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
2291 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2292 }
2293 pNewNode->pLayouts = pLayout;
2294 pNewNode->region = descriptorRegion;
2295 pNewNode->set = pDescriptorSets[i];
2296 pNewNode->setUsage = setUsage;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07002297 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002298 size_t descriptorArraySize = sizeof(GENERIC_HEADER*)*pNewNode->descriptorCount;
2299 pNewNode->ppDescriptors = (GENERIC_HEADER**)malloc(descriptorArraySize);
2300#if ALLOC_DEBUG
2301 printf("Alloc35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_alloc_count, (void*)pNewNode->ppDescriptors);
2302#endif
2303 memset(pNewNode->ppDescriptors, 0, descriptorArraySize);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002304 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002305 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002306 }
2307 }
2308 return result;
2309}
2310
2311XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
2312{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002313 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002314 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002315 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002316 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
2317}
2318
2319XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
2320{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002321 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002322 char str[1024];
2323 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002324 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead->region, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002325 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002326 else {
2327 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
2328 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
2329 }
2330
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002331 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
2332}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002333
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002334XGL_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 -06002335{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002336 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002337 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002338 return result;
2339}
2340
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002341XGL_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 -06002342{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002343 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002344 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002345 return result;
2346}
2347
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002348XGL_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 -06002349{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002350 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002351 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002352 return result;
2353}
2354
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002355XGL_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 -06002356{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002357 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002358 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002359 return result;
2360}
2361
2362XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2363{
2364 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002365 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002366 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002367 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002368#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002369 printf("Alloc33 #%lu pCB addr(%p)\n", ++g_alloc_count, (void*)pCB);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002370#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002371 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2372 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2373 g_pCmdBufferHead = pCB;
2374 pCB->cmdBuffer = *pCmdBuffer;
2375 pCB->flags = pCreateInfo->flags;
2376 pCB->queueType = pCreateInfo->queueType;
2377 pCB->lastVtxBinding = MAX_BINDING;
Tobin Ehlis45662712015-02-23 09:06:28 -07002378 g_lastCmdBuffer[getTIDIndex()] = *pCmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002379 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002380 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002381 return result;
2382}
2383
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002384XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002385{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002386 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002387 if (XGL_SUCCESS == result) {
2388 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002389 if (pCB) {
2390 if (CB_NEW != pCB->state)
2391 resetCB(cmdBuffer);
2392 pCB->state = CB_UPDATE_ACTIVE;
2393 }
2394 else {
2395 char str[1024];
2396 sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2397 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2398 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002399 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002400 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002401 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002402 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002403 return result;
2404}
2405
2406XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2407{
2408 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002409 if (XGL_SUCCESS == result) {
2410 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002411 if (pCB) {
2412 pCB->state = CB_UPDATE_COMPLETE;
2413 printCB(cmdBuffer);
2414 }
2415 else {
2416 char str[1024];
2417 sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2418 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2419 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002420 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002421 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002422 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc6310db2015-02-24 15:40:22 -07002423 cbDumpDotFile("cb_dump.dot");
Tobin Ehlis8cced212015-02-13 10:26:14 -07002424 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002425 return result;
2426}
2427
2428XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2429{
2430 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002431 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002432 resetCB(cmdBuffer);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002433 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002434 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002435 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002436 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002437 return result;
2438}
2439
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002440XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002441{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002442 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2443 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002444 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002445 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002446 if (getPipeline(pipeline)) {
2447 pCB->lastBoundPipeline = pipeline;
2448 }
2449 else {
2450 char str[1024];
2451 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2452 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2453 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002454 }
2455 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002456 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002457 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2458 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002459 }
2460 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2461}
2462
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002463XGL_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 -06002464{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002465 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2466 if (pCB) {
2467 // TODO : Handle storing Pipeline Deltas to cmd buffer here
Tobin Ehlis45662712015-02-23 09:06:28 -07002468 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002469 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2470 }
2471 else {
2472 char str[1024];
2473 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2474 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2475 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002476 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2477}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002478
2479XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2480{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002481 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002482 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2483}
2484
2485XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2486{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002487 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2488 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002489 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002490 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002491 if (getSetNode(descriptorSet)) {
2492 if (dsUpdateActive(descriptorSet)) {
Tobin Ehlis224dd812015-02-19 15:26:49 -07002493 // TODO : This check here needs to be made at QueueSubmit time
2494/*
Tobin Ehlis8cced212015-02-13 10:26:14 -07002495 char str[1024];
2496 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2497 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
Tobin Ehlis224dd812015-02-19 15:26:49 -07002498*/
Tobin Ehlis8cced212015-02-13 10:26:14 -07002499 }
2500 loader_platform_thread_lock_mutex(&globalLock);
2501 pCB->lastBoundDescriptorSet = descriptorSet;
2502 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002503 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002504 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2505 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002506 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002507 else {
2508 char str[1024];
2509 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2510 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2511 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002512 }
2513 else {
2514 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002515 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2516 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002517 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002518 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2519}
2520
2521XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2522{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002523 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2524 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002525 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002526 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002527 // TODO : Track idxBuffer binding
2528 }
2529 else {
2530 char str[1024];
2531 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2532 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2533 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002534 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2535}
2536
2537XGL_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 +08002538{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002539 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2540 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002541 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002542 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002543 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002544 }
2545 else {
2546 char str[1024];
2547 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2548 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2549 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002550 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002551}
2552
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002553XGL_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 -06002554{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002555 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2556 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002557 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002558 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002559 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002560 char str[1024];
2561 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2562 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2563 synchAndPrintDSConfig(cmdBuffer);
2564 }
2565 else {
2566 char str[1024];
2567 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2568 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2569 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002570 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2571}
2572
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002573XGL_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 -06002574{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002575 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2576 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002577 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002578 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002579 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002580 char str[1024];
2581 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2582 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2583 synchAndPrintDSConfig(cmdBuffer);
2584 }
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 Ehlis8726b9f2014-10-24 12:01:45 -06002590 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2591}
2592
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002593XGL_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 -06002594{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002595 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2596 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002597 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002598 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002599 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002600 char str[1024];
2601 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2602 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2603 synchAndPrintDSConfig(cmdBuffer);
2604 }
2605 else {
2606 char str[1024];
2607 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2608 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2609 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002610 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002611}
2612
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002613XGL_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 -06002614{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002615 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2616 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002617 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002618 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002619 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002620 char str[1024];
2621 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2622 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2623 synchAndPrintDSConfig(cmdBuffer);
2624 }
2625 else {
2626 char str[1024];
2627 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2628 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2629 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002630 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002631}
2632
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002633XGL_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 -06002634{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002635 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2636 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002637 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002638 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002639 }
2640 else {
2641 char str[1024];
2642 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2643 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2644 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002645 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2646}
2647
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002648XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002649{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002650 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2651 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002652 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002653 addCmd(pCB, CMD_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002654 }
2655 else {
2656 char str[1024];
2657 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2658 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2659 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002660 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002661}
2662
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002663XGL_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 -06002664{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002665 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2666 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002667 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002668 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002669 }
2670 else {
2671 char str[1024];
2672 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2673 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2674 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002675 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002676}
2677
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002678XGL_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 -06002679{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002680 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2681 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002682 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002683 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002684 }
2685 else {
2686 char str[1024];
2687 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2688 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2689 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002690 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2691}
2692
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002693XGL_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 -06002694{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002695 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2696 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002697 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002698 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002699 }
2700 else {
2701 char str[1024];
2702 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2703 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2704 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002705 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002706}
2707
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002708XGL_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 -06002709{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002710 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2711 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002712 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002713 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002714 }
2715 else {
2716 char str[1024];
2717 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2718 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2719 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002720 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002721}
2722
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002723XGL_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 -06002724{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002725 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2726 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002727 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002728 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002729 }
2730 else {
2731 char str[1024];
2732 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2733 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2734 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002735 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002736}
2737
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002738XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2739{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002740 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2741 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002742 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002743 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002744 }
2745 else {
2746 char str[1024];
2747 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2748 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2749 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002750 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2751}
2752
2753XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2754{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002755 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2756 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002757 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002758 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002759 }
2760 else {
2761 char str[1024];
2762 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2763 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2764 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002765 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2766}
2767
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002768XGL_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 -06002769{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002770 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2771 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002772 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002773 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002774 }
2775 else {
2776 char str[1024];
2777 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2778 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2779 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002780 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2781}
2782
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002783XGL_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 -06002784{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002785 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2786 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002787 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002788 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002789 }
2790 else {
2791 char str[1024];
2792 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2793 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2794 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002795 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2796}
2797
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002798XGL_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 -06002799{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002800 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2801 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002802 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002803 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002804 }
2805 else {
2806 char str[1024];
2807 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2808 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2809 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002810 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2811}
2812
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002813XGL_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 -06002814{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002815 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2816 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002817 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002818 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002819 }
2820 else {
2821 char str[1024];
2822 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2823 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2824 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002825 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2826}
2827
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002828XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002829{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002830 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2831 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002832 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002833 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002834 }
2835 else {
2836 char str[1024];
2837 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2838 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2839 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002840 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002841}
2842
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002843XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002844{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002845 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2846 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002847 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002848 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002849 }
2850 else {
2851 char str[1024];
2852 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2853 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2854 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002855 nextTable.CmdResetEvent(cmdBuffer, event);
2856}
2857
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002858XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002859{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002860 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2861 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002862 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002863 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002864 }
2865 else {
2866 char str[1024];
2867 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2868 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2869 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002870 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2871}
2872
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002873XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002874{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002875 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2876 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002877 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002878 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002879 }
2880 else {
2881 char str[1024];
2882 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2883 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2884 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002885 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2886}
2887
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002888XGL_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 -06002889{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002890 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2891 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002892 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002893 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002894 }
2895 else {
2896 char str[1024];
2897 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2898 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2899 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002900 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2901}
2902
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002903XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002904{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002905 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2906 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002907 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002908 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002909 }
2910 else {
2911 char str[1024];
2912 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2913 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2914 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002915 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2916}
2917
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002918XGL_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 -06002919{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002920 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2921 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002922 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002923 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002924 }
2925 else {
2926 char str[1024];
2927 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2928 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2929 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002930 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2931}
2932
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002933XGL_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 -06002934{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002935 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2936 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002937 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002938 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002939 }
2940 else {
2941 char str[1024];
2942 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2943 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2944 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002945 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002946}
2947
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002948XGL_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 -06002949{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002950 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2951 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002952 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002953 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002954 }
2955 else {
2956 char str[1024];
2957 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2958 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2959 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002960 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2961}
2962
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002963XGL_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 -06002964{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002965 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2966 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002967 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002968 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002969 }
2970 else {
2971 char str[1024];
2972 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2973 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2974 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002975 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002976}
2977
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002978XGL_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 -06002979{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002980 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2981 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002982 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002983 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002984 }
2985 else {
2986 char str[1024];
2987 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2988 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2989 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002990 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2991}
2992
2993XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2994{
2995 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
2996 return result;
2997}
2998
2999XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
3000{
3001 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
3002 return result;
3003}
3004
3005XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
3006{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003007 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
3008 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003009 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07003010 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07003011 }
3012 else {
3013 char str[1024];
3014 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
3015 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
3016 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003017 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
3018}
3019
3020XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
3021{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003022 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
3023 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003024 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07003025 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07003026 }
3027 else {
3028 char str[1024];
3029 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
3030 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
3031 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003032 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003033}
3034
3035XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
3036{
3037 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
3038 return result;
3039}
3040
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003042{
Tobin Ehlise79df942014-11-18 16:38:08 -07003043 // This layer intercepts callbacks
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003044 XGL_LAYER_DBG_FUNCTION_NODE* pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
3045#if ALLOC_DEBUG
3046 printf("Alloc34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pNewDbgFuncNode);
3047#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003048 if (!pNewDbgFuncNode)
3049 return XGL_ERROR_OUT_OF_MEMORY;
3050 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
3051 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003052 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
3053 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003054 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
3055 return result;
3056}
3057
3058XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
3059{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003060 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07003061 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
3062 while (pTrav) {
3063 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
3064 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003065 if (g_pDbgFunctionHead == pTrav)
3066 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003067#if ALLOC_DEBUG
3068 printf("Free34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pTrav);
3069#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003070 free(pTrav);
3071 break;
3072 }
3073 pPrev = pTrav;
3074 pTrav = pTrav->pNext;
3075 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003076 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
3077 return result;
3078}
3079
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003080XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003081{
3082 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
3083 return result;
3084}
3085
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003086XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003087{
3088 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
3089 return result;
3090}
3091
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003092XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003093{
3094 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
3095 return result;
3096}
3097
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003098XGL_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 -06003099{
3100 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
3101 return result;
3102}
3103
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003104XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003105{
3106 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
3107}
3108
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003109XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003110{
3111 nextTable.CmdDbgMarkerEnd(cmdBuffer);
3112}
3113
Ian Elliott81ac44c2015-01-13 17:52:38 -07003114#if defined(WIN32)
3115// FIXME: NEED WINDOWS EQUIVALENT
3116#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003117XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
3118{
3119 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003120 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003121 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003122 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003123 return result;
3124}
3125
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003126XGL_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 -06003127{
Chia-I Wu6204f342014-11-07 13:33:45 +08003128 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003129 return result;
3130}
3131
3132XGL_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)
3133{
3134 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
3135 return result;
3136}
3137
3138XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
3139{
3140 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
3141 return result;
3142}
Ian Elliott81ac44c2015-01-13 17:52:38 -07003143#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07003144// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003145void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003146{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003147 // TODO : Currently just setting cmdBuffer based on global var
Tobin Ehlis45662712015-02-23 09:06:28 -07003148 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003149}
3150
Tobin Ehlisc6310db2015-02-24 15:40:22 -07003151void drawStateDumpCommandBufferDotFile(char* outFileName)
3152{
3153 cbDumpDotFile(outFileName);
3154}
3155
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003156void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07003157{
Ian Elliott81ac44c2015-01-13 17:52:38 -07003158#if defined(_WIN32)
3159// FIXME: NEED WINDOWS EQUIVALENT
3160 char str[1024];
3161 sprintf(str, "Cannot execute dot program yet on Windows.");
3162 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3163#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003164 char dotExe[32] = "/usr/bin/dot";
3165 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003166 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07003167 char dotCmd[1024];
3168 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
3169 system(dotCmd);
3170 remove("/tmp/tmp.dot");
3171 }
3172 else {
3173 char str[1024];
3174 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
3175 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3176 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07003177#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003178}
3179
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003180XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003181{
3182 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08003183 void *addr;
3184
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003185 if (gpu == NULL)
3186 return NULL;
3187 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003188 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003189
Chia-I Wu706533e2015-01-05 13:18:57 +08003190 addr = layer_intercept_proc(funcName);
3191 if (addr)
3192 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003193 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003194 return drawStateDumpDotFile;
Tobin Ehlisc6310db2015-02-24 15:40:22 -07003195 else if (!strncmp("drawStateDumpCommandBufferDotFile", funcName, sizeof("drawStateDumpCommandBufferDotFile")))
3196 return drawStateDumpCommandBufferDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003197 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07003198 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003199 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003200 if (gpuw->pGPA == NULL)
3201 return NULL;
3202 return gpuw->pGPA(gpuw->nextObject, funcName);
3203 }
3204}