blob: 7dfc4d293e8849a3864512df6ac0eb21786c8d48 [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;
891 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI;
892 // 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
910 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS} ");
911 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
912 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
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001583 strOpt = getLayerOption("DrawStateReportLevel");
1584 if (strOpt != NULL)
1585 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001586
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001587 strOpt = getLayerOption("DrawStateDebugAction");
1588 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001589 g_debugAction = atoi(strOpt);
1590
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001591 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1592 {
1593 strOpt = getLayerOption("DrawStateLogFilename");
1594 if (strOpt)
1595 {
1596 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001597 }
1598 if (g_logFile == NULL)
1599 g_logFile = stdout;
1600 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001601 // initialize Layer dispatch table
1602 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001603 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001604 fpNextGPA = pCurObj->pGPA;
1605 assert(fpNextGPA);
1606
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001607 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1608
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001609 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001610 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001611
1612 if (!globalLockInitialized)
1613 {
1614 // TODO/TBD: Need to delete this mutex sometime. How??? One
1615 // suggestion is to call this during xglCreateInstance(), and then we
1616 // can clean it up during xglDestroyInstance(). However, that requires
1617 // that the layer have per-instance locks. We need to come back and
1618 // address this soon.
1619 loader_platform_thread_create_mutex(&globalLock);
1620 globalLockInitialized = 1;
1621 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001622}
1623
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001624XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1625{
1626 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1627 return result;
1628}
1629
1630XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1631{
1632 XGL_RESULT result = nextTable.DestroyInstance(instance);
1633 return result;
1634}
1635
1636XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1637{
1638 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1639 return result;
1640}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001641
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001642XGL_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 -06001643{
1644 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001645 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001646 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001647 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001648 return result;
1649}
1650
1651XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1652{
1653 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001654 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001655 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001656 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001657 return result;
1658}
1659
1660XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1661{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001662 // Free all the memory
1663 loader_platform_thread_lock_mutex(&globalLock);
1664 freePipelines();
1665 freeSamplers();
1666 freeImages();
1667 freeBuffers();
1668 freeCmdBuffers();
1669 freeDynamicState();
1670 freeRegions();
1671 freeLayouts();
1672 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001673 XGL_RESULT result = nextTable.DestroyDevice(device);
1674 return result;
1675}
1676
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001677XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001678{
1679 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001680 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001681 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001682 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001683 return result;
1684}
1685
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001686XGL_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 -06001687{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001688 if (gpu != NULL)
1689 {
1690 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1691 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001692 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001693 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001694 return result;
1695 } else
1696 {
1697 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1698 return XGL_ERROR_INVALID_POINTER;
1699 // This layer compatible with all GPUs
1700 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001701 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001702 return XGL_SUCCESS;
1703 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001704}
1705
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001706XGL_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 -06001707{
1708 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1709 return result;
1710}
1711
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001712XGL_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 -06001713{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001714 for (uint32_t i=0; i < cmdBufferCount; i++) {
1715 // Validate that cmd buffers have been updated
1716 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001717 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1718 return result;
1719}
1720
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001721XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001722{
1723 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1724 return result;
1725}
1726
1727XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1728{
1729 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1730 return result;
1731}
1732
1733XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1734{
1735 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1736 return result;
1737}
1738
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001739XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1740{
1741 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1742 return result;
1743}
1744
1745XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1746{
1747 XGL_RESULT result = nextTable.FreeMemory(mem);
1748 return result;
1749}
1750
1751XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1752{
1753 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1754 return result;
1755}
1756
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001757XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001758{
1759 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1760 return result;
1761}
1762
1763XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1764{
1765 XGL_RESULT result = nextTable.UnmapMemory(mem);
1766 return result;
1767}
1768
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001769XGL_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 -06001770{
1771 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1772 return result;
1773}
1774
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001775XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1776{
1777 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001778 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001779 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001780 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001781 return result;
1782}
1783
1784XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1785{
1786 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1787 return result;
1788}
1789
1790XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1791{
1792 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1793 return result;
1794}
1795
1796XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1797{
1798 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1799 return result;
1800}
1801
1802XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1803{
1804 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1805 return result;
1806}
1807
1808XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1809{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001810 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001811 XGL_RESULT result = nextTable.DestroyObject(object);
1812 return result;
1813}
1814
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001815XGL_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 -06001816{
1817 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1818 return result;
1819}
1820
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001821XGL_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 -06001822{
Jon Ashburned62b412015-01-15 10:39:19 -07001823 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001824 return result;
1825}
1826
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001827XGL_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)
1828{
1829 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1830 return result;
1831}
1832
1833XGL_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)
1834{
1835 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1836 return result;
1837}
1838
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001839XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1840{
1841 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1842 return result;
1843}
1844
1845XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1846{
1847 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1848 return result;
1849}
1850
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001851XGL_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 -06001852{
1853 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1854 return result;
1855}
1856
1857XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1858{
1859 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1860 return result;
1861}
1862
1863XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1864{
1865 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1866 return result;
1867}
1868
1869XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1870{
1871 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1872 return result;
1873}
1874
1875XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1876{
1877 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1878 return result;
1879}
1880
1881XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1882{
1883 XGL_RESULT result = nextTable.GetEventStatus(event);
1884 return result;
1885}
1886
1887XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1888{
1889 XGL_RESULT result = nextTable.SetEvent(event);
1890 return result;
1891}
1892
1893XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1894{
1895 XGL_RESULT result = nextTable.ResetEvent(event);
1896 return result;
1897}
1898
1899XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1900{
1901 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1902 return result;
1903}
1904
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001905XGL_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 -06001906{
1907 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1908 return result;
1909}
1910
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001911XGL_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 -06001912{
1913 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1914 return result;
1915}
1916
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001917XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1918{
1919 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
1920 return result;
1921}
1922
1923XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1924{
1925 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Tobin Ehlis59d32c42015-02-24 09:16:47 -07001926 if (XGL_SUCCESS == result) {
1927 loader_platform_thread_lock_mutex(&globalLock);
1928 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1929#if ALLOC_DEBUG
1930 printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1931#endif
1932 pNewNode->buffer = *pView;
1933 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO));
1934 pNewNode->pNext = g_pBufferHead;
1935 g_pBufferHead = pNewNode;
1936 loader_platform_thread_unlock_mutex(&globalLock);
1937 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001938 return result;
1939}
1940
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001941XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1942{
1943 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1944 return result;
1945}
1946
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001947XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1948{
1949 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1950 return result;
1951}
1952
1953XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1954{
1955 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1956 return result;
1957}
1958
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001959XGL_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 -06001960{
1961 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1962 return result;
1963}
1964
1965XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1966{
1967 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001968 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001969 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001970 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001971#if ALLOC_DEBUG
1972 printf("Alloc22 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1973#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001974 pNewNode->image = *pView;
1975 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1976 pNewNode->pNext = g_pImageHead;
1977 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001978 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001979 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001980 return result;
1981}
1982
1983XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1984{
1985 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1986 return result;
1987}
1988
1989XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1990{
1991 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1992 return result;
1993}
1994
1995XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1996{
1997 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1998 return result;
1999}
2000
2001XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
2002{
2003 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
2004 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07002005 char str[1024];
2006 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
2007 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07002008 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002009 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002010 if (pTrav) {
2011 while (pTrav->pNext)
2012 pTrav = pTrav->pNext;
2013 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002014#if ALLOC_DEBUG
2015 printf("Alloc23 #%lu pTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pTrav->pNext);
2016#endif
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002017 pTrav = pTrav->pNext;
2018 }
2019 else {
2020 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002021#if ALLOC_DEBUG
2022 printf("Alloc24 #%lu pTrav addr(%p)\n", ++g_alloc_count, (void*)pTrav);
2023#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002024 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002025 }
2026 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
2027 pTrav->pipeline = *pPipeline;
2028 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07002029 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002030 return result;
2031}
2032
2033XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
2034{
2035 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
2036 return result;
2037}
2038
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002039XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002040{
2041 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
2042 return result;
2043}
2044
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002045XGL_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 -06002046{
2047 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
2048 return result;
2049}
2050
2051XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
2052{
2053 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
2054 return result;
2055}
2056
2057XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
2058{
2059 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002060 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07002061 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002062 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002063#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002064 printf("Alloc25 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002065#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002066 pNewNode->sampler = *pSampler;
2067 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
2068 pNewNode->pNext = g_pSamplerHead;
2069 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002070 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002071 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002072 return result;
2073}
2074
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002075XGL_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)
2076{
2077 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
2078 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002079 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002080#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002081 printf("Alloc26 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002082#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002083 if (NULL == pNewNode) {
2084 char str[1024];
2085 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
2086 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2087 }
2088 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002089 // TODO : API Currently missing a count here that we should multiply by struct size
2090 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002091#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002092 printf("Alloc27 #%lu pNewNode->pCreateInfoList addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pCreateInfoList);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002093#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002094 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002095 void* pCITrav = NULL;
2096 uint32_t totalCount = 0;
2097 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07002098 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002099 pCITrav = (void*)pSetLayoutInfoList->pNext;
2100 totalCount = pSetLayoutInfoList->count;
2101 }
2102 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
2103 while (pCITrav) {
2104 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
2105 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002106#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002107 printf("Alloc28 #%lu *ppNext addr(%p)\n", ++g_alloc_count, (void*)*ppNext);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002108#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002109 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
2110 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002111 ppNext = (void**)&((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002112 }
2113 if (totalCount > 0) {
2114 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002115#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002116 printf("Alloc29 #%lu pNewNode->pTypes addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pTypes);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002117#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002118 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002119 uint32_t offset = 0;
2120 uint32_t i = 0;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002121 while (pLCI) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07002122 for (i = 0; i < pLCI->count; i++) {
2123 pNewNode->pTypes[offset + i] = pLCI->descriptorType;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002124 }
Tobin Ehlis82871a82015-02-19 09:55:18 -07002125 offset += i;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002126 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
2127 }
2128 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002129 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002130 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002131 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002132 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
2133 assert(i < XGL_NUM_SHADER_STAGE);
2134 if (stage & stageFlags)
2135 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07002136 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002137 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002138 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002139 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
2140 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002141 if (NULL != priorSetLayout && pPriorNode == NULL) {
2142 char str[1024];
2143 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
2144 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2145 }
2146 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
2147 // Get count for prior layout
2148 pNewNode->startIndex = pPriorNode->endIndex + 1;
2149 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07002150 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002151 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002152 pNewNode->pPriorSetLayout = pPriorNode;
2153 // Put new node at Head of global Layer list
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002154 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002155 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002156 g_pLayoutHead = pNewNode;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002157 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002158 }
2159 return result;
2160}
2161
2162XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
2163{
2164 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
2165 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002166 loader_platform_thread_lock_mutex(&globalLock);
2167 REGION_NODE* pRegionNode = g_pRegionHead;
2168 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002169 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002170 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2171 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002172 }
2173 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002174 pRegionNode->updateActive = 1;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002175 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002176 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002177 }
2178 return result;
2179}
2180
2181XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
2182{
2183 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
2184 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002185 loader_platform_thread_lock_mutex(&globalLock);
2186 REGION_NODE* pRegionNode = g_pRegionHead;
2187 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002188 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002189 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2190 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002191 }
2192 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002193 if (!pRegionNode->updateActive) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002194 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002195 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
2196 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 -07002197 }
2198 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002199 pRegionNode->updateActive = 0;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002200 }
2201 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002202 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002203 }
2204 return result;
2205}
2206
2207XGL_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)
2208{
2209 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
2210 if (XGL_SUCCESS == result) {
2211 // Insert this region into Global Region LL at head
2212 char str[1024];
2213 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
2214 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002215 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002216 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002217#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002218 printf("Alloc30 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002219#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002220 if (NULL == pNewNode) {
2221 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002222 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002223 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2224 }
2225 else {
2226 memset(pNewNode, 0, sizeof(REGION_NODE));
2227 pNewNode->pNext = g_pRegionHead;
2228 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002229 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
2230 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
2231 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07002232 if (typeCountSize) {
2233 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
2234 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002235#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002236 printf("Alloc31 #%lu *ppTypeCount addr(%p)\n", ++g_alloc_count, (void*)*ppTypeCount);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002237#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002238 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
2239 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002240 pNewNode->regionUsage = regionUsage;
2241 pNewNode->updateActive = 0;
2242 pNewNode->maxSets = maxSets;
2243 pNewNode->region = *pDescriptorRegion;
2244 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002245 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002246 }
2247 else {
2248 // Need to do anything if region create fails?
2249 }
2250 return result;
2251}
2252
2253XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
2254{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002255 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002256 if (XGL_SUCCESS == result) {
2257 clearDescriptorRegion(descriptorRegion);
2258 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002259 return result;
2260}
2261
2262XGL_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)
2263{
2264 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002265 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
2266 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
2267 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002268 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002269 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002270 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002271 }
2272 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002273 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002274 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002275 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002276 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002277 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002278 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002279#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07002280 printf("Alloc32 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002281#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002282 if (NULL == pNewNode) {
2283 char str[1024];
2284 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002285 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 -07002286 }
2287 else {
2288 memset(pNewNode, 0, sizeof(SET_NODE));
2289 // Insert set at head of Set LL for this region
2290 pNewNode->pNext = pRegionNode->pSets;
2291 pRegionNode->pSets = pNewNode;
2292 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
2293 if (NULL == pLayout) {
2294 char str[1024];
2295 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
2296 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2297 }
2298 pNewNode->pLayouts = pLayout;
2299 pNewNode->region = descriptorRegion;
2300 pNewNode->set = pDescriptorSets[i];
2301 pNewNode->setUsage = setUsage;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07002302 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002303 size_t descriptorArraySize = sizeof(GENERIC_HEADER*)*pNewNode->descriptorCount;
2304 pNewNode->ppDescriptors = (GENERIC_HEADER**)malloc(descriptorArraySize);
2305#if ALLOC_DEBUG
2306 printf("Alloc35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_alloc_count, (void*)pNewNode->ppDescriptors);
2307#endif
2308 memset(pNewNode->ppDescriptors, 0, descriptorArraySize);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002309 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002310 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002311 }
2312 }
2313 return result;
2314}
2315
2316XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
2317{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002318 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002319 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002320 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002321 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
2322}
2323
2324XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
2325{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002326 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002327 char str[1024];
2328 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002329 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 -07002330 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002331 else {
2332 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
2333 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
2334 }
2335
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002336 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
2337}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002338
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002339XGL_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 -06002340{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002341 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002342 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002343 return result;
2344}
2345
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002346XGL_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 -06002347{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002348 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002349 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002350 return result;
2351}
2352
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002353XGL_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 -06002354{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002355 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002356 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002357 return result;
2358}
2359
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002360XGL_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 -06002361{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002362 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002363 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002364 return result;
2365}
2366
2367XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2368{
2369 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002370 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002371 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002372 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002373#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002374 printf("Alloc33 #%lu pCB addr(%p)\n", ++g_alloc_count, (void*)pCB);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002375#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002376 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2377 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2378 g_pCmdBufferHead = pCB;
2379 pCB->cmdBuffer = *pCmdBuffer;
2380 pCB->flags = pCreateInfo->flags;
2381 pCB->queueType = pCreateInfo->queueType;
2382 pCB->lastVtxBinding = MAX_BINDING;
Tobin Ehlis45662712015-02-23 09:06:28 -07002383 g_lastCmdBuffer[getTIDIndex()] = *pCmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002384 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002385 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002386 return result;
2387}
2388
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002389XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002390{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002391 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002392 if (XGL_SUCCESS == result) {
2393 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002394 if (pCB) {
2395 if (CB_NEW != pCB->state)
2396 resetCB(cmdBuffer);
2397 pCB->state = CB_UPDATE_ACTIVE;
2398 }
2399 else {
2400 char str[1024];
2401 sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2402 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2403 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002404 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002405 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002406 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002407 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002408 return result;
2409}
2410
2411XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2412{
2413 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002414 if (XGL_SUCCESS == result) {
2415 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002416 if (pCB) {
2417 pCB->state = CB_UPDATE_COMPLETE;
2418 printCB(cmdBuffer);
2419 }
2420 else {
2421 char str[1024];
2422 sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2423 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2424 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002425 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002426 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002427 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc6310db2015-02-24 15:40:22 -07002428 cbDumpDotFile("cb_dump.dot");
Tobin Ehlis8cced212015-02-13 10:26:14 -07002429 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002430 return result;
2431}
2432
2433XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2434{
2435 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002436 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002437 resetCB(cmdBuffer);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002438 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002439 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002440 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002441 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002442 return result;
2443}
2444
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002445XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002446{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002447 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2448 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002449 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002450 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002451 if (getPipeline(pipeline)) {
2452 pCB->lastBoundPipeline = pipeline;
2453 }
2454 else {
2455 char str[1024];
2456 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2457 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2458 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002459 }
2460 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002461 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002462 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2463 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002464 }
2465 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2466}
2467
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002468XGL_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 -06002469{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002470 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2471 if (pCB) {
2472 // TODO : Handle storing Pipeline Deltas to cmd buffer here
Tobin Ehlis45662712015-02-23 09:06:28 -07002473 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002474 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2475 }
2476 else {
2477 char str[1024];
2478 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2479 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2480 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002481 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2482}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002483
2484XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2485{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002486 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002487 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2488}
2489
2490XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2491{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002492 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2493 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002494 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002495 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002496 if (getSetNode(descriptorSet)) {
2497 if (dsUpdateActive(descriptorSet)) {
Tobin Ehlis224dd812015-02-19 15:26:49 -07002498 // TODO : This check here needs to be made at QueueSubmit time
2499/*
Tobin Ehlis8cced212015-02-13 10:26:14 -07002500 char str[1024];
2501 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2502 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 -07002503*/
Tobin Ehlis8cced212015-02-13 10:26:14 -07002504 }
2505 loader_platform_thread_lock_mutex(&globalLock);
2506 pCB->lastBoundDescriptorSet = descriptorSet;
2507 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002508 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002509 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2510 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002511 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002512 else {
2513 char str[1024];
2514 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2515 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2516 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002517 }
2518 else {
2519 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002520 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2521 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002522 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002523 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2524}
2525
2526XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2527{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002528 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2529 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002530 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002531 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002532 // TODO : Track idxBuffer binding
2533 }
2534 else {
2535 char str[1024];
2536 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2537 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2538 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002539 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2540}
2541
2542XGL_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 +08002543{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002544 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2545 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002546 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002547 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002548 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002549 }
2550 else {
2551 char str[1024];
2552 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2553 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2554 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002555 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002556}
2557
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002558XGL_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 -06002559{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002560 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2561 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002562 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002563 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002564 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002565 char str[1024];
2566 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2567 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2568 synchAndPrintDSConfig(cmdBuffer);
2569 }
2570 else {
2571 char str[1024];
2572 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2573 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2574 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002575 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2576}
2577
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002578XGL_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 -06002579{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002580 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2581 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002582 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002583 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002584 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002585 char str[1024];
2586 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2587 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2588 synchAndPrintDSConfig(cmdBuffer);
2589 }
2590 else {
2591 char str[1024];
2592 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2593 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2594 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002595 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2596}
2597
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002598XGL_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 -06002599{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002600 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2601 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002602 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002603 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002604 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002605 char str[1024];
2606 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2607 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2608 synchAndPrintDSConfig(cmdBuffer);
2609 }
2610 else {
2611 char str[1024];
2612 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2613 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2614 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002615 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002616}
2617
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002618XGL_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 -06002619{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002620 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2621 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002622 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002623 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002624 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002625 char str[1024];
2626 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2627 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2628 synchAndPrintDSConfig(cmdBuffer);
2629 }
2630 else {
2631 char str[1024];
2632 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2633 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2634 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002635 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002636}
2637
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002638XGL_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 -06002639{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002640 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2641 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002642 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002643 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002644 }
2645 else {
2646 char str[1024];
2647 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2648 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2649 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002650 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2651}
2652
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002653XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002654{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002655 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2656 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002657 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002658 addCmd(pCB, CMD_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002659 }
2660 else {
2661 char str[1024];
2662 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2663 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2664 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002665 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002666}
2667
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002668XGL_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 -06002669{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002670 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2671 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002672 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002673 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002674 }
2675 else {
2676 char str[1024];
2677 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2678 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2679 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002680 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002681}
2682
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002683XGL_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 -06002684{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002685 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2686 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002687 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002688 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002689 }
2690 else {
2691 char str[1024];
2692 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2693 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2694 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002695 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2696}
2697
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002698XGL_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 -06002699{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002700 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2701 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002702 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002703 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002704 }
2705 else {
2706 char str[1024];
2707 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2708 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2709 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002710 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002711}
2712
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002713XGL_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 -06002714{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002715 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2716 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002717 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002718 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002719 }
2720 else {
2721 char str[1024];
2722 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2723 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2724 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002725 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002726}
2727
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002728XGL_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 -06002729{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002730 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2731 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002732 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002733 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002734 }
2735 else {
2736 char str[1024];
2737 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2738 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2739 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002740 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002741}
2742
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002743XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2744{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002745 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2746 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002747 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002748 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002749 }
2750 else {
2751 char str[1024];
2752 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2753 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2754 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002755 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2756}
2757
2758XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2759{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002760 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2761 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002762 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002763 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002764 }
2765 else {
2766 char str[1024];
2767 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2768 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2769 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002770 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2771}
2772
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002773XGL_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 -06002774{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002775 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2776 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002777 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002778 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002779 }
2780 else {
2781 char str[1024];
2782 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2783 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2784 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002785 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2786}
2787
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002788XGL_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 -06002789{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002790 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2791 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002792 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002793 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002794 }
2795 else {
2796 char str[1024];
2797 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2798 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2799 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002800 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2801}
2802
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002803XGL_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 -06002804{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002805 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2806 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002807 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002808 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002809 }
2810 else {
2811 char str[1024];
2812 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2813 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2814 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002815 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2816}
2817
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002818XGL_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 -06002819{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002820 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2821 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002822 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002823 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002824 }
2825 else {
2826 char str[1024];
2827 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2828 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2829 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002830 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2831}
2832
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002833XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002834{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002835 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2836 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002837 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002838 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002839 }
2840 else {
2841 char str[1024];
2842 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2843 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2844 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002845 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002846}
2847
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002848XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002849{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002850 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2851 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002852 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002853 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002854 }
2855 else {
2856 char str[1024];
2857 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2858 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2859 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002860 nextTable.CmdResetEvent(cmdBuffer, event);
2861}
2862
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002863XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002864{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002865 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2866 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002867 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002868 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002869 }
2870 else {
2871 char str[1024];
2872 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2873 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2874 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002875 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2876}
2877
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002878XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002879{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002880 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2881 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002882 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002883 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002884 }
2885 else {
2886 char str[1024];
2887 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2888 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2889 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002890 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2891}
2892
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002893XGL_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 -06002894{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002895 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2896 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002897 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002898 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002899 }
2900 else {
2901 char str[1024];
2902 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2903 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2904 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002905 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2906}
2907
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002908XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002909{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002910 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2911 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002912 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002913 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002914 }
2915 else {
2916 char str[1024];
2917 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2918 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2919 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002920 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2921}
2922
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002923XGL_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 -06002924{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002925 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2926 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002927 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002928 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002929 }
2930 else {
2931 char str[1024];
2932 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2933 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2934 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002935 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2936}
2937
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002938XGL_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 -06002939{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002940 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2941 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002942 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002943 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002944 }
2945 else {
2946 char str[1024];
2947 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2948 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2949 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002950 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002951}
2952
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002953XGL_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 -06002954{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002955 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2956 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002957 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002958 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002959 }
2960 else {
2961 char str[1024];
2962 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2963 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2964 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002965 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2966}
2967
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002968XGL_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 -06002969{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002970 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2971 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002972 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002973 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002974 }
2975 else {
2976 char str[1024];
2977 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2978 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2979 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002980 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002981}
2982
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002983XGL_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 -06002984{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002985 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2986 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002987 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002988 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002989 }
2990 else {
2991 char str[1024];
2992 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2993 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2994 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002995 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2996}
2997
2998XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2999{
3000 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
3001 return result;
3002}
3003
3004XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
3005{
3006 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
3007 return result;
3008}
3009
3010XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
3011{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003012 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
3013 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003014 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07003015 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07003016 }
3017 else {
3018 char str[1024];
3019 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
3020 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
3021 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003022 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
3023}
3024
3025XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
3026{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003027 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
3028 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003029 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07003030 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07003031 }
3032 else {
3033 char str[1024];
3034 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
3035 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
3036 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003037 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003038}
3039
3040XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
3041{
3042 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
3043 return result;
3044}
3045
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003046XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003047{
Tobin Ehlise79df942014-11-18 16:38:08 -07003048 // This layer intercepts callbacks
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003049 XGL_LAYER_DBG_FUNCTION_NODE* pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
3050#if ALLOC_DEBUG
3051 printf("Alloc34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pNewDbgFuncNode);
3052#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003053 if (!pNewDbgFuncNode)
3054 return XGL_ERROR_OUT_OF_MEMORY;
3055 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
3056 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003057 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
3058 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003059 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
3060 return result;
3061}
3062
3063XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
3064{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003065 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07003066 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
3067 while (pTrav) {
3068 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
3069 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003070 if (g_pDbgFunctionHead == pTrav)
3071 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003072#if ALLOC_DEBUG
3073 printf("Free34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pTrav);
3074#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003075 free(pTrav);
3076 break;
3077 }
3078 pPrev = pTrav;
3079 pTrav = pTrav->pNext;
3080 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003081 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
3082 return result;
3083}
3084
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003085XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003086{
3087 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
3088 return result;
3089}
3090
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003091XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003092{
3093 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
3094 return result;
3095}
3096
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003097XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003098{
3099 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
3100 return result;
3101}
3102
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003103XGL_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 -06003104{
3105 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
3106 return result;
3107}
3108
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003109XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003110{
3111 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
3112}
3113
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003114XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003115{
3116 nextTable.CmdDbgMarkerEnd(cmdBuffer);
3117}
3118
Ian Elliott81ac44c2015-01-13 17:52:38 -07003119#if defined(WIN32)
3120// FIXME: NEED WINDOWS EQUIVALENT
3121#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003122XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
3123{
3124 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003125 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003126 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003127 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003128 return result;
3129}
3130
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003131XGL_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 -06003132{
Chia-I Wu6204f342014-11-07 13:33:45 +08003133 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003134 return result;
3135}
3136
3137XGL_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)
3138{
3139 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
3140 return result;
3141}
3142
3143XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
3144{
3145 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
3146 return result;
3147}
Ian Elliott81ac44c2015-01-13 17:52:38 -07003148#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07003149// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003150void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003151{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003152 // TODO : Currently just setting cmdBuffer based on global var
Tobin Ehlis45662712015-02-23 09:06:28 -07003153 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003154}
3155
Tobin Ehlisc6310db2015-02-24 15:40:22 -07003156void drawStateDumpCommandBufferDotFile(char* outFileName)
3157{
3158 cbDumpDotFile(outFileName);
3159}
3160
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003161void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07003162{
Ian Elliott81ac44c2015-01-13 17:52:38 -07003163#if defined(_WIN32)
3164// FIXME: NEED WINDOWS EQUIVALENT
3165 char str[1024];
3166 sprintf(str, "Cannot execute dot program yet on Windows.");
3167 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3168#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003169 char dotExe[32] = "/usr/bin/dot";
3170 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003171 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07003172 char dotCmd[1024];
3173 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
3174 system(dotCmd);
3175 remove("/tmp/tmp.dot");
3176 }
3177 else {
3178 char str[1024];
3179 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
3180 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3181 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07003182#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003183}
3184
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003185XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003186{
3187 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08003188 void *addr;
3189
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003190 if (gpu == NULL)
3191 return NULL;
3192 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003193 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003194
Chia-I Wu706533e2015-01-05 13:18:57 +08003195 addr = layer_intercept_proc(funcName);
3196 if (addr)
3197 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003198 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003199 return drawStateDumpDotFile;
Tobin Ehlisc6310db2015-02-24 15:40:22 -07003200 else if (!strncmp("drawStateDumpCommandBufferDotFile", funcName, sizeof("drawStateDumpCommandBufferDotFile")))
3201 return drawStateDumpCommandBufferDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003202 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07003203 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003204 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003205 if (gpuw->pGPA == NULL)
3206 return NULL;
3207 return gpuw->pGPA(gpuw->nextObject, funcName);
3208 }
3209}