blob: 8208241e42f1f66e9a424e36bf792e012de33ebc [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}
398// Free all image nodes
399static void freeImages()
400{
401 IMAGE_NODE* pImage = g_pImageHead;
402 IMAGE_NODE* pFreeMe = pImage;
403 while (pImage) {
404 pFreeMe = pImage;
405 pImage = pImage->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700406#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700407 printf("Free22 #%lu pImage addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700408#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700409 free(pFreeMe);
410 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700411 g_pImageHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700412}
413// Free all buffer nodes
414static void freeBuffers()
415{
416 BUFFER_NODE* pBuffer = g_pBufferHead;
417 BUFFER_NODE* pFreeMe = pBuffer;
418 while (pBuffer) {
419 pFreeMe = pBuffer;
420 pBuffer = pBuffer->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700421#if ALLOC_DEBUG
422 printf("Free21 #%lu pBuffer addr(%p)\n", ++g_free_count, (void*)pFreeMe);
423#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700424 free(pFreeMe);
425 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700426 g_pBufferHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700427}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700428static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700429// Print the last bound dynamic state
Tobin Ehlis8cced212015-02-13 10:26:14 -0700430static void printDynamicState(const XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700431{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700432 GLOBAL_CB_NODE* pCB = getCBNode(cb);
433 if (pCB) {
434 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700435 char str[4*1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -0700436 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
437 if (pCB->lastBoundDynamicState[i]) {
438 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pCB->lastBoundDynamicState[i]->stateObj);
439 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
440 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pCB->lastBoundDynamicState[i]->pCreateInfo, " "));
441 break;
442 }
443 else {
444 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
445 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
446 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700447 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700448 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700449 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700450 else {
451 char str[1024];
452 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cb);
453 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
454 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700455}
456// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600457static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
458{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700459 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700460 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600461 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700462 if (pTrav->pipeline == pipeline) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700463 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600464 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700465 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600466 pTrav = pTrav->pNext;
467 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700468 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600469 return NULL;
470}
471
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700472// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700473// TODO : Use this function to display sampler info
474// commenting out for now to avoid warning about not being used
475/*
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700476static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
477{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700478 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700479 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700480 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700481 if (sampler == pTrav->sampler) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700482 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700483 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700484 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700485 pTrav = pTrav->pNext;
486 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700487 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700488 return NULL;
489}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700490*/
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700491
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600492// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700493// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600494static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
495{
Tobin Ehlis26092022014-11-20 09:49:17 -0700496 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700497 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700498#if ALLOC_DEBUG
499 printf("Alloc5 #%lu pPipeline->pCreateTree addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pCreateTree);
500#endif
Tobin Ehlis26092022014-11-20 09:49:17 -0700501 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700502 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
503 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600504 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700505 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700506 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700507#if ALLOC_DEBUG
508 printf("Alloc6 #%lu pShadowTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pShadowTrav->pNext);
509#endif
Tobin Ehlis26092022014-11-20 09:49:17 -0700510 // Typically pNext is const so have to cast to avoid warning when we modify it here
511 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700512 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
513 // Special copy of Vtx info as it has embedded array
514 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700515 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pShadowTrav;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700516 pPipeline->vtxBindingCount = pVICI->bindingCount;
517 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700518 if (allocSize) {
519 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700520#if ALLOC_DEBUG
521 printf("Alloc7 #%lu pPipeline->pVertexBindingDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexBindingDescriptions);
522#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700523 memcpy(pPipeline->pVertexBindingDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
524 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700525 pPipeline->vtxAttributeCount = pVICI->attributeCount;
526 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700527 if (allocSize) {
528 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700529#if ALLOC_DEBUG
530 printf("Alloc8 #%lu pPipeline->pVertexAttributeDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexAttributeDescriptions);
531#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700532 memcpy(pPipeline->pVertexAttributeDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
533 }
534 }
535 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pTrav->sType) {
536 // Special copy of CB state as it has embedded array
537 XGL_PIPELINE_CB_STATE_CREATE_INFO *pCBCI = (XGL_PIPELINE_CB_STATE_CREATE_INFO*)pShadowTrav;
538 pPipeline->attachmentCount = pCBCI->attachmentCount;
539 uint32_t allocSize = pPipeline->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE);
540 if (allocSize) {
541 pPipeline->pAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE*)malloc(allocSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700542#if ALLOC_DEBUG
543 printf("Alloc9 #%lu pPipeline->pAttachments addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pAttachments);
544#endif
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700545 XGL_PIPELINE_CB_ATTACHMENT_STATE** ppAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE**)&pCBCI->pAttachments;
546 *ppAttachments = pPipeline->pAttachments;
547 memcpy(pPipeline->pAttachments, ((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pTrav)->pAttachments, allocSize);
548 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700549 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700550 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600551 }
552}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700553// Free the Pipeline nodes
554static void freePipelines()
555{
556 PIPELINE_NODE* pPipeline = g_pPipelineHead;
557 PIPELINE_NODE* pFreeMe = pPipeline;
558 while (pPipeline) {
559 pFreeMe = pPipeline;
560 GENERIC_HEADER* pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
561 GENERIC_HEADER* pShadowFree = pShadowTrav;
562 while (pShadowTrav) {
563 pShadowFree = pShadowTrav;
564 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
565 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pShadowFree->sType) {
566 // Free the vtx data shadowed directly into pPipeline node
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700567 if (pFreeMe->pVertexBindingDescriptions) {
568#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700569 printf("Free7 #%lu pVertexBindingDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexBindingDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700570#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700571 free(pFreeMe->pVertexBindingDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700572 }
573 if (pFreeMe->pVertexAttributeDescriptions) {
574#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700575 printf("Free8 #%lu pVertexAttributeDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexAttributeDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700576#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700577 free(pFreeMe->pVertexAttributeDescriptions);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700578 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700579 }
580 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pShadowFree->sType) {
581 // Free attachment data shadowed into pPipeline node
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700582 if (pFreeMe->pAttachments) {
583#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700584 printf("Free9 #%lu pAttachments addr(%p)\n", ++g_free_count, (void*)pFreeMe->pAttachments);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700585#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700586 free(pFreeMe->pAttachments);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700587 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700588 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700589#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700590 printf("Free5 & Free6 #%lu pShadowNode addr(%p)\n", ++g_free_count, (void*)pShadowFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700591#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700592 free(pShadowFree);
593 }
594 pPipeline = pPipeline->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700595#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700596 printf("Free23 & Free24 #%lu pPipeline addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700597#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700598 free(pFreeMe);
599 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700600 g_pPipelineHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700601}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600602// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600603
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700604// ptr to HEAD of LL of DS Regions
605static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700606// ptr to HEAD of LL of top-level Layouts
607static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700608
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700609// Return Region node ptr for specified region or else NULL
610static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
611{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700612 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700613 REGION_NODE* pTrav = g_pRegionHead;
614 while (pTrav) {
615 if (pTrav->region == region) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700616 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700617 return pTrav;
618 }
619 pTrav = pTrav->pNext;
620 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700621 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700622 return NULL;
623}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700624// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700625static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700626{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700627 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700628 REGION_NODE* pTrav = g_pRegionHead;
629 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700630 SET_NODE* pSet = pTrav->pSets;
631 while (pSet) {
632 if (pSet->set == set) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700633 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700634 return pSet;
635 }
636 pSet = pSet->pNext;
637 }
638 pTrav = pTrav->pNext;
639 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700640 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700641 return NULL;
642}
643
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700644// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorRegionUpdate() call sequence, otherwise XGL_FALSE
645static bool32_t dsUpdateActive(XGL_DESCRIPTOR_SET ds)
646{
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700647 // Note, both "get" functions use global mutex so this guy does not
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700648 SET_NODE* pTrav = getSetNode(ds);
649 if (pTrav) {
650 REGION_NODE* pRegion = NULL;
651 pRegion = getRegionNode(pTrav->region);
652 if (pRegion) {
653 return pRegion->updateActive;
654 }
655 }
656 return XGL_FALSE;
657}
658
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700659static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700660 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700661 LAYOUT_NODE* pTrav = g_pLayoutHead;
662 while (pTrav) {
663 if (pTrav->layout == layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700664 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700665 return pTrav;
666 }
667 pTrav = pTrav->pNext;
668 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700669 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700670 return NULL;
671}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600672
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700673static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
674{
675 switch (pUpdateStruct->sType)
676 {
677 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
678 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
679 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
680 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
681 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
682 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
683 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
684 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
685 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
686 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
687 default:
688 // TODO : Flag specific error for this case
689 return 0;
690 }
691}
692
693static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
694{
695 switch (pUpdateStruct->sType)
696 {
697 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700698 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700699 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700700 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700701 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700702 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700703 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis82871a82015-02-19 09:55:18 -0700704 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700705 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
706 // TODO : Need to understand this case better and make sure code is correct
Tobin Ehlis82871a82015-02-19 09:55:18 -0700707 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700708 default:
709 // TODO : Flag specific error for this case
710 return 0;
711 }
712}
713
714// Verify that the descriptor type in the update struct matches what's expected by the layout
Tobin Ehlisefa84162015-02-17 09:54:13 -0700715static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, const LAYOUT_NODE* pLayout)//XGL_DESCRIPTOR_TYPE type)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700716{
717 // First get actual type of update
718 XGL_DESCRIPTOR_TYPE actualType;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700719 uint32_t i = 0;
720 uint32_t bound = getUpdateUpperBound(pUpdateStruct);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700721 switch (pUpdateStruct->sType)
722 {
723 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
724 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
725 break;
726 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
727 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
728 break;
729 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
730 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
731 break;
732 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
733 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
734 break;
735 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
736 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
737 break;
738 default:
739 // TODO : Flag specific error for this case
740 return 0;
741 }
Tobin Ehlis82871a82015-02-19 09:55:18 -0700742 for (i = getUpdateIndex(pUpdateStruct); i < bound; i++) {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700743 if (pLayout->pTypes[i] != actualType)
744 return 0;
745 }
746 return 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700747}
748
749// Verify that update region for this update does not exceed max layout index for this type
750static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
751{
Tobin Ehlis82871a82015-02-19 09:55:18 -0700752 if ((getUpdateUpperBound(pUpdateStruct)-1) > layoutIdx)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700753 return 0;
754 return 1;
755}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700756// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
757// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700758// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700759static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
760{
761 GENERIC_HEADER* pNewNode = NULL;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700762 size_t array_size = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700763 size_t base_array_size = 0;
764 size_t total_array_size = 0;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700765 size_t baseBuffAddr = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700766 XGL_UPDATE_BUFFERS* pUBCI;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700767 XGL_UPDATE_IMAGES* pUICI;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700768 switch (pUpdate->sType)
769 {
770 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
771 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700772#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700773 printf("Alloc10 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700774#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700775 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
776 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
777 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700778#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700779 printf("Alloc11 #%lu pNewNode->pSamplers addr(%p)\n", ++g_alloc_count, (void*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700780#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700781 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700782 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700783 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
784 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700785#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700786 printf("Alloc12 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700787#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700788 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
789 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
790 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700791#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700792 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 -0700793#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700794 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
795 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));
796 ((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 -0700797#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700798 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 -0700799#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700800 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));
801 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700802 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700803 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700804 pUICI = (XGL_UPDATE_IMAGES*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700805 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700806#if ALLOC_DEBUG
807 printf("Alloc15 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
808#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700809 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700810 base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
811 total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700812 XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews;
813 *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700814#if ALLOC_DEBUG
815 printf("Alloc16 #%lu *pppLocalImageViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalImageViews);
816#endif
817 baseBuffAddr = (size_t)(*pppLocalImageViews) + base_array_size;
818 for (uint32_t i = 0; i < pUICI->count; i++) {
Tobin Ehlisfdbc68c2015-02-19 13:14:59 -0700819 (*pppLocalImageViews)[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));
820 memcpy((*pppLocalImageViews)[i], pUICI->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700821 }
822 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700823 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700824 pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700825 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700826#if ALLOC_DEBUG
827 printf("Alloc17 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
828#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700829 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700830 base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count;
831 total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size;
832 XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews;
833 *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700834#if ALLOC_DEBUG
835 printf("Alloc18 #%lu *pppLocalBufferViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalBufferViews);
836#endif
837 baseBuffAddr = (size_t)(*pppLocalBufferViews) + base_array_size;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700838 for (uint32_t i = 0; i < pUBCI->count; i++) {
839 // Set ptr and then copy data into that ptr
Tobin Ehlisfdbc68c2015-02-19 13:14:59 -0700840 (*pppLocalBufferViews)[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)));
841 memcpy((*pppLocalBufferViews)[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700842 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700843 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700844 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
845 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700846#if ALLOC_DEBUG
847 printf("Alloc19 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
848#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700849 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700850 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700851 default:
852 // TODO : Flag specific error for this case
853 return NULL;
854 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700855 // Make sure that pNext for the end of shadow copy is NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700856 pNewNode->pNext = NULL;
857 return pNewNode;
858}
859// For given ds, update it's mapping based on pUpdateChain linked-list
860static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
861{
862 SET_NODE* pSet = getSetNode(ds);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700863 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700864 LAYOUT_NODE* pLayout = NULL;
865 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI;
866 // TODO : If pCIList is NULL, flag error
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700867 GENERIC_HEADER* pUpdates = pUpdateChain;
868 // Perform all updates
869 while (pUpdates) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700870 pLayout = pSet->pLayouts;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700871 // For each update first find the layout section that it overlaps
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700872 while (pLayout && (pLayout->startIndex > getUpdateIndex(pUpdates))) {
873 pLayout = pLayout->pPriorSetLayout;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700874 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700875 if (!pLayout) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700876 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700877 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));
878 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700879 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700880 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700881 // Next verify that update is correct size
882 if (!validateUpdateSize(pUpdates, pLayout->endIndex)) {
883 char str[48*1024]; // TODO : Keep count of layout CI structs and size this string dynamically based on that count
884 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS} ");
885 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
886 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);
887 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
888 free(pDSstr);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700889 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700890 else { // TODO : should we skip update on a type mismatch or force it?
Tobin Ehlisefa84162015-02-17 09:54:13 -0700891 // We have the right layout section, now verify that update is of the right type
892 if (!validateUpdateType(pUpdates, pLayout)) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700893 char str[1024];
Tobin Ehlisefa84162015-02-17 09:54:13 -0700894 sprintf(str, "Descriptor update type of %s does not match overlapping layout type!", string_XGL_STRUCTURE_TYPE(pUpdates->sType));
895 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700896 }
897 else {
Tobin Ehlis82871a82015-02-19 09:55:18 -0700898 // Save the update info
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700899 // TODO : Info message that update successful
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700900 // Create new update struct for this set's shadow copy
901 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
902 if (NULL == pNewNode) {
903 char str[1024];
904 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
905 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700906 }
907 else {
Tobin Ehlis82871a82015-02-19 09:55:18 -0700908 // Insert shadow node into LL of updates for this set
909 pNewNode->pNext = pSet->pUpdateStructs;
910 pSet->pUpdateStructs = pNewNode;
911 // Now update appropriate descriptor(s) to point to new Update node
912 for (uint32_t i = getUpdateIndex(pUpdates); i < getUpdateUpperBound(pUpdates); i++) {
913 pSet->ppDescriptors[i] = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700914 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700915 }
916 }
917 }
918 }
919 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
920 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700921 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700922}
923// Free a shadowed update node
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700924// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -0700925static void freeShadowUpdateTree(GENERIC_HEADER* pUpdate)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700926{
Tobin Ehlisefa84162015-02-17 09:54:13 -0700927 GENERIC_HEADER* pShadowUpdate = pUpdate;
928 GENERIC_HEADER* pFreeUpdate = pShadowUpdate;
929 while(pShadowUpdate) {
930 pFreeUpdate = pShadowUpdate;
931 pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext;
932 uint32_t index = 0;
933 XGL_UPDATE_SAMPLERS* pUS = NULL;
934 XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
935 XGL_UPDATE_IMAGES* pUI = NULL;
936 XGL_UPDATE_BUFFERS* pUB = NULL;
937 void** ppToFree = NULL;
938 switch (pFreeUpdate->sType)
939 {
940 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
941 pUS = (XGL_UPDATE_SAMPLERS*)pFreeUpdate;
942 if (pUS->pSamplers) {
943 ppToFree = (void**)&pUS->pSamplers;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700944#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700945 printf("Free11 #%lu pSamplers addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700946#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700947 free(*ppToFree);
948 }
949 break;
950 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
951 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pFreeUpdate;
952 for (index = 0; index < pUST->count; index++) {
953 if (pUST->pSamplerImageViews[index].pImageView) {
954 ppToFree = (void**)&pUST->pSamplerImageViews[index].pImageView;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700955#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700956 printf("Free14 #%lu pImageView addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700957#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700958 free(*ppToFree);
959 }
960 }
961 ppToFree = (void**)&pUST->pSamplerImageViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700962#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700963 printf("Free13 #%lu pSamplerImageViews addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700964#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700965 free(*ppToFree);
966 break;
967 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
968 pUI = (XGL_UPDATE_IMAGES*)pFreeUpdate;
969 if (pUI->pImageViews) {
970 ppToFree = (void**)&pUI->pImageViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700971#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700972 printf("Free16 #%lu pImageViews 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_BUFFERS:
978 pUB = (XGL_UPDATE_BUFFERS*)pFreeUpdate;
979 if (pUB->pBufferViews) {
980 ppToFree = (void**)&pUB->pBufferViews;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700981#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700982 printf("Free18 #%lu pBufferViews addr(%p)\n", ++g_free_count, (void*)*ppToFree);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700983#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700984 free(*ppToFree);
985 }
986 break;
987 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
988 break;
989 default:
990 assert(0);
991 break;
992 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700993#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -0700994 printf("Free10, Free12, Free15, Free17, Free19 #%lu pUpdateNode addr(%p)\n", ++g_free_count, (void*)pFreeUpdate);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -0700995#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -0700996 free(pFreeUpdate);
997 }
998}
999// Free all DS Regions including their Sets & related sub-structs
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001000// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001001static void freeRegions()
1002{
1003 REGION_NODE* pRegion = g_pRegionHead;
1004 REGION_NODE* pFreeMe = pRegion;
1005 while (pRegion) {
1006 pFreeMe = pRegion;
1007 SET_NODE* pSet = pRegion->pSets;
1008 SET_NODE* pFreeSet = pSet;
1009 while (pSet) {
1010 pFreeSet = pSet;
1011 pSet = pSet->pNext;
1012 // Freeing layouts handled in freeLayouts() function
1013 // Free Update shadow struct tree
1014 freeShadowUpdateTree(pFreeSet->pUpdateStructs);
Tobin Ehlis82871a82015-02-19 09:55:18 -07001015 if (pFreeSet->ppDescriptors) {
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001016#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07001017 printf("Free35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_free_count, (void*)pFreeSet->ppDescriptors);
1018#endif
1019 free(pFreeSet->ppDescriptors);
1020 }
1021#if ALLOC_DEBUG
1022 printf("Free32 #%lu pSet addr(%p)\n", ++g_free_count, (void*)pFreeSet);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001023#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001024 free(pFreeSet);
1025 }
1026 pRegion = pRegion->pNext;
1027 if (pFreeMe->createInfo.pTypeCount) {
1028 void** ppToFree = (void**)&pFreeMe->createInfo.pTypeCount;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001029#if ALLOC_DEBUG
1030 printf("Free31 #%lu pTypeCount addr(%p)\n", ++g_free_count, (void*)*ppToFree);
1031#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001032 free(*ppToFree);
1033 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001034#if ALLOC_DEBUG
1035 printf("Free30 #%lu pRegion addr(%p)\n", ++g_free_count, (void*)pFreeMe);
1036#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001037 free(pFreeMe);
1038 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001039 g_pRegionHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001040}
1041// WARN : Once freeLayouts() called, any layout ptrs in Region/Set data structure will be invalid
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001042// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001043static void freeLayouts()
1044{
1045 LAYOUT_NODE* pLayout = g_pLayoutHead;
1046 LAYOUT_NODE* pFreeLayout = pLayout;
1047 while (pLayout) {
1048 pFreeLayout = pLayout;
1049 GENERIC_HEADER* pTrav = (GENERIC_HEADER*)pLayout->pCreateInfoList;
1050 while (pTrav) {
1051 void* pToFree = (void*)pTrav;
1052 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001053#if ALLOC_DEBUG
1054 printf("Free27 & Free28 #%lu pLayoutCITree addr(%p)\n", ++g_free_count, (void*)pToFree);
1055#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001056 free(pToFree);
1057 }
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001058 if (pLayout->pTypes) {
1059#if ALLOC_DEBUG
1060 printf("Free29 #%lu pLayout->pTypes addr(%p)\n", ++g_free_count, (void*)pLayout->pTypes);
1061#endif
1062 free(pLayout->pTypes);
1063 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07001064 pLayout = pLayout->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001065#if ALLOC_DEBUG
1066 printf("Free26 #%lu pLayout addr(%p)\n", ++g_free_count, (void*)pFreeLayout);
1067#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001068 free(pFreeLayout);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001069 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001070 g_pLayoutHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001071}
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001072// Currently clearing a set is removing all previous updates to that set
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001073// TODO : Validate if this is correct clearing behavior
1074static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
1075{
1076 SET_NODE* pSet = getSetNode(set);
1077 if (!pSet) {
1078 // TODO : Return error
1079 }
1080 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001081 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001082 freeShadowUpdateTree(pSet->pUpdateStructs);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001083 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001084 }
1085}
1086
1087static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
1088{
1089 REGION_NODE* pRegion = getRegionNode(region);
1090 if (!pRegion) {
1091 char str[1024];
1092 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
1093 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
1094 }
1095 else
1096 {
1097 // For every set off of this region, clear it
1098 SET_NODE* pSet = pRegion->pSets;
1099 while (pSet) {
1100 clearDescriptorSet(pSet->set);
1101 }
1102 }
1103}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001104
Tobin Ehlis8cced212015-02-13 10:26:14 -07001105// Code here to manage the Cmd buffer LL
1106static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -07001107{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001108 loader_platform_thread_lock_mutex(&globalLock);
1109 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
1110 while (pCB) {
1111 if (cb == pCB->cmdBuffer) {
1112 loader_platform_thread_unlock_mutex(&globalLock);
1113 return pCB;
1114 }
1115 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -07001116 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001117 loader_platform_thread_unlock_mutex(&globalLock);
1118 return NULL;
1119}
Tobin Ehlisefa84162015-02-17 09:54:13 -07001120// Free all CB Nodes
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001121// NOTE : Calls to this function should be wrapped in mutex
Tobin Ehlisefa84162015-02-17 09:54:13 -07001122static void freeCmdBuffers()
1123{
1124 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
1125 GLOBAL_CB_NODE* pFreeMe = pCB;
1126 while (pCB) {
1127 pFreeMe = pCB;
1128 CMD_NODE* pCmd = pCB->pCmds;
1129 CMD_NODE* pFreeCmd = pCmd;
1130 while (pCmd) {
1131 pFreeCmd = pCmd;
1132 pCmd = pCmd->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001133#if ALLOC_DEBUG
1134 printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeCmd);
1135#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001136 free(pFreeCmd);
1137 }
1138 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001139#if ALLOC_DEBUG
1140 printf("Free33 #%lu pCB addr(%p)\n", ++g_free_count, (void*)pFreeMe);
1141#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001142 free(pFreeMe);
1143 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001144 g_pCmdBufferHead = NULL;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001145}
Tobin Ehlisd092d232015-02-13 13:30:07 -07001146static void addCmd(GLOBAL_CB_NODE* pCB, const CMD_TYPE cmd)
1147{
1148 CMD_NODE* pCmd = (CMD_NODE*)malloc(sizeof(CMD_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001149#if ALLOC_DEBUG
1150 printf("Alloc20 #%lu pCmd addr(%p)\n", ++g_alloc_count, (void*)pCmd);
1151#endif
Tobin Ehlisd092d232015-02-13 13:30:07 -07001152 if (pCmd) {
1153 // init cmd node and append to end of cmd LL
1154 memset(pCmd, 0, sizeof(CMD_NODE));
1155 pCB->numCmds++;
1156 pCmd->cmdNumber = pCB->numCmds;
1157 pCmd->type = cmd;
1158 if (!pCB->pCmds) {
1159 pCB->pCmds = pCmd;
1160 }
1161 else {
1162 assert(pCB->lastCmd);
1163 pCB->lastCmd->pNext = pCmd;
1164 }
1165 pCB->lastCmd = pCmd;
1166 }
1167 else {
1168 char str[1024];
1169 sprintf(str, "Out of memory while attempting to allocate new CMD_NODE for cmdBuffer %p", (void*)pCB->cmdBuffer);
1170 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCB->cmdBuffer, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1171 }
1172}
1173static void resetCB(const XGL_CMD_BUFFER cb)
1174{
1175 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1176 if (pCB) {
1177 CMD_NODE* pCur = pCB->pCmds;
1178 CMD_NODE* pFreeMe = pCur;
1179 while (pCur) {
1180 pFreeMe = pCur;
1181 pCur = pCur->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001182#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001183 printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeMe);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001184#endif
Tobin Ehlisd092d232015-02-13 13:30:07 -07001185 free(pFreeMe);
1186 }
1187 // Reset CB state
1188 GLOBAL_CB_NODE* pSaveNext = pCB->pNextGlobalCBNode;
1189 XGL_FLAGS saveFlags = pCB->flags;
1190 XGL_QUEUE_TYPE saveQT = pCB->queueType;
1191 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
1192 pCB->cmdBuffer = cb;
1193 pCB->flags = saveFlags;
1194 pCB->queueType = saveQT;
1195 pCB->pNextGlobalCBNode = pSaveNext;
1196 pCB->lastVtxBinding = MAX_BINDING;
1197 }
1198}
1199// Set the last bound dynamic state of given type
1200// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
1201static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
1202{
1203 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
1204 if (pCB) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001205 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07001206 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07001207 addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT);
Tobin Ehlisd092d232015-02-13 13:30:07 -07001208 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
1209 while (pTrav && (state != pTrav->stateObj)) {
1210 pTrav = pTrav->pNext;
1211 }
1212 if (!pTrav) {
1213 char str[1024];
1214 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1215 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
1216 }
1217 pCB->lastBoundDynamicState[sType] = pTrav;
1218 loader_platform_thread_unlock_mutex(&globalLock);
1219 }
1220 else {
1221 char str[1024];
1222 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
1223 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
1224 }
1225}
Tobin Ehlis8cced212015-02-13 10:26:14 -07001226// Print the last bound Gfx Pipeline
1227static void printPipeline(const XGL_CMD_BUFFER cb)
1228{
1229 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1230 if (pCB) {
1231 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1232 if (!pPipeTrav) {
1233 // nothing to print
1234 }
1235 else {
1236 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
1237 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001238 free(pipeStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001239 }
Tobin Ehlis56a61072014-11-21 08:58:46 -07001240 }
1241}
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001242// Dump subgraph w/ DS info
Tobin Ehlis8cced212015-02-13 10:26:14 -07001243static void dsDumpDot(const XGL_CMD_BUFFER cb, FILE* pOutFile)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001244{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001245 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1246 if (pCB && pCB->lastBoundDescriptorSet) {
1247 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1248 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001249 char tmp_str[4*1024];
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001250 fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n");
1251 sprintf(tmp_str, "Region (%p)", pRegion->region);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001252 char* pGVstr = xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str);
1253 fprintf(pOutFile, "%s", pGVstr);
1254 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001255 fprintf(pOutFile, "subgraph cluster_DescriptorSet\n{\nlabel=\"Descriptor Set (%p)\"\n", pSet->set);
1256 sprintf(tmp_str, "Descriptor Set (%p)", pSet->set);
1257 LAYOUT_NODE* pLayout = pSet->pLayouts;
1258 uint32_t layout_index = 0;
1259 while (pLayout) {
1260 ++layout_index;
1261 sprintf(tmp_str, "LAYOUT%u", layout_index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001262 pGVstr = xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str);
1263 fprintf(pOutFile, "%s", pGVstr);
1264 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001265 pLayout = pLayout->pNext;
1266 if (pLayout) {
1267 fprintf(pOutFile, "\"%s\" -> \"LAYOUT%u\" [];\n", tmp_str, layout_index+1);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001268 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001269 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001270 if (pSet->pUpdateStructs) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001271 pGVstr = dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates");
1272 fprintf(pOutFile, "%s", pGVstr);
1273 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001274 }
1275 fprintf(pOutFile, "}\n");
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001276 fprintf(pOutFile, "}\n");
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001277 pRegion = pRegion->pNext;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001278 }
1279}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001280
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001281// Dump a GraphViz dot file showing the pipeline
Tobin Ehlis8cced212015-02-13 10:26:14 -07001282static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001283{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001284 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1285 if (pCB) {
1286 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1287 if (pPipeTrav) {
1288 FILE* pOutFile;
1289 pOutFile = fopen(outFileName, "w");
1290 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1291 fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001292 char* pGVstr = NULL;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001293 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07001294 if (pCB->lastBoundDynamicState[i] && pCB->lastBoundDynamicState[i]->pCreateInfo) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001295 pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i));
1296 fprintf(pOutFile, "%s", pGVstr);
1297 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001298 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001299 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001300 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
1301 fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001302 pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD");
1303 fprintf(pOutFile, "%s", pGVstr);
1304 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001305 fprintf(pOutFile, "}\n");
1306 dsDumpDot(cb, pOutFile);
1307 fprintf(pOutFile, "}\n"); // close main graph "g"
1308 fclose(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001309 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001310 }
1311}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001312// Synch up currently bound pipeline settings with DS mappings
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001313// 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 -07001314static void synchDSMapping(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001315{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001316 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1317 if (pCB && pCB->lastBoundPipeline) {
1318 // First verify that we have a Node for bound pipeline
1319 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1320 char str[1024];
1321 if (!pPipeTrav) {
1322 sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline);
1323 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
1324 }
1325 else {
1326 // Verify Vtx binding
1327 if (MAX_BINDING != pCB->lastVtxBinding) {
1328 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) {
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001329 if (0 == pPipeTrav->vtxBindingCount) {
1330 sprintf(str, "Vtx Buffer Index %u was bound, but no vtx buffers are attached to PSO.", pCB->lastVtxBinding);
1331 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1332 }
1333 else {
1334 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
1335 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1336 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001337 }
1338 else {
1339 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : ");
1340 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
1341 free(tmpStr);
1342 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001343 }
1344 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001345 }
1346}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001347// Print details of DS config to stdout
Tobin Ehlis8cced212015-02-13 10:26:14 -07001348static void printDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001349{
Tobin Ehlise79df942014-11-18 16:38:08 -07001350 char tmp_str[1024];
1351 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 -07001352 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1353 if (pCB) {
1354 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1355 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001356 // Print out region details
1357 sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region);
1358 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001359 char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " ");
1360 sprintf(ds_config_str, "%s", pRegionStr);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001361 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001362 free(pRegionStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001363 // Print out set details
1364 char prefix[10];
1365 uint32_t index = 0;
1366 sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set);
1367 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1368 LAYOUT_NODE* pLayout = pSet->pLayouts;
1369 while (pLayout) {
1370 // Print layout details
1371 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 -07001372 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001373 sprintf(prefix, " [L%u] ", index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001374 char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix);
1375 sprintf(ds_config_str, "%s", pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001376 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001377 free(pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001378 pLayout = pLayout->pPriorSetLayout;
1379 index++;
1380 }
1381 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
1382 if (pUpdate) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001383 sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
1384 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1385 sprintf(prefix, " [UC] ");
1386 sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix));
1387 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
1388 // TODO : If there is a "view" associated with this update, print CI for that view
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001389 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001390 else {
1391 sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set);
1392 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1393 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001394 }
1395}
1396
Tobin Ehlisd092d232015-02-13 13:30:07 -07001397static void printCB(const XGL_CMD_BUFFER cb)
1398{
1399 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1400 if (pCB) {
1401 char str[1024];
1402 CMD_NODE* pCmd = pCB->pCmds;
1403 sprintf(str, "Cmds in CB %p", (void*)cb);
1404 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
1405 while (pCmd) {
1406 sprintf(str, " CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type));
1407 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str);
1408 pCmd = pCmd->pNext;
1409 }
1410 }
1411 else {
1412 // Nothing to print
1413 }
1414}
1415
Tobin Ehlis8cced212015-02-13 10:26:14 -07001416static void synchAndDumpDot(const XGL_CMD_BUFFER cb)
Jeremy Hayes668ca052015-01-29 13:03:36 -07001417{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001418 synchDSMapping(cb);
1419 dumpDotFile(cb, "pipeline_dump.dot");
Jeremy Hayes668ca052015-01-29 13:03:36 -07001420}
1421
Tobin Ehlis8cced212015-02-13 10:26:14 -07001422static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001423{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001424 synchDSMapping(cb);
1425 printDSConfig(cb);
1426 printPipeline(cb);
1427 printDynamicState(cb);
Tobin Ehlis224dd812015-02-19 15:26:49 -07001428 static int autoDumpOnce = 0;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001429 if (autoDumpOnce) {
1430 autoDumpOnce = 0;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001431 dumpDotFile(cb, "pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001432 // Convert dot to png if dot available
Ian Elliott81ac44c2015-01-13 17:52:38 -07001433#if defined(_WIN32)
1434// FIXME: NEED WINDOWS EQUIVALENT
1435#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07001436 if(access( "/usr/bin/dot", X_OK) != -1) {
1437 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
1438 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001439#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001440 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001441}
1442
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001443static void initDrawState(void)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001444{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001445 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001446 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001447 strOpt = getLayerOption("DrawStateReportLevel");
1448 if (strOpt != NULL)
1449 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001450
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001451 strOpt = getLayerOption("DrawStateDebugAction");
1452 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001453 g_debugAction = atoi(strOpt);
1454
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001455 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1456 {
1457 strOpt = getLayerOption("DrawStateLogFilename");
1458 if (strOpt)
1459 {
1460 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001461 }
1462 if (g_logFile == NULL)
1463 g_logFile = stdout;
1464 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001465 // initialize Layer dispatch table
1466 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001467 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001468 fpNextGPA = pCurObj->pGPA;
1469 assert(fpNextGPA);
1470
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001471 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1472
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001473 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001474 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001475
1476 if (!globalLockInitialized)
1477 {
1478 // TODO/TBD: Need to delete this mutex sometime. How??? One
1479 // suggestion is to call this during xglCreateInstance(), and then we
1480 // can clean it up during xglDestroyInstance(). However, that requires
1481 // that the layer have per-instance locks. We need to come back and
1482 // address this soon.
1483 loader_platform_thread_create_mutex(&globalLock);
1484 globalLockInitialized = 1;
1485 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001486}
1487
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001488XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1489{
1490 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1491 return result;
1492}
1493
1494XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1495{
1496 XGL_RESULT result = nextTable.DestroyInstance(instance);
1497 return result;
1498}
1499
1500XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1501{
1502 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1503 return result;
1504}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001505
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001506XGL_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 -06001507{
1508 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001509 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001510 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001511 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001512 return result;
1513}
1514
1515XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1516{
1517 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001518 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001519 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001520 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001521 return result;
1522}
1523
1524XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1525{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001526 // Free all the memory
1527 loader_platform_thread_lock_mutex(&globalLock);
1528 freePipelines();
1529 freeSamplers();
1530 freeImages();
1531 freeBuffers();
1532 freeCmdBuffers();
1533 freeDynamicState();
1534 freeRegions();
1535 freeLayouts();
1536 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001537 XGL_RESULT result = nextTable.DestroyDevice(device);
1538 return result;
1539}
1540
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001541XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001542{
1543 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001544 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001545 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001546 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001547 return result;
1548}
1549
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001550XGL_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 -06001551{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001552 if (gpu != NULL)
1553 {
1554 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1555 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001556 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001557 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001558 return result;
1559 } else
1560 {
1561 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1562 return XGL_ERROR_INVALID_POINTER;
1563 // This layer compatible with all GPUs
1564 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001565 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001566 return XGL_SUCCESS;
1567 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001568}
1569
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001570XGL_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 -06001571{
1572 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1573 return result;
1574}
1575
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001576XGL_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 -06001577{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001578 for (uint32_t i=0; i < cmdBufferCount; i++) {
1579 // Validate that cmd buffers have been updated
1580 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001581 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1582 return result;
1583}
1584
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001585XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001586{
1587 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1588 return result;
1589}
1590
1591XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1592{
1593 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1594 return result;
1595}
1596
1597XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1598{
1599 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1600 return result;
1601}
1602
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001603XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1604{
1605 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1606 return result;
1607}
1608
1609XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1610{
1611 XGL_RESULT result = nextTable.FreeMemory(mem);
1612 return result;
1613}
1614
1615XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1616{
1617 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1618 return result;
1619}
1620
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001621XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001622{
1623 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1624 return result;
1625}
1626
1627XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1628{
1629 XGL_RESULT result = nextTable.UnmapMemory(mem);
1630 return result;
1631}
1632
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001633XGL_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 -06001634{
1635 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1636 return result;
1637}
1638
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001639XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1640{
1641 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001642 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001643 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001644 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001645 return result;
1646}
1647
1648XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1649{
1650 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1651 return result;
1652}
1653
1654XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1655{
1656 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1657 return result;
1658}
1659
1660XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1661{
1662 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1663 return result;
1664}
1665
1666XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1667{
1668 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1669 return result;
1670}
1671
1672XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1673{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001674 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001675 XGL_RESULT result = nextTable.DestroyObject(object);
1676 return result;
1677}
1678
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001679XGL_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 -06001680{
1681 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1682 return result;
1683}
1684
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001685XGL_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 -06001686{
Jon Ashburned62b412015-01-15 10:39:19 -07001687 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001688 return result;
1689}
1690
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001691XGL_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)
1692{
1693 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1694 return result;
1695}
1696
1697XGL_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)
1698{
1699 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1700 return result;
1701}
1702
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001703XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1704{
1705 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1706 return result;
1707}
1708
1709XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1710{
1711 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1712 return result;
1713}
1714
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001715XGL_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 -06001716{
1717 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1718 return result;
1719}
1720
1721XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1722{
1723 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1724 return result;
1725}
1726
1727XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1728{
1729 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1730 return result;
1731}
1732
1733XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1734{
1735 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1736 return result;
1737}
1738
1739XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1740{
1741 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1742 return result;
1743}
1744
1745XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1746{
1747 XGL_RESULT result = nextTable.GetEventStatus(event);
1748 return result;
1749}
1750
1751XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1752{
1753 XGL_RESULT result = nextTable.SetEvent(event);
1754 return result;
1755}
1756
1757XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1758{
1759 XGL_RESULT result = nextTable.ResetEvent(event);
1760 return result;
1761}
1762
1763XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1764{
1765 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1766 return result;
1767}
1768
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001769XGL_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 -06001770{
1771 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1772 return result;
1773}
1774
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001775XGL_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 -06001776{
1777 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1778 return result;
1779}
1780
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001781XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1782{
1783 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001784 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001785 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001786 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001787#if ALLOC_DEBUG
1788 printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1789#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001790 pNewNode->buffer = *pBuffer;
1791 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
1792 pNewNode->pNext = g_pBufferHead;
1793 g_pBufferHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001794 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001795 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001796 return result;
1797}
1798
1799XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1800{
1801 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1802 return result;
1803}
1804
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001805XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1806{
1807 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1808 return result;
1809}
1810
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001811XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1812{
1813 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1814 return result;
1815}
1816
1817XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1818{
1819 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1820 return result;
1821}
1822
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001823XGL_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 -06001824{
1825 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1826 return result;
1827}
1828
1829XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1830{
1831 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001832 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001833 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001834 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001835#if ALLOC_DEBUG
1836 printf("Alloc22 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
1837#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001838 pNewNode->image = *pView;
1839 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1840 pNewNode->pNext = g_pImageHead;
1841 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001842 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001843 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001844 return result;
1845}
1846
1847XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1848{
1849 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1850 return result;
1851}
1852
1853XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1854{
1855 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1856 return result;
1857}
1858
1859XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1860{
1861 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1862 return result;
1863}
1864
1865XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1866{
1867 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1868 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001869 char str[1024];
1870 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1871 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001872 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001873 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001874 if (pTrav) {
1875 while (pTrav->pNext)
1876 pTrav = pTrav->pNext;
1877 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001878#if ALLOC_DEBUG
1879 printf("Alloc23 #%lu pTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pTrav->pNext);
1880#endif
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001881 pTrav = pTrav->pNext;
1882 }
1883 else {
1884 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001885#if ALLOC_DEBUG
1886 printf("Alloc24 #%lu pTrav addr(%p)\n", ++g_alloc_count, (void*)pTrav);
1887#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001888 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001889 }
1890 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1891 pTrav->pipeline = *pPipeline;
1892 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001893 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001894 return result;
1895}
1896
1897XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1898{
1899 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1900 return result;
1901}
1902
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001903XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001904{
1905 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1906 return result;
1907}
1908
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001909XGL_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 -06001910{
1911 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1912 return result;
1913}
1914
1915XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1916{
1917 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1918 return result;
1919}
1920
1921XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1922{
1923 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001924 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07001925 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001926 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001927#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001928 printf("Alloc25 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001929#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001930 pNewNode->sampler = *pSampler;
1931 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1932 pNewNode->pNext = g_pSamplerHead;
1933 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001934 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001935 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001936 return result;
1937}
1938
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001939XGL_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)
1940{
1941 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1942 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001943 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001944#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001945 printf("Alloc26 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001946#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001947 if (NULL == pNewNode) {
1948 char str[1024];
1949 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
1950 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1951 }
1952 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001953 // TODO : API Currently missing a count here that we should multiply by struct size
1954 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001955#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001956 printf("Alloc27 #%lu pNewNode->pCreateInfoList addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pCreateInfoList);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001957#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07001958 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001959 void* pCITrav = NULL;
1960 uint32_t totalCount = 0;
1961 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07001962 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001963 pCITrav = (void*)pSetLayoutInfoList->pNext;
1964 totalCount = pSetLayoutInfoList->count;
1965 }
1966 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
1967 while (pCITrav) {
1968 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
1969 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001970#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001971 printf("Alloc28 #%lu *ppNext addr(%p)\n", ++g_alloc_count, (void*)*ppNext);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001972#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001973 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1974 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
Tobin Ehlis82871a82015-02-19 09:55:18 -07001975 ppNext = (void**)&((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001976 }
1977 if (totalCount > 0) {
1978 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001979#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07001980 printf("Alloc29 #%lu pNewNode->pTypes addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pTypes);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07001981#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07001982 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
Tobin Ehlis82871a82015-02-19 09:55:18 -07001983 uint32_t offset = 0;
1984 uint32_t i = 0;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001985 while (pLCI) {
Tobin Ehlis82871a82015-02-19 09:55:18 -07001986 for (i = 0; i < pLCI->count; i++) {
1987 pNewNode->pTypes[offset + i] = pLCI->descriptorType;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001988 }
Tobin Ehlis82871a82015-02-19 09:55:18 -07001989 offset += i;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001990 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
1991 }
1992 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001993 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001994 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001995 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07001996 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
1997 assert(i < XGL_NUM_SHADER_STAGE);
1998 if (stage & stageFlags)
1999 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07002000 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07002001 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002002 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002003 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
2004 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002005 if (NULL != priorSetLayout && pPriorNode == NULL) {
2006 char str[1024];
2007 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
2008 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2009 }
2010 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
2011 // Get count for prior layout
2012 pNewNode->startIndex = pPriorNode->endIndex + 1;
2013 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07002014 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002015 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002016 pNewNode->pPriorSetLayout = pPriorNode;
2017 // Put new node at Head of global Layer list
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002018 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002019 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002020 g_pLayoutHead = pNewNode;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002021 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002022 }
2023 return result;
2024}
2025
2026XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
2027{
2028 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
2029 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002030 loader_platform_thread_lock_mutex(&globalLock);
2031 REGION_NODE* pRegionNode = g_pRegionHead;
2032 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002033 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002034 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2035 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002036 }
2037 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002038 pRegionNode->updateActive = 1;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002039 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002040 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002041 }
2042 return result;
2043}
2044
2045XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
2046{
2047 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
2048 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002049 loader_platform_thread_lock_mutex(&globalLock);
2050 REGION_NODE* pRegionNode = g_pRegionHead;
2051 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002052 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002053 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
2054 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002055 }
2056 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002057 if (!pRegionNode->updateActive) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002058 char str[1024];
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002059 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
2060 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 -07002061 }
2062 else {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002063 pRegionNode->updateActive = 0;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002064 }
2065 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002066 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002067 }
2068 return result;
2069}
2070
2071XGL_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)
2072{
2073 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
2074 if (XGL_SUCCESS == result) {
2075 // Insert this region into Global Region LL at head
2076 char str[1024];
2077 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
2078 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002079 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002080 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002081#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002082 printf("Alloc30 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002083#endif
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002084 if (NULL == pNewNode) {
2085 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002086 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002087 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
2088 }
2089 else {
2090 memset(pNewNode, 0, sizeof(REGION_NODE));
2091 pNewNode->pNext = g_pRegionHead;
2092 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002093 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
2094 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
2095 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07002096 if (typeCountSize) {
2097 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
2098 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002099#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002100 printf("Alloc31 #%lu *ppTypeCount addr(%p)\n", ++g_alloc_count, (void*)*ppTypeCount);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002101#endif
Tobin Ehlisefa84162015-02-17 09:54:13 -07002102 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
2103 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002104 pNewNode->regionUsage = regionUsage;
2105 pNewNode->updateActive = 0;
2106 pNewNode->maxSets = maxSets;
2107 pNewNode->region = *pDescriptorRegion;
2108 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07002109 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002110 }
2111 else {
2112 // Need to do anything if region create fails?
2113 }
2114 return result;
2115}
2116
2117XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
2118{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002119 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002120 if (XGL_SUCCESS == result) {
2121 clearDescriptorRegion(descriptorRegion);
2122 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002123 return result;
2124}
2125
2126XGL_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)
2127{
2128 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002129 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
2130 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
2131 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002132 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002133 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002134 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002135 }
2136 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002137 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002138 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002139 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002140 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002141 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002142 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002143#if ALLOC_DEBUG
Tobin Ehlis82871a82015-02-19 09:55:18 -07002144 printf("Alloc32 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002145#endif
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002146 if (NULL == pNewNode) {
2147 char str[1024];
2148 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002149 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 -07002150 }
2151 else {
2152 memset(pNewNode, 0, sizeof(SET_NODE));
2153 // Insert set at head of Set LL for this region
2154 pNewNode->pNext = pRegionNode->pSets;
2155 pRegionNode->pSets = pNewNode;
2156 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
2157 if (NULL == pLayout) {
2158 char str[1024];
2159 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
2160 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
2161 }
2162 pNewNode->pLayouts = pLayout;
2163 pNewNode->region = descriptorRegion;
2164 pNewNode->set = pDescriptorSets[i];
2165 pNewNode->setUsage = setUsage;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07002166 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis82871a82015-02-19 09:55:18 -07002167 size_t descriptorArraySize = sizeof(GENERIC_HEADER*)*pNewNode->descriptorCount;
2168 pNewNode->ppDescriptors = (GENERIC_HEADER**)malloc(descriptorArraySize);
2169#if ALLOC_DEBUG
2170 printf("Alloc35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_alloc_count, (void*)pNewNode->ppDescriptors);
2171#endif
2172 memset(pNewNode->ppDescriptors, 0, descriptorArraySize);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002173 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002174 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002175 }
2176 }
2177 return result;
2178}
2179
2180XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
2181{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002182 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002183 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002184 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002185 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
2186}
2187
2188XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
2189{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002190 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002191 char str[1024];
2192 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002193 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 -07002194 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002195 else {
2196 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
2197 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
2198 }
2199
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002200 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
2201}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002202
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002203XGL_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 -06002204{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002205 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002206 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002207 return result;
2208}
2209
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002210XGL_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 -06002211{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002212 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002213 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002214 return result;
2215}
2216
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002217XGL_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 -06002218{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002219 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002220 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002221 return result;
2222}
2223
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002224XGL_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 -06002225{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002226 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002227 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002228 return result;
2229}
2230
2231XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2232{
2233 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002234 if (XGL_SUCCESS == result) {
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002235 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002236 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002237#if ALLOC_DEBUG
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002238 printf("Alloc33 #%lu pCB addr(%p)\n", ++g_alloc_count, (void*)pCB);
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002239#endif
Tobin Ehlis8cced212015-02-13 10:26:14 -07002240 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2241 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2242 g_pCmdBufferHead = pCB;
2243 pCB->cmdBuffer = *pCmdBuffer;
2244 pCB->flags = pCreateInfo->flags;
2245 pCB->queueType = pCreateInfo->queueType;
2246 pCB->lastVtxBinding = MAX_BINDING;
Tobin Ehlis45662712015-02-23 09:06:28 -07002247 g_lastCmdBuffer[getTIDIndex()] = *pCmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002248 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002249 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002250 return result;
2251}
2252
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002253XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002254{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002255 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002256 if (XGL_SUCCESS == result) {
2257 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002258 if (pCB) {
2259 if (CB_NEW != pCB->state)
2260 resetCB(cmdBuffer);
2261 pCB->state = CB_UPDATE_ACTIVE;
2262 }
2263 else {
2264 char str[1024];
2265 sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2266 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2267 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002268 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002269 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002270 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002271 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002272 return result;
2273}
2274
2275XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2276{
2277 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002278 if (XGL_SUCCESS == result) {
2279 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlis82871a82015-02-19 09:55:18 -07002280 if (pCB) {
2281 pCB->state = CB_UPDATE_COMPLETE;
2282 printCB(cmdBuffer);
2283 }
2284 else {
2285 char str[1024];
2286 sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
2287 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2288 }
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002289 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002290 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002291 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002292 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002293 return result;
2294}
2295
2296XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2297{
2298 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002299 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002300 resetCB(cmdBuffer);
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002301 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis45662712015-02-23 09:06:28 -07002302 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisfb1ef942015-02-20 09:30:06 -07002303 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002304 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002305 return result;
2306}
2307
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002308XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002309{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002310 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2311 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002312 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002313 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002314 if (getPipeline(pipeline)) {
2315 pCB->lastBoundPipeline = pipeline;
2316 }
2317 else {
2318 char str[1024];
2319 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2320 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2321 }
2322 synchAndDumpDot(cmdBuffer);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002323 }
2324 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002325 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002326 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2327 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002328 }
2329 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2330}
2331
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002332XGL_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 -06002333{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002334 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2335 if (pCB) {
2336 // TODO : Handle storing Pipeline Deltas to cmd buffer here
Tobin Ehlis45662712015-02-23 09:06:28 -07002337 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002338 synchAndDumpDot(cmdBuffer);
2339 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2340 }
2341 else {
2342 char str[1024];
2343 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2344 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2345 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002346 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2347}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002348
2349XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2350{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002351 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
2352 synchAndDumpDot(cmdBuffer);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002353 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2354}
2355
2356XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2357{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002358 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2359 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002360 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002361 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002362 if (getSetNode(descriptorSet)) {
2363 if (dsUpdateActive(descriptorSet)) {
Tobin Ehlis224dd812015-02-19 15:26:49 -07002364 // TODO : This check here needs to be made at QueueSubmit time
2365/*
Tobin Ehlis8cced212015-02-13 10:26:14 -07002366 char str[1024];
2367 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2368 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 -07002369*/
Tobin Ehlis8cced212015-02-13 10:26:14 -07002370 }
2371 loader_platform_thread_lock_mutex(&globalLock);
2372 pCB->lastBoundDescriptorSet = descriptorSet;
2373 loader_platform_thread_unlock_mutex(&globalLock);
2374 synchAndDumpDot(cmdBuffer);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002375 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002376 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2377 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002378 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002379 else {
2380 char str[1024];
2381 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2382 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2383 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002384 }
2385 else {
2386 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002387 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2388 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002389 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002390 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2391}
2392
2393XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2394{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002395 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2396 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002397 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002398 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002399 // TODO : Track idxBuffer binding
2400 }
2401 else {
2402 char str[1024];
2403 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2404 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2405 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002406 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2407}
2408
2409XGL_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 +08002410{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002411 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2412 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002413 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002414 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002415 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002416 }
2417 else {
2418 char str[1024];
2419 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2420 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2421 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002422 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002423}
2424
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002425XGL_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 -06002426{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002427 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2428 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002429 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002430 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002431 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002432 char str[1024];
2433 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2434 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2435 synchAndPrintDSConfig(cmdBuffer);
2436 }
2437 else {
2438 char str[1024];
2439 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2440 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2441 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002442 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2443}
2444
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002445XGL_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 -06002446{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002447 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2448 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002449 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002450 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002451 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002452 char str[1024];
2453 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2454 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2455 synchAndPrintDSConfig(cmdBuffer);
2456 }
2457 else {
2458 char str[1024];
2459 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2460 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2461 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002462 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2463}
2464
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002465XGL_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 -06002466{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002467 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2468 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002469 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002470 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002471 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002472 char str[1024];
2473 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2474 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2475 synchAndPrintDSConfig(cmdBuffer);
2476 }
2477 else {
2478 char str[1024];
2479 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2480 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2481 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002482 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002483}
2484
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002485XGL_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 -06002486{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002487 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2488 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002489 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002490 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002491 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002492 char str[1024];
2493 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2494 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2495 synchAndPrintDSConfig(cmdBuffer);
2496 }
2497 else {
2498 char str[1024];
2499 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2500 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2501 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002502 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002503}
2504
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002505XGL_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 -06002506{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002507 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2508 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002509 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002510 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002511 }
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 Ehlis8726b9f2014-10-24 12:01:45 -06002517 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2518}
2519
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002520XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002521{
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_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002526 }
2527 else {
2528 char str[1024];
2529 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2530 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2531 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002532 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002533}
2534
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002535XGL_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 -06002536{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002537 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2538 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002539 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002540 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002541 }
2542 else {
2543 char str[1024];
2544 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2545 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2546 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002547 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002548}
2549
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002550XGL_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 -06002551{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002552 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2553 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002554 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002555 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002556 }
2557 else {
2558 char str[1024];
2559 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2560 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2561 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002562 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2563}
2564
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002565XGL_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 -06002566{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002567 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2568 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002569 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002570 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002571 }
2572 else {
2573 char str[1024];
2574 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2575 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2576 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002577 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002578}
2579
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002580XGL_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 -06002581{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002582 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2583 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002584 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002585 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002586 }
2587 else {
2588 char str[1024];
2589 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2590 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2591 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002592 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002593}
2594
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002595XGL_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 -06002596{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002597 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2598 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002599 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002600 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002601 }
2602 else {
2603 char str[1024];
2604 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2605 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2606 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002607 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002608}
2609
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002610XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2611{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002612 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2613 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002614 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002615 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002616 }
2617 else {
2618 char str[1024];
2619 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2620 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2621 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002622 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2623}
2624
2625XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2626{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002627 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2628 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002629 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002630 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002631 }
2632 else {
2633 char str[1024];
2634 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2635 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2636 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002637 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2638}
2639
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002640XGL_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 -06002641{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002642 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2643 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002644 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002645 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002646 }
2647 else {
2648 char str[1024];
2649 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2650 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2651 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002652 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2653}
2654
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002655XGL_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 -06002656{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002657 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2658 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002659 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002660 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002661 }
2662 else {
2663 char str[1024];
2664 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2665 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2666 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002667 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2668}
2669
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002670XGL_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 -06002671{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002672 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2673 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002674 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002675 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002676 }
2677 else {
2678 char str[1024];
2679 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2680 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2681 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002682 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2683}
2684
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002685XGL_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 -06002686{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002687 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2688 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002689 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002690 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002691 }
2692 else {
2693 char str[1024];
2694 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2695 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2696 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002697 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2698}
2699
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002700XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002701{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002702 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2703 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002704 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002705 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002706 }
2707 else {
2708 char str[1024];
2709 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2710 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2711 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002712 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002713}
2714
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002715XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002716{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002717 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2718 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002719 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002720 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002721 }
2722 else {
2723 char str[1024];
2724 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2725 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2726 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002727 nextTable.CmdResetEvent(cmdBuffer, event);
2728}
2729
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002730XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002731{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002732 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2733 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002734 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002735 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002736 }
2737 else {
2738 char str[1024];
2739 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2740 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2741 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002742 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2743}
2744
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002745XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002746{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002747 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2748 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002749 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002750 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002751 }
2752 else {
2753 char str[1024];
2754 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2755 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2756 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002757 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2758}
2759
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002760XGL_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 -06002761{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002762 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2763 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002764 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002765 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002766 }
2767 else {
2768 char str[1024];
2769 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2770 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2771 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002772 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2773}
2774
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002775XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002776{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002777 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2778 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002779 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002780 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002781 }
2782 else {
2783 char str[1024];
2784 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2785 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2786 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002787 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2788}
2789
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002790XGL_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 -06002791{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002792 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2793 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002794 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002795 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002796 }
2797 else {
2798 char str[1024];
2799 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2800 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2801 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002802 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2803}
2804
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002805XGL_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 -06002806{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002807 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2808 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002809 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002810 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002811 }
2812 else {
2813 char str[1024];
2814 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2815 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2816 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002817 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002818}
2819
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002820XGL_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 -06002821{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002822 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2823 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002824 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002825 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002826 }
2827 else {
2828 char str[1024];
2829 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2830 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2831 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002832 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2833}
2834
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002835XGL_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 -06002836{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002837 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2838 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002839 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002840 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002841 }
2842 else {
2843 char str[1024];
2844 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2845 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2846 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002847 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002848}
2849
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002850XGL_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 -06002851{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002852 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2853 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002854 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002855 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002856 }
2857 else {
2858 char str[1024];
2859 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2860 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2861 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002862 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2863}
2864
2865XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2866{
2867 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
2868 return result;
2869}
2870
2871XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
2872{
2873 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
2874 return result;
2875}
2876
2877XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2878{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002879 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2880 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002881 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002882 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002883 }
2884 else {
2885 char str[1024];
2886 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2887 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2888 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002889 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
2890}
2891
2892XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2893{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002894 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2895 if (pCB) {
Tobin Ehlis45662712015-02-23 09:06:28 -07002896 g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002897 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002898 }
2899 else {
2900 char str[1024];
2901 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2902 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2903 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002904 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002905}
2906
2907XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
2908{
2909 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
2910 return result;
2911}
2912
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002913XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002914{
Tobin Ehlise79df942014-11-18 16:38:08 -07002915 // This layer intercepts callbacks
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002916 XGL_LAYER_DBG_FUNCTION_NODE* pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
2917#if ALLOC_DEBUG
2918 printf("Alloc34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pNewDbgFuncNode);
2919#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07002920 if (!pNewDbgFuncNode)
2921 return XGL_ERROR_OUT_OF_MEMORY;
2922 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2923 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002924 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2925 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002926 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
2927 return result;
2928}
2929
2930XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
2931{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002932 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07002933 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
2934 while (pTrav) {
2935 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
2936 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002937 if (g_pDbgFunctionHead == pTrav)
2938 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis8614b8d2015-02-17 16:27:03 -07002939#if ALLOC_DEBUG
2940 printf("Free34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pTrav);
2941#endif
Tobin Ehlise79df942014-11-18 16:38:08 -07002942 free(pTrav);
2943 break;
2944 }
2945 pPrev = pTrav;
2946 pTrav = pTrav->pNext;
2947 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002948 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2949 return result;
2950}
2951
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002952XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002953{
2954 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2955 return result;
2956}
2957
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002958XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002959{
2960 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2961 return result;
2962}
2963
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002964XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002965{
2966 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2967 return result;
2968}
2969
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002970XGL_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 -06002971{
2972 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2973 return result;
2974}
2975
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002976XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002977{
2978 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2979}
2980
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002981XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002982{
2983 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2984}
2985
Ian Elliott81ac44c2015-01-13 17:52:38 -07002986#if defined(WIN32)
2987// FIXME: NEED WINDOWS EQUIVALENT
2988#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002989XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2990{
2991 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002992 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002993 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002994 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002995 return result;
2996}
2997
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002998XGL_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 -06002999{
Chia-I Wu6204f342014-11-07 13:33:45 +08003000 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003001 return result;
3002}
3003
3004XGL_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)
3005{
3006 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
3007 return result;
3008}
3009
3010XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
3011{
3012 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
3013 return result;
3014}
Ian Elliott81ac44c2015-01-13 17:52:38 -07003015#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07003016// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003017void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003018{
Tobin Ehlis8cced212015-02-13 10:26:14 -07003019 // TODO : Currently just setting cmdBuffer based on global var
Tobin Ehlis45662712015-02-23 09:06:28 -07003020 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003021}
3022
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003023void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07003024{
Ian Elliott81ac44c2015-01-13 17:52:38 -07003025#if defined(_WIN32)
3026// FIXME: NEED WINDOWS EQUIVALENT
3027 char str[1024];
3028 sprintf(str, "Cannot execute dot program yet on Windows.");
3029 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3030#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003031 char dotExe[32] = "/usr/bin/dot";
3032 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis45662712015-02-23 09:06:28 -07003033 dumpDotFile(g_lastCmdBuffer[getTIDIndex()], "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07003034 char dotCmd[1024];
3035 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
3036 system(dotCmd);
3037 remove("/tmp/tmp.dot");
3038 }
3039 else {
3040 char str[1024];
3041 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
3042 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
3043 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07003044#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07003045}
3046
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06003047XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003048{
3049 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08003050 void *addr;
3051
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003052 if (gpu == NULL)
3053 return NULL;
3054 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07003055 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003056
Chia-I Wu706533e2015-01-05 13:18:57 +08003057 addr = layer_intercept_proc(funcName);
3058 if (addr)
3059 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003060 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07003061 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08003062 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07003063 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003064 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06003065 if (gpuw->pGPA == NULL)
3066 return NULL;
3067 return gpuw->pGPA(gpuw->nextObject, funcName);
3068 }
3069}