blob: f6ba20a826a497b2471cc95a8cfbeae1e84f76ea [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 Ehlis04f80bb2015-02-11 13:13:18 -07001391
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001392// Dump a GraphViz dot file showing the pipeline
Tobin Ehlis8cced212015-02-13 10:26:14 -07001393static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001394{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001395 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1396 if (pCB) {
1397 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1398 if (pPipeTrav) {
1399 FILE* pOutFile;
1400 pOutFile = fopen(outFileName, "w");
1401 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1402 fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001403 char* pGVstr = NULL;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001404 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07001405 if (pCB->lastBoundDynamicState[i] && pCB->lastBoundDynamicState[i]->pCreateInfo) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001406 pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i));
1407 fprintf(pOutFile, "%s", pGVstr);
1408 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001409 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001410 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001411 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
1412 fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001413 pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD");
1414 fprintf(pOutFile, "%s", pGVstr);
1415 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001416 fprintf(pOutFile, "}\n");
1417 dsDumpDot(cb, pOutFile);
1418 fprintf(pOutFile, "}\n"); // close main graph "g"
1419 fclose(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001420 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001421 }
1422}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001423// Synch up currently bound pipeline settings with DS mappings
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001424// 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 -07001425static void synchDSMapping(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001426{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001427 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1428 if (pCB && pCB->lastBoundPipeline) {
1429 // First verify that we have a Node for bound pipeline
1430 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1431 char str[1024];
1432 if (!pPipeTrav) {
1433 sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline);
1434 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
1435 }
1436 else {
1437 // Verify Vtx binding
1438 if (MAX_BINDING != pCB->lastVtxBinding) {
1439 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) {
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001440 if (0 == pPipeTrav->vtxBindingCount) {
1441 sprintf(str, "Vtx Buffer Index %u was bound, but no vtx buffers are attached to PSO.", pCB->lastVtxBinding);
1442 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1443 }
1444 else {
1445 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
1446 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1447 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001448 }
1449 else {
1450 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : ");
1451 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
1452 free(tmpStr);
1453 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001454 }
1455 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001456 }
1457}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001458// Print details of DS config to stdout
Tobin Ehlis8cced212015-02-13 10:26:14 -07001459static void printDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001460{
Tobin Ehlise79df942014-11-18 16:38:08 -07001461 char tmp_str[1024];
1462 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 -07001463 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1464 if (pCB) {
1465 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1466 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001467 // Print out region details
1468 sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region);
1469 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001470 char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " ");
1471 sprintf(ds_config_str, "%s", pRegionStr);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001472 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001473 free(pRegionStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001474 // Print out set details
1475 char prefix[10];
1476 uint32_t index = 0;
1477 sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set);
1478 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1479 LAYOUT_NODE* pLayout = pSet->pLayouts;
1480 while (pLayout) {
1481 // Print layout details
1482 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 -07001483 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001484 sprintf(prefix, " [L%u] ", index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001485 char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix);
1486 sprintf(ds_config_str, "%s", pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001487 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001488 free(pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001489 pLayout = pLayout->pPriorSetLayout;
1490 index++;
1491 }
1492 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
1493 if (pUpdate) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001494 sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
1495 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1496 sprintf(prefix, " [UC] ");
1497 sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix));
1498 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
1499 // TODO : If there is a "view" associated with this update, print CI for that view
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001500 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001501 else {
1502 sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set);
1503 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1504 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001505 }
1506}
1507
Tobin Ehlisd092d232015-02-13 13:30:07 -07001508static void printCB(const XGL_CMD_BUFFER cb)
1509{
1510 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1511 if (pCB) {
1512 char str[1024];
1513 CMD_NODE* pCmd = pCB->pCmds;
1514 sprintf(str, "Cmds in CB %p", (void*)cb);
1515 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
1516 while (pCmd) {
1517 sprintf(str, " CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type));
1518 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str);
1519 pCmd = pCmd->pNext;
1520 }
1521 }
1522 else {
1523 // Nothing to print
1524 }
1525}
1526
Tobin Ehlis8cced212015-02-13 10:26:14 -07001527static void synchAndDumpDot(const XGL_CMD_BUFFER cb)
Jeremy Hayes668ca052015-01-29 13:03:36 -07001528{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001529 synchDSMapping(cb);
1530 dumpDotFile(cb, "pipeline_dump.dot");
Jeremy Hayes668ca052015-01-29 13:03:36 -07001531}
1532
Tobin Ehlis8cced212015-02-13 10:26:14 -07001533static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001534{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001535 synchDSMapping(cb);
1536 printDSConfig(cb);
1537 printPipeline(cb);
1538 printDynamicState(cb);
Tobin Ehlis224dd812015-02-19 15:26:49 -07001539 static int autoDumpOnce = 0;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001540 if (autoDumpOnce) {
1541 autoDumpOnce = 0;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001542 dumpDotFile(cb, "pipeline_dump.dot");
Ian Elliott81ac44c2015-01-13 17:52:38 -07001543#if defined(_WIN32)
1544// FIXME: NEED WINDOWS EQUIVALENT
1545#else // WIN32
Jeremy Hayes9c50d832015-02-12 16:15:58 -07001546 // Convert dot to svg if dot available
Tobin Ehlis266473d2014-12-16 17:34:50 -07001547 if(access( "/usr/bin/dot", X_OK) != -1) {
Jeremy Hayes9c50d832015-02-12 16:15:58 -07001548 system("/usr/bin/dot pipeline_dump.dot -Tsvg -o pipeline_dump.svg");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001549 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001550#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001551 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001552}
1553
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001554static void initDrawState(void)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001555{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001556 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001557 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001558 strOpt = getLayerOption("DrawStateReportLevel");
1559 if (strOpt != NULL)
1560 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001561
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001562 strOpt = getLayerOption("DrawStateDebugAction");
1563 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001564 g_debugAction = atoi(strOpt);
1565
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001566 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1567 {
1568 strOpt = getLayerOption("DrawStateLogFilename");
1569 if (strOpt)
1570 {
1571 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001572 }
1573 if (g_logFile == NULL)
1574 g_logFile = stdout;
1575 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001576 // initialize Layer dispatch table
1577 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001578 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001579 fpNextGPA = pCurObj->pGPA;
1580 assert(fpNextGPA);
1581
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001582 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1583
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001584 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001585 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001586
1587 if (!globalLockInitialized)
1588 {
1589 // TODO/TBD: Need to delete this mutex sometime. How??? One
1590 // suggestion is to call this during xglCreateInstance(), and then we
1591 // can clean it up during xglDestroyInstance(). However, that requires
1592 // that the layer have per-instance locks. We need to come back and
1593 // address this soon.
1594 loader_platform_thread_create_mutex(&globalLock);
1595 globalLockInitialized = 1;
1596 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001597}
1598
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001599XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1600{
1601 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1602 return result;
1603}
1604
1605XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1606{
1607 XGL_RESULT result = nextTable.DestroyInstance(instance);
1608 return result;
1609}
1610
1611XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1612{
1613 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1614 return result;
1615}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001616
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001617XGL_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 -06001618{
1619 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001620 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001621 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001622 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001623 return result;
1624}
1625
1626XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1627{
1628 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001629 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001630 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001631 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001632 return result;
1633}
1634
1635XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1636{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001637 // Free all the memory
1638 loader_platform_thread_lock_mutex(&globalLock);
1639 freePipelines();
1640 freeSamplers();
1641 freeImages();
1642 freeBuffers();
1643 freeCmdBuffers();
1644 freeDynamicState();
1645 freeRegions();
1646 freeLayouts();
1647 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001648 XGL_RESULT result = nextTable.DestroyDevice(device);
1649 return result;
1650}
1651
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001652XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001653{
1654 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001655 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001656 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001657 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001658 return result;
1659}
1660
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001661XGL_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 -06001662{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001663 if (gpu != NULL)
1664 {
1665 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1666 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001667 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001668 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001669 return result;
1670 } else
1671 {
1672 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1673 return XGL_ERROR_INVALID_POINTER;
1674 // This layer compatible with all GPUs
1675 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001676 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001677 return XGL_SUCCESS;
1678 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001679}
1680
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001681XGL_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 -06001682{
1683 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1684 return result;
1685}
1686
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001687XGL_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 -06001688{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001689 for (uint32_t i=0; i < cmdBufferCount; i++) {
1690 // Validate that cmd buffers have been updated
1691 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001692 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1693 return result;
1694}
1695
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001696XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001697{
1698 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1699 return result;
1700}
1701
1702XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1703{
1704 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1705 return result;
1706}
1707
1708XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1709{
1710 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1711 return result;
1712}
1713
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001714XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1715{
1716 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1717 return result;
1718}
1719
1720XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1721{
1722 XGL_RESULT result = nextTable.FreeMemory(mem);
1723 return result;
1724}
1725
1726XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1727{
1728 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1729 return result;
1730}
1731
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001732XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001733{
1734 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1735 return result;
1736}
1737
1738XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1739{
1740 XGL_RESULT result = nextTable.UnmapMemory(mem);
1741 return result;
1742}
1743
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001744XGL_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 -06001745{
1746 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1747 return result;
1748}
1749
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001750XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1751{
1752 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001753 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001754 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001755 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001756 return result;
1757}
1758
1759XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1760{
1761 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1762 return result;
1763}
1764
1765XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1766{
1767 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1768 return result;
1769}
1770
1771XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1772{
1773 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1774 return result;
1775}
1776
1777XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1778{
1779 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1780 return result;
1781}
1782
1783XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1784{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001785 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001786 XGL_RESULT result = nextTable.DestroyObject(object);
1787 return result;
1788}
1789
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001790XGL_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 -06001791{
1792 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1793 return result;
1794}
1795
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001796XGL_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 -06001797{
Jon Ashburned62b412015-01-15 10:39:19 -07001798 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001799 return result;
1800}
1801
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001802XGL_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)
1803{
1804 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1805 return result;
1806}
1807
1808XGL_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)
1809{
1810 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1811 return result;
1812}
1813
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001814XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1815{
1816 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1817 return result;
1818}
1819
1820XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1821{
1822 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1823 return result;
1824}
1825
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001826XGL_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 -06001827{
1828 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1829 return result;
1830}
1831
1832XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1833{
1834 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1835 return result;
1836}
1837
1838XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1839{
1840 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1841 return result;
1842}
1843
1844XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1845{
1846 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1847 return result;
1848}
1849
1850XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1851{
1852 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1853 return result;
1854}
1855
1856XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1857{
1858 XGL_RESULT result = nextTable.GetEventStatus(event);
1859 return result;
1860}
1861
1862XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1863{
1864 XGL_RESULT result = nextTable.SetEvent(event);
1865 return result;
1866}
1867
1868XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1869{
1870 XGL_RESULT result = nextTable.ResetEvent(event);
1871 return result;
1872}
1873
1874XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1875{
1876 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1877 return result;
1878}
1879
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001880XGL_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 -06001881{
1882 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1883 return result;
1884}
1885
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001886XGL_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 -06001887{
1888 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1889 return result;
1890}
1891
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001892XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1893{
1894 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
1895 return result;
1896}
1897
1898XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1899{
1900 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Tobin Ehlis59d32c42015-02-24 09:16:47 -07001901 if (XGL_SUCCESS == result) {
1902 loader_platform_thread_lock_mutex(&globalLock);
1903 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1904#if ALLOC_DEBUG
1905 printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1906#endif
1907 pNewNode->buffer = *pView;
1908 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO));
1909 pNewNode->pNext = g_pBufferHead;
1910 g_pBufferHead = pNewNode;
1911 loader_platform_thread_unlock_mutex(&globalLock);
1912 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001913 return result;
1914}
1915
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001916XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1917{
1918 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1919 return result;
1920}
1921
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001922XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1923{
1924 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1925 return result;
1926}
1927
1928XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1929{
1930 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1931 return result;
1932}
1933
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001934XGL_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 -06001935{
1936 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1937 return result;
1938}
1939
1940XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1941{
1942 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001943 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001944 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001945 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001946#if ALLOC_DEBUG
1947 printf("Alloc22 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1948#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001949 pNewNode->image = *pView;
1950 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1951 pNewNode->pNext = g_pImageHead;
1952 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001953 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001954 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001955 return result;
1956}
1957
1958XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1959{
1960 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1961 return result;
1962}
1963
1964XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1965{
1966 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1967 return result;
1968}
1969
1970XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1971{
1972 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1973 return result;
1974}
1975
1976XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1977{
1978 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1979 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001980 char str[1024];
1981 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1982 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001983 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001984 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001985 if (pTrav) {
1986 while (pTrav->pNext)
1987 pTrav = pTrav->pNext;
1988 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001989#if ALLOC_DEBUG
1990 printf("Alloc23 #%lu pTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pTrav->pNext);
1991#endif
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001992 pTrav = pTrav->pNext;
1993 }
1994 else {
1995 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001996#if ALLOC_DEBUG
1997 printf("Alloc24 #%lu pTrav addr(%p)\n", ++g_alloc_count, (void*)pTrav);
1998#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001999 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002000 }
2001 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
2002 pTrav->pipeline = *pPipeline;
2003 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07002004 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002005 return result;
2006}
2007
2008XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
2009{
2010 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
2011 return result;
2012}
2013
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002014XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002015{
2016 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
2017 return result;
2018}
2019
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002020XGL_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 -06002021{
2022 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
2023 return result;
2024}
2025
2026XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
2027{
2028 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
2029 return result;
2030}
2031
2032XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
2033{
2034 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002035 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07002036 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002037 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002038#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002039 printf("Alloc25 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002040#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002041 pNewNode->sampler = *pSampler;
2042 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
2043 pNewNode->pNext = g_pSamplerHead;
2044 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002045 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002046 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002047 return result;
2048}
2049
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002050XGL_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)
2051{
2052 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
2053 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002054 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002055#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002056 printf("Alloc26 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002057#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002058 if (NULL == pNewNode) {
2059 char str[1024];
2060 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
2061 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2062 }
2063 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002064 // TODO : API Currently missing a count here that we should multiply by struct size
2065 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002066#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002067 printf("Alloc27 #%lu pNewNode->pCreateInfoList addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pCreateInfoList);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002068#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002069 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002070 void* pCITrav = NULL;
2071 uint32_t totalCount = 0;
2072 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07002073 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07002074 pCITrav = (void*)pSetLayoutInfoList->pNext;
2075 totalCount = pSetLayoutInfoList->count;
2076 }
2077 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
2078 while (pCITrav) {
2079 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
2080 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002081#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002082 printf("Alloc28 #%lu *ppNext addr(%p)\n", ++g_alloc_count, (void*)*ppNext);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002083#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002084 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
2085 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002086 ppNext = (void**)&((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002087 }
2088 if (totalCount > 0) {
2089 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002090#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002091 printf("Alloc29 #%lu pNewNode->pTypes addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pTypes);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002092#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002093 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002094 uint32_t offset = 0;
2095 uint32_t i = 0;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002096 while (pLCI) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07002097 for (i = 0; i < pLCI->count; i++) {
2098 pNewNode->pTypes[offset + i] = pLCI->descriptorType;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002099 }
Tobin Ehlis82871a82015-02-19 09:55:18 -07002100 offset += i;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002101 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
2102 }
2103 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002104 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002105 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07002106 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002107 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
2108 assert(i < XGL_NUM_SHADER_STAGE);
2109 if (stage & stageFlags)
2110 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07002111 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002112 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002113 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002114 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
2115 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002116 if (NULL != priorSetLayout && pPriorNode == NULL) {
2117 char str[1024];
2118 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
2119 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2120 }
2121 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
2122 // Get count for prior layout
2123 pNewNode->startIndex = pPriorNode->endIndex + 1;
2124 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07002125 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002126 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002127 pNewNode->pPriorSetLayout = pPriorNode;
2128 // Put new node at Head of global Layer list
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002129 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002130 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002131 g_pLayoutHead = pNewNode;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002132 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002133 }
2134 return result;
2135}
2136
2137XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
2138{
2139 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
2140 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002141 loader_platform_thread_lock_mutex(&globalLock);
2142 REGION_NODE* pRegionNode = g_pRegionHead;
2143 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002144 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002145 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2146 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002147 }
2148 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002149 pRegionNode->updateActive = 1;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002150 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002151 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002152 }
2153 return result;
2154}
2155
2156XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
2157{
2158 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
2159 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002160 loader_platform_thread_lock_mutex(&globalLock);
2161 REGION_NODE* pRegionNode = g_pRegionHead;
2162 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002163 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002164 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2165 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002166 }
2167 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002168 if (!pRegionNode->updateActive) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002169 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002170 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
2171 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 -07002172 }
2173 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002174 pRegionNode->updateActive = 0;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002175 }
2176 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002177 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002178 }
2179 return result;
2180}
2181
2182XGL_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)
2183{
2184 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
2185 if (XGL_SUCCESS == result) {
2186 // Insert this region into Global Region LL at head
2187 char str[1024];
2188 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
2189 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002190 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002191 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002192#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002193 printf("Alloc30 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002194#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002195 if (NULL == pNewNode) {
2196 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002197 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002198 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2199 }
2200 else {
2201 memset(pNewNode, 0, sizeof(REGION_NODE));
2202 pNewNode->pNext = g_pRegionHead;
2203 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002204 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
2205 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
2206 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07002207 if (typeCountSize) {
2208 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
2209 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002210#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002211 printf("Alloc31 #%lu *ppTypeCount addr(%p)\n", ++g_alloc_count, (void*)*ppTypeCount);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002212#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002213 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
2214 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002215 pNewNode->regionUsage = regionUsage;
2216 pNewNode->updateActive = 0;
2217 pNewNode->maxSets = maxSets;
2218 pNewNode->region = *pDescriptorRegion;
2219 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002220 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002221 }
2222 else {
2223 // Need to do anything if region create fails?
2224 }
2225 return result;
2226}
2227
2228XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
2229{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002230 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002231 if (XGL_SUCCESS == result) {
2232 clearDescriptorRegion(descriptorRegion);
2233 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002234 return result;
2235}
2236
2237XGL_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)
2238{
2239 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002240 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
2241 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
2242 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002243 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002244 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002245 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002246 }
2247 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002248 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002249 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002250 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002251 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002252 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002253 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002254#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07002255 printf("Alloc32 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002256#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002257 if (NULL == pNewNode) {
2258 char str[1024];
2259 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002260 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 -07002261 }
2262 else {
2263 memset(pNewNode, 0, sizeof(SET_NODE));
2264 // Insert set at head of Set LL for this region
2265 pNewNode->pNext = pRegionNode->pSets;
2266 pRegionNode->pSets = pNewNode;
2267 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
2268 if (NULL == pLayout) {
2269 char str[1024];
2270 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
2271 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2272 }
2273 pNewNode->pLayouts = pLayout;
2274 pNewNode->region = descriptorRegion;
2275 pNewNode->set = pDescriptorSets[i];
2276 pNewNode->setUsage = setUsage;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07002277 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002278 size_t descriptorArraySize = sizeof(GENERIC_HEADER*)*pNewNode->descriptorCount;
2279 pNewNode->ppDescriptors = (GENERIC_HEADER**)malloc(descriptorArraySize);
2280#if ALLOC_DEBUG
2281 printf("Alloc35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_alloc_count, (void*)pNewNode->ppDescriptors);
2282#endif
2283 memset(pNewNode->ppDescriptors, 0, descriptorArraySize);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002284 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002285 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002286 }
2287 }
2288 return result;
2289}
2290
2291XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
2292{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002293 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002294 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002295 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002296 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
2297}
2298
2299XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
2300{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002301 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002302 char str[1024];
2303 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002304 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 -07002305 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002306 else {
2307 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
2308 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
2309 }
2310
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002311 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
2312}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002313
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002314XGL_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 -06002315{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002316 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002317 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002318 return result;
2319}
2320
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002321XGL_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 -06002322{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002323 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002324 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002325 return result;
2326}
2327
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002328XGL_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 -06002329{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002330 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002331 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002332 return result;
2333}
2334
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002335XGL_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 -06002336{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002337 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002338 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002339 return result;
2340}
2341
2342XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2343{
2344 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002345 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002346 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002347 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002348#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002349 printf("Alloc33 #%lu pCB addr(%p)\n", ++g_alloc_count, (void*)pCB);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002350#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002351 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2352 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2353 g_pCmdBufferHead = pCB;
2354 pCB->cmdBuffer = *pCmdBuffer;
2355 pCB->flags = pCreateInfo->flags;
2356 pCB->queueType = pCreateInfo->queueType;
2357 pCB->lastVtxBinding = MAX_BINDING;
Tobin Ehlis45662712015-02-23 09:06:28 -07002358 g_lastCmdBuffer[getTIDIndex()] = *pCmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002359 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002360 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002361 return result;
2362}
2363
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002364XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002365{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002366 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002367 if (XGL_SUCCESS == result) {
2368 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002369 if (pCB) {
2370 if (CB_NEW != pCB->state)
2371 resetCB(cmdBuffer);
2372 pCB->state = CB_UPDATE_ACTIVE;
2373 }
2374 else {
2375 char str[1024];
2376 sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2377 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2378 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002379 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002380 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002381 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002382 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002383 return result;
2384}
2385
2386XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2387{
2388 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002389 if (XGL_SUCCESS == result) {
2390 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002391 if (pCB) {
2392 pCB->state = CB_UPDATE_COMPLETE;
2393 printCB(cmdBuffer);
2394 }
2395 else {
2396 char str[1024];
2397 sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2398 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2399 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002400 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002401 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002402 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002403 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002404 return result;
2405}
2406
2407XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2408{
2409 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002410 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002411 resetCB(cmdBuffer);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002412 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002413 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002414 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002415 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002416 return result;
2417}
2418
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002419XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002420{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002421 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2422 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002423 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002424 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002425 if (getPipeline(pipeline)) {
2426 pCB->lastBoundPipeline = pipeline;
2427 }
2428 else {
2429 char str[1024];
2430 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2431 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2432 }
2433 synchAndDumpDot(cmdBuffer);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002434 }
2435 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002436 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002437 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2438 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002439 }
2440 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2441}
2442
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002443XGL_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 -06002444{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002445 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2446 if (pCB) {
2447 // TODO : Handle storing Pipeline Deltas to cmd buffer here
Tobin Ehlis45662712015-02-23 09:06:28 -07002448 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002449 synchAndDumpDot(cmdBuffer);
2450 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2451 }
2452 else {
2453 char str[1024];
2454 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2455 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2456 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002457 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2458}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002459
2460XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2461{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002462 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
2463 synchAndDumpDot(cmdBuffer);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002464 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2465}
2466
2467XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2468{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002469 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2470 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002471 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002472 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002473 if (getSetNode(descriptorSet)) {
2474 if (dsUpdateActive(descriptorSet)) {
Tobin Ehlis224dd812015-02-19 15:26:49 -07002475 // TODO : This check here needs to be made at QueueSubmit time
2476/*
Tobin Ehlis8cced212015-02-13 10:26:14 -07002477 char str[1024];
2478 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2479 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 -07002480*/
Tobin Ehlis8cced212015-02-13 10:26:14 -07002481 }
2482 loader_platform_thread_lock_mutex(&globalLock);
2483 pCB->lastBoundDescriptorSet = descriptorSet;
2484 loader_platform_thread_unlock_mutex(&globalLock);
2485 synchAndDumpDot(cmdBuffer);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002486 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002487 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2488 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002489 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002490 else {
2491 char str[1024];
2492 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2493 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2494 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002495 }
2496 else {
2497 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002498 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2499 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002500 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002501 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2502}
2503
2504XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2505{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002506 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2507 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002508 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002509 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002510 // TODO : Track idxBuffer binding
2511 }
2512 else {
2513 char str[1024];
2514 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2515 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2516 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002517 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2518}
2519
2520XGL_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 +08002521{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002522 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2523 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002524 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002525 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002526 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002527 }
2528 else {
2529 char str[1024];
2530 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2531 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2532 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002533 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002534}
2535
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002536XGL_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 -06002537{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002538 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2539 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002540 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002541 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002542 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002543 char str[1024];
2544 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2545 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2546 synchAndPrintDSConfig(cmdBuffer);
2547 }
2548 else {
2549 char str[1024];
2550 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2551 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2552 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002553 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2554}
2555
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002556XGL_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 -06002557{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002558 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2559 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002560 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002561 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002562 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002563 char str[1024];
2564 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2565 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2566 synchAndPrintDSConfig(cmdBuffer);
2567 }
2568 else {
2569 char str[1024];
2570 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2571 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2572 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002573 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2574}
2575
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002576XGL_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 -06002577{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002578 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2579 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002580 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002581 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002582 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002583 char str[1024];
2584 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2585 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2586 synchAndPrintDSConfig(cmdBuffer);
2587 }
2588 else {
2589 char str[1024];
2590 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2591 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2592 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002593 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002594}
2595
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002596XGL_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 -06002597{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002598 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2599 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002600 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002601 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002602 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002603 char str[1024];
2604 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2605 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2606 synchAndPrintDSConfig(cmdBuffer);
2607 }
2608 else {
2609 char str[1024];
2610 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2611 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2612 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002613 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002614}
2615
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002616XGL_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 -06002617{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002618 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2619 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002620 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002621 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002622 }
2623 else {
2624 char str[1024];
2625 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2626 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2627 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002628 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2629}
2630
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002631XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002632{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002633 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2634 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002635 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002636 addCmd(pCB, CMD_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002637 }
2638 else {
2639 char str[1024];
2640 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2641 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2642 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002643 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002644}
2645
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002646XGL_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 -06002647{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002648 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2649 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002650 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002651 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002652 }
2653 else {
2654 char str[1024];
2655 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2656 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2657 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002658 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002659}
2660
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002661XGL_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 -06002662{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002663 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2664 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002665 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002666 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002667 }
2668 else {
2669 char str[1024];
2670 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2671 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2672 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002673 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2674}
2675
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002676XGL_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 -06002677{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002678 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2679 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002680 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002681 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002682 }
2683 else {
2684 char str[1024];
2685 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2686 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2687 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002688 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002689}
2690
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002691XGL_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 -06002692{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002693 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2694 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002695 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002696 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002697 }
2698 else {
2699 char str[1024];
2700 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2701 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2702 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002703 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002704}
2705
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002706XGL_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 -06002707{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002708 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2709 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002710 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002711 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002712 }
2713 else {
2714 char str[1024];
2715 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2716 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2717 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002718 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002719}
2720
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002721XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2722{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002723 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2724 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002725 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002726 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002727 }
2728 else {
2729 char str[1024];
2730 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2731 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2732 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002733 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2734}
2735
2736XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2737{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002738 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2739 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002740 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002741 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002742 }
2743 else {
2744 char str[1024];
2745 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2746 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2747 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002748 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2749}
2750
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002751XGL_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 -06002752{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002753 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2754 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002755 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002756 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002757 }
2758 else {
2759 char str[1024];
2760 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2761 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2762 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002763 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2764}
2765
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002766XGL_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 -06002767{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002768 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2769 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002770 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002771 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002772 }
2773 else {
2774 char str[1024];
2775 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2776 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2777 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002778 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2779}
2780
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002781XGL_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 -06002782{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002783 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2784 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002785 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002786 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002787 }
2788 else {
2789 char str[1024];
2790 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2791 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2792 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002793 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2794}
2795
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002796XGL_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 -06002797{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002798 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2799 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002800 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002801 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002802 }
2803 else {
2804 char str[1024];
2805 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2806 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2807 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002808 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2809}
2810
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002811XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002812{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002813 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2814 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002815 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002816 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002817 }
2818 else {
2819 char str[1024];
2820 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2821 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2822 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002823 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002824}
2825
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002826XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002827{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002828 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2829 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002830 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002831 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002832 }
2833 else {
2834 char str[1024];
2835 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2836 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2837 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002838 nextTable.CmdResetEvent(cmdBuffer, event);
2839}
2840
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002841XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002842{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002843 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2844 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002845 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002846 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002847 }
2848 else {
2849 char str[1024];
2850 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2851 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2852 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002853 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2854}
2855
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002856XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002857{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002858 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2859 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002860 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002861 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002862 }
2863 else {
2864 char str[1024];
2865 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2866 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2867 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002868 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2869}
2870
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002871XGL_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 -06002872{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002873 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2874 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002875 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002876 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002877 }
2878 else {
2879 char str[1024];
2880 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2881 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2882 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002883 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2884}
2885
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002886XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002887{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002888 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2889 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002890 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002891 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002892 }
2893 else {
2894 char str[1024];
2895 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2896 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2897 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002898 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2899}
2900
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002901XGL_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 -06002902{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002903 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2904 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002905 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002906 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002907 }
2908 else {
2909 char str[1024];
2910 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2911 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2912 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002913 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2914}
2915
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002916XGL_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 -06002917{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002918 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2919 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002920 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002921 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002922 }
2923 else {
2924 char str[1024];
2925 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2926 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2927 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002928 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002929}
2930
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002931XGL_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 -06002932{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002933 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2934 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002935 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002936 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002937 }
2938 else {
2939 char str[1024];
2940 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2941 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2942 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002943 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2944}
2945
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002946XGL_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 -06002947{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002948 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2949 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002950 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002951 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002952 }
2953 else {
2954 char str[1024];
2955 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2956 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2957 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002958 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002959}
2960
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002961XGL_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 -06002962{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002963 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2964 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002965 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002966 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002967 }
2968 else {
2969 char str[1024];
2970 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2971 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2972 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002973 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2974}
2975
2976XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2977{
2978 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
2979 return result;
2980}
2981
2982XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
2983{
2984 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
2985 return result;
2986}
2987
2988XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2989{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002990 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2991 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002992 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002993 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002994 }
2995 else {
2996 char str[1024];
2997 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2998 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2999 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003000 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
3001}
3002
3003XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
3004{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003005 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
3006 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003007 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07003008 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07003009 }
3010 else {
3011 char str[1024];
3012 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
3013 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
3014 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07003015 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003016}
3017
3018XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
3019{
3020 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
3021 return result;
3022}
3023
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003024XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003025{
Tobin Ehlise79df942014-11-18 16:38:08 -07003026 // This layer intercepts callbacks
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003027 XGL_LAYER_DBG_FUNCTION_NODE* pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
3028#if ALLOC_DEBUG
3029 printf("Alloc34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pNewDbgFuncNode);
3030#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003031 if (!pNewDbgFuncNode)
3032 return XGL_ERROR_OUT_OF_MEMORY;
3033 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
3034 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003035 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
3036 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003037 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
3038 return result;
3039}
3040
3041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
3042{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003043 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07003044 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
3045 while (pTrav) {
3046 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
3047 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07003048 if (g_pDbgFunctionHead == pTrav)
3049 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07003050#if ALLOC_DEBUG
3051 printf("Free34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pTrav);
3052#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07003053 free(pTrav);
3054 break;
3055 }
3056 pPrev = pTrav;
3057 pTrav = pTrav->pNext;
3058 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003059 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
3060 return result;
3061}
3062
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003063XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003064{
3065 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
3066 return result;
3067}
3068
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003069XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003070{
3071 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
3072 return result;
3073}
3074
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003075XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003076{
3077 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
3078 return result;
3079}
3080
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003081XGL_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 -06003082{
3083 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
3084 return result;
3085}
3086
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003087XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003088{
3089 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
3090}
3091
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003092XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003093{
3094 nextTable.CmdDbgMarkerEnd(cmdBuffer);
3095}
3096
Ian Elliott81ac44c2015-01-13 17:52:38 -07003097#if defined(WIN32)
3098// FIXME: NEED WINDOWS EQUIVALENT
3099#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003100XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
3101{
3102 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003103 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003104 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003105 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003106 return result;
3107}
3108
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003109XGL_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 -06003110{
Chia-I Wu6204f342014-11-07 13:33:45 +08003111 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003112 return result;
3113}
3114
3115XGL_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)
3116{
3117 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
3118 return result;
3119}
3120
3121XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
3122{
3123 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
3124 return result;
3125}
Ian Elliott81ac44c2015-01-13 17:52:38 -07003126#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07003127// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003128void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003129{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003130 // TODO : Currently just setting cmdBuffer based on global var
Tobin Ehlis45662712015-02-23 09:06:28 -07003131 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003132}
3133
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003134void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07003135{
Ian Elliott81ac44c2015-01-13 17:52:38 -07003136#if defined(_WIN32)
3137// FIXME: NEED WINDOWS EQUIVALENT
3138 char str[1024];
3139 sprintf(str, "Cannot execute dot program yet on Windows.");
3140 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3141#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003142 char dotExe[32] = "/usr/bin/dot";
3143 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003144 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07003145 char dotCmd[1024];
3146 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
3147 system(dotCmd);
3148 remove("/tmp/tmp.dot");
3149 }
3150 else {
3151 char str[1024];
3152 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
3153 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3154 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07003155#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003156}
3157
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003158XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003159{
3160 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08003161 void *addr;
3162
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003163 if (gpu == NULL)
3164 return NULL;
3165 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003166 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003167
Chia-I Wu706533e2015-01-05 13:18:57 +08003168 addr = layer_intercept_proc(funcName);
3169 if (addr)
3170 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003171 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003172 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003173 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07003174 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003175 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003176 if (gpuw->pGPA == NULL)
3177 return NULL;
3178 return gpuw->pGPA(gpuw->nextObject, funcName);
3179 }
3180}