blob: ee1d30221d5a554dd42073f70db4040b54750f7c [file] [log] [blame]
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
Ian Elliott81ac44c2015-01-13 17:52:38 -070028#include "loader_platform.h"
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080029#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080030#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlisb8154982014-10-27 14:53:17 -060031#include "xgl_struct_string_helper.h"
Tobin Ehlisa701ef02014-11-27 15:43:39 -070032#include "xgl_struct_graphviz_helper.h"
Tobin Ehlise79df942014-11-18 16:38:08 -070033#include "draw_state.h"
Jon Ashburn2e9b5612014-12-22 13:38:27 -070034#include "layers_config.h"
Ian Elliott20f06872015-02-12 17:08:34 -070035// The following is #included again to catch certain OS-specific functions
36// being used:
37#include "loader_platform.h"
Jon Ashburn5a7be202015-02-16 08:46:53 -070038#include "layers_msg.h"
Tobin Ehlis8726b9f2014-10-24 12:01:45 -060039static XGL_LAYER_DISPATCH_TABLE nextTable;
40static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott81ac44c2015-01-13 17:52:38 -070041static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
42static int globalLockInitialized = 0;
43static loader_platform_thread_mutex globalLock;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070044
Tobin Ehlis26092022014-11-20 09:49:17 -070045// Return the size of the underlying struct based on struct type
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060046static size_t sTypeStructSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis26092022014-11-20 09:49:17 -070047{
48 switch (sType)
49 {
50 case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
51 return sizeof(XGL_APPLICATION_INFO);
52 case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
53 return sizeof(XGL_DEVICE_CREATE_INFO);
54 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
55 return sizeof(XGL_MEMORY_ALLOC_INFO);
56 case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
57 return sizeof(XGL_MEMORY_OPEN_INFO);
58 case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
59 return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070060 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
61 return sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070062 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
63 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070064 case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
65 return sizeof(XGL_EVENT_WAIT_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070066 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
67 return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
68 case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
69 return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
70 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
71 return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
72 case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
73 return sizeof(XGL_SHADER_CREATE_INFO);
74 case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
75 return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
76 case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
77 return sizeof(XGL_SAMPLER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -070078 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
79 return sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
80 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
81 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
82 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
83 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
84 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
85 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
86 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
87 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -070088 case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
89 return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
90 case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
91 return sizeof(XGL_EVENT_CREATE_INFO);
92 case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
93 return sizeof(XGL_FENCE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -060094 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -070095 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -060096 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -070097 return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
98 case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
99 return sizeof(XGL_QUERY_POOL_CREATE_INFO);
100 case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
101 return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
102 case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
103 return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700104 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
105 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700106 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
107 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700108 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
109 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700110 case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
111 return sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700112 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
113 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
114 case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
115 return sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700116 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
117 return sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700118 case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
119 return sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
120 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
121 return sizeof(XGL_IMAGE_CREATE_INFO);
122 case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
123 return sizeof(XGL_BUFFER_CREATE_INFO);
124 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
125 return sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
126 case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
127 return sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
128 case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
129 return sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
130 case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
131 return sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
132 case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
133 return sizeof(XGL_RENDER_PASS_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700134 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
135 return sizeof(XGL_LAYER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700136 case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
137 return sizeof(XGL_PIPELINE_BARRIER);
138 case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
139 return sizeof(XGL_MEMORY_BARRIER);
140 case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
141 return sizeof(XGL_BUFFER_MEMORY_BARRIER);
142 case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
143 return sizeof(XGL_IMAGE_MEMORY_BARRIER);
144 case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
145 return sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
146 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
147 return sizeof(XGL_UPDATE_SAMPLERS);
148 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
149 return sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
150 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
151 return sizeof(XGL_UPDATE_IMAGES);
152 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
153 return sizeof(XGL_UPDATE_BUFFERS);
154 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
155 return sizeof(XGL_UPDATE_AS_COPY);
156 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
157 return sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
158 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
159 return sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700160 default:
161 return 0;
162 }
163}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700164// Return the size of the underlying struct based on sType
165static size_t dynStateCreateInfoSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700166{
167 switch (sType)
168 {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700169 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
170 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
171 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
172 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
173 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
174 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
175 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
176 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700177 default:
178 return 0;
179 }
180}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700181// Return a string representation of CMD_TYPE enum
182static char* cmdTypeToString(CMD_TYPE cmd)
183{
184 switch (cmd)
185 {
186 case CMD_BINDPIPELINE:
187 return "CMD_BINDPIPELINE";
188 case CMD_BINDPIPELINEDELTA:
189 return "CMD_BINDPIPELINEDELTA";
190 case CMD_BINDDYNAMICSTATEOBJECT:
191 return "CMD_BINDDYNAMICSTATEOBJECT";
192 case CMD_BINDDESCRIPTORSET:
193 return "CMD_BINDDESCRIPTORSET";
194 case CMD_BINDINDEXBUFFER:
195 return "CMD_BINDINDEXBUFFER";
196 case CMD_BINDVERTEXBUFFER:
197 return "CMD_BINDVERTEXBUFFER";
198 case CMD_DRAW:
199 return "CMD_DRAW";
200 case CMD_DRAWINDEXED:
201 return "CMD_DRAWINDEXED";
202 case CMD_DRAWINDIRECT:
203 return "CMD_DRAWINDIRECT";
204 case CMD_DRAWINDEXEDINDIRECT:
205 return "CMD_DRAWINDEXEDINDIRECT";
206 case CMD_DISPATCH:
207 return "CMD_DISPATCH";
208 case CMD_DISPATCHINDIRECT:
209 return "CMD_DISPATCHINDIRECT";
210 case CMD_COPYBUFFER:
211 return "CMD_COPYBUFFER";
212 case CMD_COPYIMAGE:
213 return "CMD_COPYIMAGE";
214 case CMD_COPYBUFFERTOIMAGE:
215 return "CMD_COPYBUFFERTOIMAGE";
216 case CMD_COPYIMAGETOBUFFER:
217 return "CMD_COPYIMAGETOBUFFER";
218 case CMD_CLONEIMAGEDATA:
219 return "CMD_CLONEIMAGEDATA";
220 case CMD_UPDATEBUFFER:
221 return "CMD_UPDATEBUFFER";
222 case CMD_FILLBUFFER:
223 return "CMD_FILLBUFFER";
224 case CMD_CLEARCOLORIMAGE:
225 return "CMD_CLEARCOLORIMAGE";
226 case CMD_CLEARCOLORIMAGERAW:
227 return "CMD_CLEARCOLORIMAGERAW";
228 case CMD_CLEARDEPTHSTENCIL:
229 return "CMD_CLEARDEPTHSTENCIL";
230 case CMD_RESOLVEIMAGE:
231 return "CMD_RESOLVEIMAGE";
232 case CMD_SETEVENT:
233 return "CMD_SETEVENT";
234 case CMD_RESETEVENT:
235 return "CMD_RESETEVENT";
236 case CMD_WAITEVENTS:
237 return "CMD_WAITEVENTS";
238 case CMD_PIPELINEBARRIER:
239 return "CMD_PIPELINEBARRIER";
240 case CMD_BEGINQUERY:
241 return "CMD_BEGINQUERY";
242 case CMD_ENDQUERY:
243 return "CMD_ENDQUERY";
244 case CMD_RESETQUERYPOOL:
245 return "CMD_RESETQUERYPOOL";
246 case CMD_WRITETIMESTAMP:
247 return "CMD_WRITETIMESTAMP";
248 case CMD_INITATOMICCOUNTERS:
249 return "CMD_INITATOMICCOUNTERS";
250 case CMD_LOADATOMICCOUNTERS:
251 return "CMD_LOADATOMICCOUNTERS";
252 case CMD_SAVEATOMICCOUNTERS:
253 return "CMD_SAVEATOMICCOUNTERS";
254 case CMD_BEGINRENDERPASS:
255 return "CMD_BEGINRENDERPASS";
256 case CMD_ENDRENDERPASS:
257 return "CMD_ENDRENDERPASS";
258 default:
259 return "UNKNOWN";
260 }
261}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600262// Block of code at start here for managing/tracking Pipeline state that this layer cares about
263// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700264#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600265#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600266
Tobin Ehlis8cced212015-02-13 10:26:14 -0700267static uint64_t g_drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
268
Tobin Ehlis56a61072014-11-21 08:58:46 -0700269// TODO : Should be tracking lastBound per cmdBuffer and when draws occur, report based on that cmd buffer lastBound
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700270// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
271// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis8cced212015-02-13 10:26:14 -0700272static PIPELINE_NODE* g_pPipelineHead = NULL;
273static SAMPLER_NODE* g_pSamplerHead = NULL;
274static IMAGE_NODE* g_pImageHead = NULL;
275static BUFFER_NODE* g_pBufferHead = NULL;
276static GLOBAL_CB_NODE* g_pCmdBufferHead = NULL;
277static XGL_CMD_BUFFER g_lastCmdBuffer = NULL;
278#define MAX_BINDING 0xFFFFFFFF // Default vtxBinding value in CB Node to identify if no vtxBinding set
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600279
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700280static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
Tobin Ehlis56a61072014-11-21 08:58:46 -0700281
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700282static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700283{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700284 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700285 // Insert new node at head of appropriate LL
286 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700287 pStateNode->pNext = g_pDynamicStateHead[bindPoint];
288 g_pDynamicStateHead[bindPoint] = pStateNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700289 pStateNode->stateObj = state;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700290 pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700291 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700292 // VP has embedded ptr so need to handle that as special case
293 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pCreateInfo->sType) {
294 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pStateNode->pCreateInfo;
295 XGL_VIEWPORT** ppViewports = (XGL_VIEWPORT**)&pVPCI->pViewports;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700296 size_t vpSize = sizeof(XGL_VIEWPORT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700297 if (vpSize) {
298 *ppViewports = (XGL_VIEWPORT*)malloc(vpSize);
299 memcpy(*ppViewports, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pViewports, vpSize);
300 }
301 XGL_RECT** ppScissors = (XGL_RECT**)&pVPCI->pScissors;
Courtney Goeltzenleuchterc6e32f92015-02-11 14:13:34 -0700302 size_t scSize = sizeof(XGL_RECT) * pVPCI->viewportAndScissorCount;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700303 if (scSize) {
304 *ppScissors = (XGL_RECT*)malloc(scSize);
305 memcpy(*ppScissors, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pScissors, scSize);
306 }
307 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700308 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700309}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700310// Free all allocated nodes for Dynamic State objs
311static void freeDynamicState()
312{
313 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
314 DYNAMIC_STATE_NODE* pStateNode = g_pDynamicStateHead[i];
315 DYNAMIC_STATE_NODE* pFreeMe = pStateNode;
316 while (pStateNode) {
317 pFreeMe = pStateNode;
318 pStateNode = pStateNode->pNext;
319 assert(pFreeMe->pCreateInfo);
320 if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pFreeMe->pCreateInfo->sType) {
321 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pFreeMe->pCreateInfo;
322 if (pVPCI->pViewports) {
323 void** ppToFree = (void**)&pVPCI->pViewports;
324 free(*ppToFree);
325 }
326 if (pVPCI->pScissors) {
327 void** ppToFree = (void**)&pVPCI->pScissors;
328 free(*ppToFree);
329 }
330 }
331 free(pFreeMe->pCreateInfo);
332 free(pFreeMe);
333 }
334 }
335}
336// Free all sampler nodes
337static void freeSamplers()
338{
339 SAMPLER_NODE* pSampler = g_pSamplerHead;
340 SAMPLER_NODE* pFreeMe = pSampler;
341 while (pSampler) {
342 pFreeMe = pSampler;
343 pSampler = pSampler->pNext;
344 free(pFreeMe);
345 }
346}
347// Free all image nodes
348static void freeImages()
349{
350 IMAGE_NODE* pImage = g_pImageHead;
351 IMAGE_NODE* pFreeMe = pImage;
352 while (pImage) {
353 pFreeMe = pImage;
354 pImage = pImage->pNext;
355 free(pFreeMe);
356 }
357}
358// Free all buffer nodes
359static void freeBuffers()
360{
361 BUFFER_NODE* pBuffer = g_pBufferHead;
362 BUFFER_NODE* pFreeMe = pBuffer;
363 while (pBuffer) {
364 pFreeMe = pBuffer;
365 pBuffer = pBuffer->pNext;
366 free(pFreeMe);
367 }
368}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700369static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700370// Print the last bound dynamic state
Tobin Ehlis8cced212015-02-13 10:26:14 -0700371static void printDynamicState(const XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700372{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700373 GLOBAL_CB_NODE* pCB = getCBNode(cb);
374 if (pCB) {
375 loader_platform_thread_lock_mutex(&globalLock);
376 char str[1024];
377 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
378 if (pCB->lastBoundDynamicState[i]) {
379 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pCB->lastBoundDynamicState[i]->stateObj);
380 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
381 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pCB->lastBoundDynamicState[i]->pCreateInfo, " "));
382 break;
383 }
384 else {
385 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
386 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
387 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700388 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700389 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700390 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700391 else {
392 char str[1024];
393 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cb);
394 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
395 }
Tobin Ehlis56a61072014-11-21 08:58:46 -0700396}
397// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600398static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
399{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700400 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700401 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600402 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700403 if (pTrav->pipeline == pipeline) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700404 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600405 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700406 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600407 pTrav = pTrav->pNext;
408 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700409 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600410 return NULL;
411}
412
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700413// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700414// TODO : Use this function to display sampler info
415// commenting out for now to avoid warning about not being used
416/*
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700417static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
418{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700419 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700420 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700421 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700422 if (sampler == pTrav->sampler) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700423 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700424 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700425 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700426 pTrav = pTrav->pNext;
427 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700428 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700429 return NULL;
430}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700431*/
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700432
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600433// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700434// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600435static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
436{
Tobin Ehlis26092022014-11-20 09:49:17 -0700437 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700438 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis26092022014-11-20 09:49:17 -0700439 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700440 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
441 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600442 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700443 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700444 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis26092022014-11-20 09:49:17 -0700445 // Typically pNext is const so have to cast to avoid warning when we modify it here
446 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700447 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
448 // Special copy of Vtx info as it has embedded array
449 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700450 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pShadowTrav;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700451 pPipeline->vtxBindingCount = pVICI->bindingCount;
452 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700453 if (allocSize) {
454 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
455 memcpy(pPipeline->pVertexBindingDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
456 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700457 pPipeline->vtxAttributeCount = pVICI->attributeCount;
458 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700459 if (allocSize) {
460 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
461 memcpy(pPipeline->pVertexAttributeDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize);
462 }
463 }
464 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pTrav->sType) {
465 // Special copy of CB state as it has embedded array
466 XGL_PIPELINE_CB_STATE_CREATE_INFO *pCBCI = (XGL_PIPELINE_CB_STATE_CREATE_INFO*)pShadowTrav;
467 pPipeline->attachmentCount = pCBCI->attachmentCount;
468 uint32_t allocSize = pPipeline->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE);
469 if (allocSize) {
470 pPipeline->pAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE*)malloc(allocSize);
471 XGL_PIPELINE_CB_ATTACHMENT_STATE** ppAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE**)&pCBCI->pAttachments;
472 *ppAttachments = pPipeline->pAttachments;
473 memcpy(pPipeline->pAttachments, ((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pTrav)->pAttachments, allocSize);
474 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700475 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700476 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600477 }
478}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700479// Free the Pipeline nodes
480static void freePipelines()
481{
482 PIPELINE_NODE* pPipeline = g_pPipelineHead;
483 PIPELINE_NODE* pFreeMe = pPipeline;
484 while (pPipeline) {
485 pFreeMe = pPipeline;
486 GENERIC_HEADER* pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
487 GENERIC_HEADER* pShadowFree = pShadowTrav;
488 while (pShadowTrav) {
489 pShadowFree = pShadowTrav;
490 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
491 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pShadowFree->sType) {
492 // Free the vtx data shadowed directly into pPipeline node
493 if (pFreeMe->pVertexBindingDescriptions)
494 free(pFreeMe->pVertexBindingDescriptions);
495 if (pFreeMe->pVertexAttributeDescriptions)
496 free(pFreeMe->pVertexAttributeDescriptions);
497 }
498 else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pShadowFree->sType) {
499 // Free attachment data shadowed into pPipeline node
500 if (pFreeMe->pAttachments)
501 free(pFreeMe->pAttachments);
502 }
503 free(pShadowFree);
504 }
505 pPipeline = pPipeline->pNext;
506 free(pFreeMe);
507 }
508}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600509// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600510
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700511// ptr to HEAD of LL of DS Regions
512static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700513// ptr to HEAD of LL of top-level Layouts
514static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700515
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700516// Return Region node ptr for specified region or else NULL
517static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
518{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700519 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700520 REGION_NODE* pTrav = g_pRegionHead;
521 while (pTrav) {
522 if (pTrav->region == region) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700523 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700524 return pTrav;
525 }
526 pTrav = pTrav->pNext;
527 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700528 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700529 return NULL;
530}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700531// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700532static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700533{
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700534 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700535 REGION_NODE* pTrav = g_pRegionHead;
536 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700537 SET_NODE* pSet = pTrav->pSets;
538 while (pSet) {
539 if (pSet->set == set) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700540 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700541 return pSet;
542 }
543 pSet = pSet->pNext;
544 }
545 pTrav = pTrav->pNext;
546 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700547 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700548 return NULL;
549}
550
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700551// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorRegionUpdate() call sequence, otherwise XGL_FALSE
552static bool32_t dsUpdateActive(XGL_DESCRIPTOR_SET ds)
553{
554 SET_NODE* pTrav = getSetNode(ds);
555 if (pTrav) {
556 REGION_NODE* pRegion = NULL;
557 pRegion = getRegionNode(pTrav->region);
558 if (pRegion) {
559 return pRegion->updateActive;
560 }
561 }
562 return XGL_FALSE;
563}
564
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700565static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700566 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700567 LAYOUT_NODE* pTrav = g_pLayoutHead;
568 while (pTrav) {
569 if (pTrav->layout == layout) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700570 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700571 return pTrav;
572 }
573 pTrav = pTrav->pNext;
574 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -0700575 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700576 return NULL;
577}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600578
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700579static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
580{
581 switch (pUpdateStruct->sType)
582 {
583 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
584 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
585 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
586 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
587 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
588 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
589 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
590 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
591 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
592 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
593 default:
594 // TODO : Flag specific error for this case
595 return 0;
596 }
597}
598
599static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
600{
601 switch (pUpdateStruct->sType)
602 {
603 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700604 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700605 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700606 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700607 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700608 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700609 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700610 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700611 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
612 // TODO : Need to understand this case better and make sure code is correct
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700613 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex) - 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700614 default:
615 // TODO : Flag specific error for this case
616 return 0;
617 }
618}
619
620// Verify that the descriptor type in the update struct matches what's expected by the layout
Tobin Ehlisefa84162015-02-17 09:54:13 -0700621static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, const LAYOUT_NODE* pLayout)//XGL_DESCRIPTOR_TYPE type)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700622{
623 // First get actual type of update
624 XGL_DESCRIPTOR_TYPE actualType;
Tobin Ehlisefa84162015-02-17 09:54:13 -0700625 uint32_t i = 0;
626 uint32_t bound = getUpdateUpperBound(pUpdateStruct);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700627 switch (pUpdateStruct->sType)
628 {
629 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
630 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
631 break;
632 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
633 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
634 break;
635 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
636 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
637 break;
638 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
639 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
640 break;
641 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
642 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
643 break;
644 default:
645 // TODO : Flag specific error for this case
646 return 0;
647 }
Tobin Ehlisefa84162015-02-17 09:54:13 -0700648 for (i = ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index; i < bound; i++) {
649 if (pLayout->pTypes[i] != actualType)
650 return 0;
651 }
652 return 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700653}
654
655// Verify that update region for this update does not exceed max layout index for this type
656static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
657{
658 if (getUpdateUpperBound(pUpdateStruct) > layoutIdx)
659 return 0;
660 return 1;
661}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700662// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
663// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
664static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
665{
666 GENERIC_HEADER* pNewNode = NULL;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700667 size_t array_size = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700668 size_t base_array_size = 0;
669 size_t total_array_size = 0;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700670 size_t baseBuffAddr = 0;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700671 XGL_UPDATE_BUFFERS* pUBCI;
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700672 XGL_UPDATE_IMAGES* pUICI;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700673 switch (pUpdate->sType)
674 {
675 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
676 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
677 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
678 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
679 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
680 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700681 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700682 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
683 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
684 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
685 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
686 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
687 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
688 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));
689 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
690 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));
691 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700692 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700693 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700694 pUICI = (XGL_UPDATE_IMAGES*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700695 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
696 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700697 base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
698 total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700699 XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews;
700 *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700701#if ALLOC_DEBUG
702 printf("Alloc16 #%lu *pppLocalImageViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalImageViews);
703#endif
704 baseBuffAddr = (size_t)(*pppLocalImageViews) + base_array_size;
705 for (uint32_t i = 0; i < pUICI->count; i++) {
706 *pppLocalImageViews[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));
707 memcpy(*pppLocalImageViews[i], pUICI->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700708 }
709 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700710 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700711 pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700712 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
713 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700714 base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count;
715 total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size;
716 XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews;
717 *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size);
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700718#if ALLOC_DEBUG
719 printf("Alloc18 #%lu *pppLocalBufferViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalBufferViews);
720#endif
721 baseBuffAddr = (size_t)(*pppLocalBufferViews) + base_array_size;
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700722 for (uint32_t i = 0; i < pUBCI->count; i++) {
723 // Set ptr and then copy data into that ptr
Tobin Ehlis1836fcc2015-02-18 14:38:11 -0700724 *pppLocalBufferViews[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)));
Tobin Ehlis04f80bb2015-02-11 13:13:18 -0700725 memcpy(*pppLocalBufferViews[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));
726 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700727 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700728 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
729 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
730 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700731 break;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700732 default:
733 // TODO : Flag specific error for this case
734 return NULL;
735 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700736 // Make sure that pNext for the end of shadow copy is NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700737 pNewNode->pNext = NULL;
738 return pNewNode;
739}
740// For given ds, update it's mapping based on pUpdateChain linked-list
741static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
742{
743 SET_NODE* pSet = getSetNode(ds);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700744 LAYOUT_NODE* pLayout = NULL;
745 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI;
746 // TODO : If pCIList is NULL, flag error
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700747 GENERIC_HEADER* pUpdates = pUpdateChain;
748 // Perform all updates
749 while (pUpdates) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700750 pLayout = pSet->pLayouts;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700751 // For each update first find the layout section that it overlaps
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700752 while (pLayout && (pLayout->startIndex > getUpdateIndex(pUpdates))) {
753 pLayout = pLayout->pPriorSetLayout;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700754 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700755 if (!pLayout) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700756 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700757 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));
758 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700759 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700760 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700761 // Next verify that update is correct size
762 if (!validateUpdateSize(pUpdates, pLayout->endIndex)) {
763 char str[48*1024]; // TODO : Keep count of layout CI structs and size this string dynamically based on that count
764 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS} ");
765 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
766 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);
767 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
768 free(pDSstr);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700769 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700770 else { // TODO : should we skip update on a type mismatch or force it?
Tobin Ehlisefa84162015-02-17 09:54:13 -0700771 // We have the right layout section, now verify that update is of the right type
772 if (!validateUpdateType(pUpdates, pLayout)) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700773 char str[1024];
Tobin Ehlisefa84162015-02-17 09:54:13 -0700774 sprintf(str, "Descriptor update type of %s does not match overlapping layout type!", string_XGL_STRUCTURE_TYPE(pUpdates->sType));
775 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700776 }
777 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700778 // Finally perform the update
779 // TODO : Info message that update successful
780 GENERIC_HEADER* pUpdateInsert = pSet->pUpdateStructs;
781 GENERIC_HEADER* pPrev = pUpdateInsert;
782 // Create new update struct for this set's shadow copy
783 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
784 if (NULL == pNewNode) {
785 char str[1024];
786 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
787 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700788 }
789 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700790 if (!pUpdateInsert) {
791 pSet->pUpdateStructs = pNewNode;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700792 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700793 else {
794 // Find either the existing, matching region, or end of list for initial update chain
Tobin Ehlis8cced212015-02-13 10:26:14 -0700795 // TODO : Need to validate this, I suspect there are holes in this algorithm
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700796 uint32_t totalIndex = 0;
797 while (pUpdateInsert && (getUpdateIndex(pUpdates) != totalIndex)) {
798 totalIndex = getUpdateUpperBound(pUpdates);
799 pPrev = pUpdateInsert;
800 pUpdateInsert = (GENERIC_HEADER*)pUpdateInsert->pNext;
801 }
802 pPrev->pNext = pNewNode;
803 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700804 }
805 }
806 }
807 }
808 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
809 }
810}
811// Free a shadowed update node
Tobin Ehlisefa84162015-02-17 09:54:13 -0700812static void freeShadowUpdateTree(GENERIC_HEADER* pUpdate)
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700813{
Tobin Ehlisefa84162015-02-17 09:54:13 -0700814 GENERIC_HEADER* pShadowUpdate = pUpdate;
815 GENERIC_HEADER* pFreeUpdate = pShadowUpdate;
816 while(pShadowUpdate) {
817 pFreeUpdate = pShadowUpdate;
818 pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext;
819 uint32_t index = 0;
820 XGL_UPDATE_SAMPLERS* pUS = NULL;
821 XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
822 XGL_UPDATE_IMAGES* pUI = NULL;
823 XGL_UPDATE_BUFFERS* pUB = NULL;
824 void** ppToFree = NULL;
825 switch (pFreeUpdate->sType)
826 {
827 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
828 pUS = (XGL_UPDATE_SAMPLERS*)pFreeUpdate;
829 if (pUS->pSamplers) {
830 ppToFree = (void**)&pUS->pSamplers;
831 free(*ppToFree);
832 }
833 break;
834 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
835 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pFreeUpdate;
836 for (index = 0; index < pUST->count; index++) {
837 if (pUST->pSamplerImageViews[index].pImageView) {
838 ppToFree = (void**)&pUST->pSamplerImageViews[index].pImageView;
839 free(*ppToFree);
840 }
841 }
842 ppToFree = (void**)&pUST->pSamplerImageViews;
843 free(*ppToFree);
844 break;
845 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
846 pUI = (XGL_UPDATE_IMAGES*)pFreeUpdate;
847 if (pUI->pImageViews) {
848 ppToFree = (void**)&pUI->pImageViews;
849 free(*ppToFree);
850 }
851 break;
852 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
853 pUB = (XGL_UPDATE_BUFFERS*)pFreeUpdate;
854 if (pUB->pBufferViews) {
855 ppToFree = (void**)&pUB->pBufferViews;
856 free(*ppToFree);
857 }
858 break;
859 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
860 break;
861 default:
862 assert(0);
863 break;
864 }
865 free(pFreeUpdate);
866 }
867}
868// Free all DS Regions including their Sets & related sub-structs
869static void freeRegions()
870{
871 REGION_NODE* pRegion = g_pRegionHead;
872 REGION_NODE* pFreeMe = pRegion;
873 while (pRegion) {
874 pFreeMe = pRegion;
875 SET_NODE* pSet = pRegion->pSets;
876 SET_NODE* pFreeSet = pSet;
877 while (pSet) {
878 pFreeSet = pSet;
879 pSet = pSet->pNext;
880 // Freeing layouts handled in freeLayouts() function
881 // Free Update shadow struct tree
882 freeShadowUpdateTree(pFreeSet->pUpdateStructs);
883 free(pFreeSet);
884 }
885 pRegion = pRegion->pNext;
886 if (pFreeMe->createInfo.pTypeCount) {
887 void** ppToFree = (void**)&pFreeMe->createInfo.pTypeCount;
888 free(*ppToFree);
889 }
890 free(pFreeMe);
891 }
892}
893// WARN : Once freeLayouts() called, any layout ptrs in Region/Set data structure will be invalid
894static void freeLayouts()
895{
896 LAYOUT_NODE* pLayout = g_pLayoutHead;
897 LAYOUT_NODE* pFreeLayout = pLayout;
898 while (pLayout) {
899 pFreeLayout = pLayout;
900 GENERIC_HEADER* pTrav = (GENERIC_HEADER*)pLayout->pCreateInfoList;
901 while (pTrav) {
902 void* pToFree = (void*)pTrav;
903 pTrav = (GENERIC_HEADER*)pTrav->pNext;
904 free(pToFree);
905 }
906 pLayout = pLayout->pNext;
907 free(pFreeLayout);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700908 }
909}
Tobin Ehlis83ebbef2015-02-10 15:35:23 -0700910// Currently clearing a set is removing all previous updates to that set
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700911// TODO : Validate if this is correct clearing behavior
912static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
913{
914 SET_NODE* pSet = getSetNode(set);
915 if (!pSet) {
916 // TODO : Return error
917 }
918 else {
Tobin Ehlisefa84162015-02-17 09:54:13 -0700919 freeShadowUpdateTree(pSet->pUpdateStructs);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700920 }
921}
922
923static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
924{
925 REGION_NODE* pRegion = getRegionNode(region);
926 if (!pRegion) {
927 char str[1024];
928 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
929 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
930 }
931 else
932 {
933 // For every set off of this region, clear it
934 SET_NODE* pSet = pRegion->pSets;
935 while (pSet) {
936 clearDescriptorSet(pSet->set);
937 }
938 }
939}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600940
Tobin Ehlis8cced212015-02-13 10:26:14 -0700941// Code here to manage the Cmd buffer LL
942static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700943{
Tobin Ehlis8cced212015-02-13 10:26:14 -0700944 loader_platform_thread_lock_mutex(&globalLock);
945 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
946 while (pCB) {
947 if (cb == pCB->cmdBuffer) {
948 loader_platform_thread_unlock_mutex(&globalLock);
949 return pCB;
950 }
951 pCB = pCB->pNextGlobalCBNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700952 }
Tobin Ehlis8cced212015-02-13 10:26:14 -0700953 loader_platform_thread_unlock_mutex(&globalLock);
954 return NULL;
955}
Tobin Ehlisefa84162015-02-17 09:54:13 -0700956// Free all CB Nodes
957static void freeCmdBuffers()
958{
959 GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
960 GLOBAL_CB_NODE* pFreeMe = pCB;
961 while (pCB) {
962 pFreeMe = pCB;
963 CMD_NODE* pCmd = pCB->pCmds;
964 CMD_NODE* pFreeCmd = pCmd;
965 while (pCmd) {
966 pFreeCmd = pCmd;
967 pCmd = pCmd->pNext;
968 free(pFreeCmd);
969 }
970 pCB = pCB->pNextGlobalCBNode;
971 free(pFreeMe);
972 }
973}
Tobin Ehlisd092d232015-02-13 13:30:07 -0700974static void addCmd(GLOBAL_CB_NODE* pCB, const CMD_TYPE cmd)
975{
976 CMD_NODE* pCmd = (CMD_NODE*)malloc(sizeof(CMD_NODE));
977 if (pCmd) {
978 // init cmd node and append to end of cmd LL
979 memset(pCmd, 0, sizeof(CMD_NODE));
980 pCB->numCmds++;
981 pCmd->cmdNumber = pCB->numCmds;
982 pCmd->type = cmd;
983 if (!pCB->pCmds) {
984 pCB->pCmds = pCmd;
985 }
986 else {
987 assert(pCB->lastCmd);
988 pCB->lastCmd->pNext = pCmd;
989 }
990 pCB->lastCmd = pCmd;
991 }
992 else {
993 char str[1024];
994 sprintf(str, "Out of memory while attempting to allocate new CMD_NODE for cmdBuffer %p", (void*)pCB->cmdBuffer);
995 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCB->cmdBuffer, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
996 }
997}
998static void resetCB(const XGL_CMD_BUFFER cb)
999{
1000 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1001 if (pCB) {
1002 CMD_NODE* pCur = pCB->pCmds;
1003 CMD_NODE* pFreeMe = pCur;
1004 while (pCur) {
1005 pFreeMe = pCur;
1006 pCur = pCur->pNext;
1007 free(pFreeMe);
1008 }
1009 // Reset CB state
1010 GLOBAL_CB_NODE* pSaveNext = pCB->pNextGlobalCBNode;
1011 XGL_FLAGS saveFlags = pCB->flags;
1012 XGL_QUEUE_TYPE saveQT = pCB->queueType;
1013 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
1014 pCB->cmdBuffer = cb;
1015 pCB->flags = saveFlags;
1016 pCB->queueType = saveQT;
1017 pCB->pNextGlobalCBNode = pSaveNext;
1018 pCB->lastVtxBinding = MAX_BINDING;
1019 }
1020}
1021// Set the last bound dynamic state of given type
1022// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
1023static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
1024{
1025 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
1026 if (pCB) {
1027 g_lastCmdBuffer = cmdBuffer;
1028 addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT);
1029 loader_platform_thread_lock_mutex(&globalLock);
1030 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
1031 while (pTrav && (state != pTrav->stateObj)) {
1032 pTrav = pTrav->pNext;
1033 }
1034 if (!pTrav) {
1035 char str[1024];
1036 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1037 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
1038 }
1039 pCB->lastBoundDynamicState[sType] = pTrav;
1040 loader_platform_thread_unlock_mutex(&globalLock);
1041 }
1042 else {
1043 char str[1024];
1044 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
1045 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
1046 }
1047}
Tobin Ehlis8cced212015-02-13 10:26:14 -07001048// Print the last bound Gfx Pipeline
1049static void printPipeline(const XGL_CMD_BUFFER cb)
1050{
1051 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1052 if (pCB) {
1053 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1054 if (!pPipeTrav) {
1055 // nothing to print
1056 }
1057 else {
1058 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
1059 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001060 free(pipeStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001061 }
Tobin Ehlis56a61072014-11-21 08:58:46 -07001062 }
1063}
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001064// Dump subgraph w/ DS info
Tobin Ehlis8cced212015-02-13 10:26:14 -07001065static void dsDumpDot(const XGL_CMD_BUFFER cb, FILE* pOutFile)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001066{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001067 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1068 if (pCB && pCB->lastBoundDescriptorSet) {
1069 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1070 REGION_NODE* pRegion = getRegionNode(pSet->region);
1071 char tmp_str[1024];
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001072 fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n");
1073 sprintf(tmp_str, "Region (%p)", pRegion->region);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001074 char* pGVstr = xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str);
1075 fprintf(pOutFile, "%s", pGVstr);
1076 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001077 fprintf(pOutFile, "subgraph cluster_DescriptorSet\n{\nlabel=\"Descriptor Set (%p)\"\n", pSet->set);
1078 sprintf(tmp_str, "Descriptor Set (%p)", pSet->set);
1079 LAYOUT_NODE* pLayout = pSet->pLayouts;
1080 uint32_t layout_index = 0;
1081 while (pLayout) {
1082 ++layout_index;
1083 sprintf(tmp_str, "LAYOUT%u", layout_index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001084 pGVstr = xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str);
1085 fprintf(pOutFile, "%s", pGVstr);
1086 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001087 pLayout = pLayout->pNext;
1088 if (pLayout) {
1089 fprintf(pOutFile, "\"%s\" -> \"LAYOUT%u\" [];\n", tmp_str, layout_index+1);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001090 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001091 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001092 if (pSet->pUpdateStructs) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001093 pGVstr = dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates");
1094 fprintf(pOutFile, "%s", pGVstr);
1095 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001096 }
1097 fprintf(pOutFile, "}\n");
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001098 fprintf(pOutFile, "}\n");
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001099 pRegion = pRegion->pNext;
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001100 }
1101}
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001102
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001103// Dump a GraphViz dot file showing the pipeline
Tobin Ehlis8cced212015-02-13 10:26:14 -07001104static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001105{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001106 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1107 if (pCB) {
1108 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1109 if (pPipeTrav) {
1110 FILE* pOutFile;
1111 pOutFile = fopen(outFileName, "w");
1112 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
1113 fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001114 char* pGVstr = NULL;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001115 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
1116 if (pCB->lastBoundDynamicState[i]) {
Tobin Ehlisefa84162015-02-17 09:54:13 -07001117 pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i));
1118 fprintf(pOutFile, "%s", pGVstr);
1119 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001120 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001121 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001122 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
1123 fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
Tobin Ehlisefa84162015-02-17 09:54:13 -07001124 pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD");
1125 fprintf(pOutFile, "%s", pGVstr);
1126 free(pGVstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001127 fprintf(pOutFile, "}\n");
1128 dsDumpDot(cb, pOutFile);
1129 fprintf(pOutFile, "}\n"); // close main graph "g"
1130 fclose(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001131 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001132 }
1133}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001134// Synch up currently bound pipeline settings with DS mappings
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001135// 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 -07001136static void synchDSMapping(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001137{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001138 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1139 if (pCB && pCB->lastBoundPipeline) {
1140 // First verify that we have a Node for bound pipeline
1141 PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline);
1142 char str[1024];
1143 if (!pPipeTrav) {
1144 sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline);
1145 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
1146 }
1147 else {
1148 // Verify Vtx binding
1149 if (MAX_BINDING != pCB->lastVtxBinding) {
1150 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) {
1151 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
1152 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
1153 }
1154 else {
1155 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : ");
1156 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
1157 free(tmpStr);
1158 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001159 }
1160 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001161 }
1162}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001163// Print details of DS config to stdout
Tobin Ehlis8cced212015-02-13 10:26:14 -07001164static void printDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001165{
Tobin Ehlise79df942014-11-18 16:38:08 -07001166 char tmp_str[1024];
1167 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 -07001168 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1169 if (pCB) {
1170 SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet);
1171 REGION_NODE* pRegion = getRegionNode(pSet->region);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001172 // Print out region details
1173 sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region);
1174 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001175 char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " ");
1176 sprintf(ds_config_str, "%s", pRegionStr);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001177 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001178 free(pRegionStr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001179 // Print out set details
1180 char prefix[10];
1181 uint32_t index = 0;
1182 sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set);
1183 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1184 LAYOUT_NODE* pLayout = pSet->pLayouts;
1185 while (pLayout) {
1186 // Print layout details
1187 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 -07001188 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001189 sprintf(prefix, " [L%u] ", index);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001190 char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix);
1191 sprintf(ds_config_str, "%s", pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001192 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001193 free(pDSLstr);
Tobin Ehlis8cced212015-02-13 10:26:14 -07001194 pLayout = pLayout->pPriorSetLayout;
1195 index++;
1196 }
1197 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
1198 if (pUpdate) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001199 sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
1200 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1201 sprintf(prefix, " [UC] ");
1202 sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix));
1203 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
1204 // TODO : If there is a "view" associated with this update, print CI for that view
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001205 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07001206 else {
1207 sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set);
1208 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
1209 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001210 }
1211}
1212
Tobin Ehlisd092d232015-02-13 13:30:07 -07001213static void printCB(const XGL_CMD_BUFFER cb)
1214{
1215 GLOBAL_CB_NODE* pCB = getCBNode(cb);
1216 if (pCB) {
1217 char str[1024];
1218 CMD_NODE* pCmd = pCB->pCmds;
1219 sprintf(str, "Cmds in CB %p", (void*)cb);
1220 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
1221 while (pCmd) {
1222 sprintf(str, " CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type));
1223 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str);
1224 pCmd = pCmd->pNext;
1225 }
1226 }
1227 else {
1228 // Nothing to print
1229 }
1230}
1231
Tobin Ehlis8cced212015-02-13 10:26:14 -07001232static void synchAndDumpDot(const XGL_CMD_BUFFER cb)
Jeremy Hayes668ca052015-01-29 13:03:36 -07001233{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001234 synchDSMapping(cb);
1235 dumpDotFile(cb, "pipeline_dump.dot");
Jeremy Hayes668ca052015-01-29 13:03:36 -07001236}
1237
Tobin Ehlis8cced212015-02-13 10:26:14 -07001238static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001239{
Tobin Ehlis8cced212015-02-13 10:26:14 -07001240 synchDSMapping(cb);
1241 printDSConfig(cb);
1242 printPipeline(cb);
1243 printDynamicState(cb);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001244 static int autoDumpOnce = 1;
1245 if (autoDumpOnce) {
1246 autoDumpOnce = 0;
Tobin Ehlis8cced212015-02-13 10:26:14 -07001247 dumpDotFile(cb, "pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001248 // Convert dot to png if dot available
Ian Elliott81ac44c2015-01-13 17:52:38 -07001249#if defined(_WIN32)
1250// FIXME: NEED WINDOWS EQUIVALENT
1251#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07001252 if(access( "/usr/bin/dot", X_OK) != -1) {
1253 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
1254 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001255#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001256 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001257}
1258
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001259static void initDrawState(void)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001260{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001261 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001262 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001263 strOpt = getLayerOption("DrawStateReportLevel");
1264 if (strOpt != NULL)
1265 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001266
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001267 strOpt = getLayerOption("DrawStateDebugAction");
1268 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001269 g_debugAction = atoi(strOpt);
1270
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001271 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1272 {
1273 strOpt = getLayerOption("DrawStateLogFilename");
1274 if (strOpt)
1275 {
1276 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001277 }
1278 if (g_logFile == NULL)
1279 g_logFile = stdout;
1280 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001281 // initialize Layer dispatch table
1282 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001283 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001284 fpNextGPA = pCurObj->pGPA;
1285 assert(fpNextGPA);
1286
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001287 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1288
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001289 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001290 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001291
1292 if (!globalLockInitialized)
1293 {
1294 // TODO/TBD: Need to delete this mutex sometime. How??? One
1295 // suggestion is to call this during xglCreateInstance(), and then we
1296 // can clean it up during xglDestroyInstance(). However, that requires
1297 // that the layer have per-instance locks. We need to come back and
1298 // address this soon.
1299 loader_platform_thread_create_mutex(&globalLock);
1300 globalLockInitialized = 1;
1301 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001302}
1303
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001304XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1305{
1306 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1307 return result;
1308}
1309
1310XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1311{
1312 XGL_RESULT result = nextTable.DestroyInstance(instance);
1313 return result;
1314}
1315
1316XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1317{
1318 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1319 return result;
1320}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001321
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001322XGL_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 -06001323{
1324 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001325 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001326 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001327 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001328 return result;
1329}
1330
1331XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1332{
1333 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001334 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001335 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001336 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001337 return result;
1338}
1339
1340XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1341{
Tobin Ehlisefa84162015-02-17 09:54:13 -07001342 // Free all the memory
1343 loader_platform_thread_lock_mutex(&globalLock);
1344 freePipelines();
1345 freeSamplers();
1346 freeImages();
1347 freeBuffers();
1348 freeCmdBuffers();
1349 freeDynamicState();
1350 freeRegions();
1351 freeLayouts();
1352 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001353 XGL_RESULT result = nextTable.DestroyDevice(device);
1354 return result;
1355}
1356
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001357XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001358{
1359 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001360 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001361 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001362 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001363 return result;
1364}
1365
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001366XGL_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 -06001367{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001368 if (gpu != NULL)
1369 {
1370 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1371 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001372 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001373 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001374 return result;
1375 } else
1376 {
1377 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1378 return XGL_ERROR_INVALID_POINTER;
1379 // This layer compatible with all GPUs
1380 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001381 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001382 return XGL_SUCCESS;
1383 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001384}
1385
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001386XGL_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 -06001387{
1388 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1389 return result;
1390}
1391
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001392XGL_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 -06001393{
Tobin Ehlisd092d232015-02-13 13:30:07 -07001394 for (uint32_t i=0; i < cmdBufferCount; i++) {
1395 // Validate that cmd buffers have been updated
1396 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001397 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1398 return result;
1399}
1400
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001401XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001402{
1403 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1404 return result;
1405}
1406
1407XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1408{
1409 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1410 return result;
1411}
1412
1413XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1414{
1415 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1416 return result;
1417}
1418
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001419XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1420{
1421 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1422 return result;
1423}
1424
1425XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1426{
1427 XGL_RESULT result = nextTable.FreeMemory(mem);
1428 return result;
1429}
1430
1431XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1432{
1433 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1434 return result;
1435}
1436
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001437XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001438{
1439 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1440 return result;
1441}
1442
1443XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1444{
1445 XGL_RESULT result = nextTable.UnmapMemory(mem);
1446 return result;
1447}
1448
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001449XGL_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 -06001450{
1451 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1452 return result;
1453}
1454
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001455XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1456{
1457 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001458 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001459 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001460 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001461 return result;
1462}
1463
1464XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1465{
1466 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1467 return result;
1468}
1469
1470XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1471{
1472 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1473 return result;
1474}
1475
1476XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1477{
1478 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1479 return result;
1480}
1481
1482XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1483{
1484 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1485 return result;
1486}
1487
1488XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1489{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001490 // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001491 XGL_RESULT result = nextTable.DestroyObject(object);
1492 return result;
1493}
1494
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001495XGL_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 -06001496{
1497 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1498 return result;
1499}
1500
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001501XGL_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 -06001502{
Jon Ashburned62b412015-01-15 10:39:19 -07001503 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001504 return result;
1505}
1506
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001507XGL_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)
1508{
1509 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1510 return result;
1511}
1512
1513XGL_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)
1514{
1515 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1516 return result;
1517}
1518
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001519XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1520{
1521 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1522 return result;
1523}
1524
1525XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1526{
1527 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1528 return result;
1529}
1530
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001531XGL_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 -06001532{
1533 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1534 return result;
1535}
1536
1537XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1538{
1539 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1540 return result;
1541}
1542
1543XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1544{
1545 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1546 return result;
1547}
1548
1549XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1550{
1551 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1552 return result;
1553}
1554
1555XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1556{
1557 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1558 return result;
1559}
1560
1561XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1562{
1563 XGL_RESULT result = nextTable.GetEventStatus(event);
1564 return result;
1565}
1566
1567XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1568{
1569 XGL_RESULT result = nextTable.SetEvent(event);
1570 return result;
1571}
1572
1573XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1574{
1575 XGL_RESULT result = nextTable.ResetEvent(event);
1576 return result;
1577}
1578
1579XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1580{
1581 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1582 return result;
1583}
1584
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001585XGL_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 -06001586{
1587 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1588 return result;
1589}
1590
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001591XGL_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 -06001592{
1593 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1594 return result;
1595}
1596
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001597XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1598{
1599 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001600 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001601 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001602 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1603 pNewNode->buffer = *pBuffer;
1604 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
1605 pNewNode->pNext = g_pBufferHead;
1606 g_pBufferHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001607 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001608 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001609 return result;
1610}
1611
1612XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1613{
1614 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1615 return result;
1616}
1617
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001618XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1619{
1620 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1621 return result;
1622}
1623
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001624XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1625{
1626 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1627 return result;
1628}
1629
1630XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1631{
1632 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1633 return result;
1634}
1635
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001636XGL_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 -06001637{
1638 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1639 return result;
1640}
1641
1642XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1643{
1644 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001645 if (XGL_SUCCESS == result) {
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001646 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001647 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
1648 pNewNode->image = *pView;
1649 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1650 pNewNode->pNext = g_pImageHead;
1651 g_pImageHead = pNewNode;
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001652 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001653 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001654 return result;
1655}
1656
1657XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1658{
1659 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1660 return result;
1661}
1662
1663XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1664{
1665 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1666 return result;
1667}
1668
1669XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1670{
1671 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1672 return result;
1673}
1674
1675XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1676{
1677 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1678 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001679 char str[1024];
1680 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1681 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001682 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001683 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001684 if (pTrav) {
1685 while (pTrav->pNext)
1686 pTrav = pTrav->pNext;
1687 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1688 pTrav = pTrav->pNext;
1689 }
1690 else {
1691 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001692 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001693 }
1694 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1695 pTrav->pipeline = *pPipeline;
1696 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001697 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001698 return result;
1699}
1700
1701XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1702{
1703 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1704 return result;
1705}
1706
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001707XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001708{
1709 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1710 return result;
1711}
1712
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001713XGL_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 -06001714{
1715 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1716 return result;
1717}
1718
1719XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1720{
1721 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1722 return result;
1723}
1724
1725XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1726{
1727 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001728 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07001729 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001730 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1731 pNewNode->sampler = *pSampler;
1732 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1733 pNewNode->pNext = g_pSamplerHead;
1734 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001735 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001736 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001737 return result;
1738}
1739
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001740XGL_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)
1741{
1742 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1743 if (XGL_SUCCESS == result) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001744 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
1745 if (NULL == pNewNode) {
1746 char str[1024];
1747 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
1748 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1749 }
1750 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001751 // TODO : API Currently missing a count here that we should multiply by struct size
1752 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlis8cced212015-02-13 10:26:14 -07001753 memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001754 void* pCITrav = NULL;
1755 uint32_t totalCount = 0;
1756 if (pSetLayoutInfoList) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07001757 memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
Tobin Ehlisefa84162015-02-17 09:54:13 -07001758 pCITrav = (void*)pSetLayoutInfoList->pNext;
1759 totalCount = pSetLayoutInfoList->count;
1760 }
1761 void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext;
1762 while (pCITrav) {
1763 totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count;
1764 *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1765 memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1766 pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext;
1767 *ppNext = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext;
1768 }
1769 if (totalCount > 0) {
1770 pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE));
1771 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList;
1772 while (pLCI) {
1773 for (uint32_t i = 0; i < pLCI->count; i++) {
1774 pNewNode->pTypes[i] = pLCI->descriptorType;
1775 }
1776 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext;
1777 }
1778 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001779 pNewNode->layout = *pSetLayout;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001780 pNewNode->stageFlags = stageFlags;
Tobin Ehlisefa84162015-02-17 09:54:13 -07001781 uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE;
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07001782 for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) {
1783 assert(i < XGL_NUM_SHADER_STAGE);
1784 if (stage & stageFlags)
1785 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i];
Tobin Ehlisefa84162015-02-17 09:54:13 -07001786 i = (i == 0) ? 0 : (i-1);
Tobin Ehlisd215d4b2015-02-16 14:29:30 -07001787 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001788 pNewNode->startIndex = 0;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001789 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
1790 // Point to prior node or NULL if no prior node
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001791 if (NULL != priorSetLayout && pPriorNode == NULL) {
1792 char str[1024];
1793 sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout);
1794 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1795 }
1796 else if (pPriorNode != NULL) { // We have a node for a valid prior layout
1797 // Get count for prior layout
1798 pNewNode->startIndex = pPriorNode->endIndex + 1;
1799 }
Tobin Ehlisefa84162015-02-17 09:54:13 -07001800 pNewNode->endIndex = pNewNode->startIndex + totalCount - 1;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001801 assert(pNewNode->endIndex >= pNewNode->startIndex);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001802 pNewNode->pPriorSetLayout = pPriorNode;
1803 // Put new node at Head of global Layer list
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001804 pNewNode->pNext = g_pLayoutHead;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001805 g_pLayoutHead = pNewNode;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001806 }
1807 return result;
1808}
1809
1810XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
1811{
1812 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1813 if (XGL_SUCCESS == result) {
1814 if (!g_pRegionHead) {
1815 char str[1024];
1816 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1817 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1818 }
1819 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001820 REGION_NODE* pRegionNode = g_pRegionHead;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001821 if (!pRegionNode) {
1822 char str[1024];
1823 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1824 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1825 }
1826 else {
1827 pRegionNode->updateActive = 1;
1828 }
1829 }
1830 }
1831 return result;
1832}
1833
1834XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
1835{
1836 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1837 if (XGL_SUCCESS == result) {
1838 if (!g_pRegionHead) {
1839 char str[1024];
1840 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1841 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1842 }
1843 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001844 REGION_NODE* pRegionNode = g_pRegionHead;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001845 if (!pRegionNode) {
1846 char str[1024];
1847 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1848 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1849 }
1850 else {
1851 if (!pRegionNode->updateActive) {
1852 char str[1024];
1853 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
1854 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
1855 }
1856 else {
1857 pRegionNode->updateActive = 0;
1858 }
1859 }
1860 }
1861 }
1862 return result;
1863}
1864
1865XGL_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)
1866{
1867 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1868 if (XGL_SUCCESS == result) {
1869 // Insert this region into Global Region LL at head
1870 char str[1024];
1871 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
1872 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001873 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001874 REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001875 if (NULL == pNewNode) {
1876 char str[1024];
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001877 sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()");
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001878 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1879 }
1880 else {
1881 memset(pNewNode, 0, sizeof(REGION_NODE));
1882 pNewNode->pNext = g_pRegionHead;
1883 g_pRegionHead = pNewNode;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001884 XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo;
1885 memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
1886 size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT);
Tobin Ehlisefa84162015-02-17 09:54:13 -07001887 if (typeCountSize) {
1888 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount;
1889 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize);
1890 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize);
1891 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001892 pNewNode->regionUsage = regionUsage;
1893 pNewNode->updateActive = 0;
1894 pNewNode->maxSets = maxSets;
1895 pNewNode->region = *pDescriptorRegion;
1896 }
Tobin Ehlisbf0146e2015-02-11 14:24:02 -07001897 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001898 }
1899 else {
1900 // Need to do anything if region create fails?
1901 }
1902 return result;
1903}
1904
1905XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
1906{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001907 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001908 if (XGL_SUCCESS == result) {
1909 clearDescriptorRegion(descriptorRegion);
1910 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001911 return result;
1912}
1913
1914XGL_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)
1915{
1916 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001917 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
1918 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
1919 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001920 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001921 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001922 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001923 }
1924 else {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001925 for (uint32_t i = 0; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001926 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001927 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001928 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001929 // Create new set node and add to head of region nodes
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001930 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001931 if (NULL == pNewNode) {
1932 char str[1024];
1933 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001934 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 -07001935 }
1936 else {
1937 memset(pNewNode, 0, sizeof(SET_NODE));
1938 // Insert set at head of Set LL for this region
1939 pNewNode->pNext = pRegionNode->pSets;
1940 pRegionNode->pSets = pNewNode;
1941 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
1942 if (NULL == pLayout) {
1943 char str[1024];
1944 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
1945 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1946 }
1947 pNewNode->pLayouts = pLayout;
1948 pNewNode->region = descriptorRegion;
1949 pNewNode->set = pDescriptorSets[i];
1950 pNewNode->setUsage = setUsage;
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001951 // TODO : Make sure to set this correctly
Tobin Ehlis04f80bb2015-02-11 13:13:18 -07001952 pNewNode->descriptorCount = pLayout->endIndex + 1;
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001953 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001954 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001955 }
1956 }
1957 return result;
1958}
1959
1960XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
1961{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001962 for (uint32_t i = 0; i < count; i++) {
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001963 clearDescriptorSet(pDescriptorSets[i]);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001964 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001965 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
1966}
1967
1968XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
1969{
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07001970 if (!dsUpdateActive(descriptorSet)) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001971 char str[1024];
1972 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
1973 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str);
1974 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001975 else {
1976 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
1977 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
1978 }
1979
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001980 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
1981}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001982
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001983XGL_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 -06001984{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001985 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001986 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001987 return result;
1988}
1989
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001990XGL_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 -06001991{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001992 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001993 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001994 return result;
1995}
1996
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001997XGL_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 -06001998{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001999 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002000 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002001 return result;
2002}
2003
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002004XGL_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 -06002005{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002006 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07002007 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002008 return result;
2009}
2010
2011XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
2012{
2013 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002014 if (XGL_SUCCESS == result) {
2015 GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
2016 memset(pCB, 0, sizeof(GLOBAL_CB_NODE));
2017 pCB->pNextGlobalCBNode = g_pCmdBufferHead;
2018 g_pCmdBufferHead = pCB;
2019 pCB->cmdBuffer = *pCmdBuffer;
2020 pCB->flags = pCreateInfo->flags;
2021 pCB->queueType = pCreateInfo->queueType;
2022 pCB->lastVtxBinding = MAX_BINDING;
2023 g_lastCmdBuffer = *pCmdBuffer;
2024 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002025 return result;
2026}
2027
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002028XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002029{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07002030 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002031 if (XGL_SUCCESS == result) {
2032 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
Tobin Ehlisd092d232015-02-13 13:30:07 -07002033 if (CB_NEW != pCB->state)
2034 resetCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002035 pCB->state = CB_UPDATE_ACTIVE;
2036 g_lastCmdBuffer = cmdBuffer;
2037 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002038 return result;
2039}
2040
2041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2042{
2043 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002044 if (XGL_SUCCESS == result) {
2045 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2046 pCB->state = CB_UPDATE_COMPLETE;
2047 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002048 printCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002049 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002050 return result;
2051}
2052
2053XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
2054{
2055 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002056 if (XGL_SUCCESS == result) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002057 resetCB(cmdBuffer);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002058 g_lastCmdBuffer = cmdBuffer;
2059 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002060 return result;
2061}
2062
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002063XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002064{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002065 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2066 if (pCB) {
2067 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002068 addCmd(pCB, CMD_BINDPIPELINE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002069 if (getPipeline(pipeline)) {
2070 pCB->lastBoundPipeline = pipeline;
2071 }
2072 else {
2073 char str[1024];
2074 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
2075 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
2076 }
2077 synchAndDumpDot(cmdBuffer);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002078 }
2079 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07002080 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002081 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2082 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002083 }
2084 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
2085}
2086
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002087XGL_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 -06002088{
Tobin Ehlisd092d232015-02-13 13:30:07 -07002089 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2090 if (pCB) {
2091 // TODO : Handle storing Pipeline Deltas to cmd buffer here
2092 g_lastCmdBuffer = cmdBuffer;
2093 synchAndDumpDot(cmdBuffer);
2094 addCmd(pCB, CMD_BINDPIPELINEDELTA);
2095 }
2096 else {
2097 char str[1024];
2098 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2099 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2100 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002101 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
2102}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002103
2104XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
2105{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002106 setLastBoundDynamicState(cmdBuffer, state, stateBindPoint);
2107 synchAndDumpDot(cmdBuffer);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002108 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
2109}
2110
2111XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
2112{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002113 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2114 if (pCB) {
Tobin Ehlisd092d232015-02-13 13:30:07 -07002115 g_lastCmdBuffer = cmdBuffer;
2116 addCmd(pCB, CMD_BINDDESCRIPTORSET);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002117 if (getSetNode(descriptorSet)) {
2118 if (dsUpdateActive(descriptorSet)) {
2119 // TODO : Not sure if it's valid to made this check here. May need to make at QueueSubmit time
2120 char str[1024];
2121 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
2122 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
2123 }
2124 loader_platform_thread_lock_mutex(&globalLock);
2125 pCB->lastBoundDescriptorSet = descriptorSet;
2126 loader_platform_thread_unlock_mutex(&globalLock);
2127 synchAndDumpDot(cmdBuffer);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002128 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002129 sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
2130 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002131 }
Tobin Ehlis8cced212015-02-13 10:26:14 -07002132 else {
2133 char str[1024];
2134 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
2135 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str);
2136 }
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002137 }
2138 else {
2139 char str[1024];
Tobin Ehlis8cced212015-02-13 10:26:14 -07002140 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2141 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
Tobin Ehlis83ebbef2015-02-10 15:35:23 -07002142 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002143 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
2144}
2145
2146XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
2147{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002148 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2149 if (pCB) {
2150 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002151 addCmd(pCB, CMD_BINDINDEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002152 // TODO : Track idxBuffer binding
2153 }
2154 else {
2155 char str[1024];
2156 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2157 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2158 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002159 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
2160}
2161
2162XGL_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 +08002163{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002164 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2165 if (pCB) {
2166 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002167 addCmd(pCB, CMD_BINDVERTEXBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002168 pCB->lastVtxBinding = binding;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002169 }
2170 else {
2171 char str[1024];
2172 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2173 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2174 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002175 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002176}
2177
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002178XGL_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 -06002179{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002180 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2181 if (pCB) {
2182 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002183 addCmd(pCB, CMD_DRAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002184 pCB->drawCount[DRAW]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002185 char str[1024];
2186 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++);
2187 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2188 synchAndPrintDSConfig(cmdBuffer);
2189 }
2190 else {
2191 char str[1024];
2192 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2193 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2194 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002195 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
2196}
2197
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002198XGL_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 -06002199{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002200 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2201 if (pCB) {
2202 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002203 addCmd(pCB, CMD_DRAWINDEXED);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002204 pCB->drawCount[DRAW_INDEXED]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002205 char str[1024];
2206 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++);
2207 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2208 synchAndPrintDSConfig(cmdBuffer);
2209 }
2210 else {
2211 char str[1024];
2212 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2213 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2214 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002215 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
2216}
2217
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002218XGL_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 -06002219{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002220 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2221 if (pCB) {
2222 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002223 addCmd(pCB, CMD_DRAWINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002224 pCB->drawCount[DRAW_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002225 char str[1024];
2226 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++);
2227 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2228 synchAndPrintDSConfig(cmdBuffer);
2229 }
2230 else {
2231 char str[1024];
2232 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2233 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2234 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002235 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002236}
2237
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002238XGL_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 -06002239{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002240 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2241 if (pCB) {
2242 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002243 addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002244 pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
Tobin Ehlis8cced212015-02-13 10:26:14 -07002245 char str[1024];
2246 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++);
2247 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
2248 synchAndPrintDSConfig(cmdBuffer);
2249 }
2250 else {
2251 char str[1024];
2252 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2253 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2254 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002255 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002256}
2257
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002258XGL_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 -06002259{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002260 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2261 if (pCB) {
2262 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002263 addCmd(pCB, CMD_DISPATCH);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002264 }
2265 else {
2266 char str[1024];
2267 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2268 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2269 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002270 nextTable.CmdDispatch(cmdBuffer, x, y, z);
2271}
2272
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002273XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002274{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002275 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2276 if (pCB) {
2277 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002278 addCmd(pCB, CMD_DISPATCHINDIRECT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002279 }
2280 else {
2281 char str[1024];
2282 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2283 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2284 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002285 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002286}
2287
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002288XGL_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 -06002289{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002290 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2291 if (pCB) {
2292 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002293 addCmd(pCB, CMD_COPYBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002294 }
2295 else {
2296 char str[1024];
2297 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2298 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2299 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002300 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002301}
2302
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002303XGL_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 -06002304{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002305 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2306 if (pCB) {
2307 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002308 addCmd(pCB, CMD_COPYIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002309 }
2310 else {
2311 char str[1024];
2312 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2313 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2314 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002315 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
2316}
2317
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002318XGL_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 -06002319{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002320 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2321 if (pCB) {
2322 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002323 addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002324 }
2325 else {
2326 char str[1024];
2327 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2328 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2329 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002330 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002331}
2332
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002333XGL_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 -06002334{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002335 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2336 if (pCB) {
2337 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002338 addCmd(pCB, CMD_COPYIMAGETOBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002339 }
2340 else {
2341 char str[1024];
2342 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2343 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2344 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002345 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002346}
2347
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002348XGL_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 -06002349{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002350 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2351 if (pCB) {
2352 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002353 addCmd(pCB, CMD_CLONEIMAGEDATA);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002354 }
2355 else {
2356 char str[1024];
2357 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2358 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2359 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002360 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002361}
2362
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002363XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
2364{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002365 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2366 if (pCB) {
2367 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002368 addCmd(pCB, CMD_UPDATEBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002369 }
2370 else {
2371 char str[1024];
2372 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2373 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2374 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002375 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2376}
2377
2378XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
2379{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002380 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2381 if (pCB) {
2382 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002383 addCmd(pCB, CMD_FILLBUFFER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002384 }
2385 else {
2386 char str[1024];
2387 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);
2389 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002390 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2391}
2392
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002393XGL_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 -06002394{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002395 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2396 if (pCB) {
2397 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002398 addCmd(pCB, CMD_CLEARCOLORIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002399 }
2400 else {
2401 char str[1024];
2402 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2403 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2404 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002405 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
2406}
2407
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002408XGL_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 -06002409{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002410 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2411 if (pCB) {
2412 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002413 addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002414 }
2415 else {
2416 char str[1024];
2417 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2418 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2419 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002420 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
2421}
2422
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002423XGL_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 -06002424{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002425 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2426 if (pCB) {
2427 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002428 addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002429 }
2430 else {
2431 char str[1024];
2432 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2433 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2434 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002435 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
2436}
2437
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002438XGL_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 -06002439{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002440 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2441 if (pCB) {
2442 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002443 addCmd(pCB, CMD_RESOLVEIMAGE);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002444 }
2445 else {
2446 char str[1024];
2447 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2448 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2449 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002450 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
2451}
2452
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002453XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002454{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002455 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2456 if (pCB) {
2457 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002458 addCmd(pCB, CMD_SETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002459 }
2460 else {
2461 char str[1024];
2462 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2463 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2464 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002465 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002466}
2467
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002468XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002469{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002470 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2471 if (pCB) {
2472 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002473 addCmd(pCB, CMD_RESETEVENT);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002474 }
2475 else {
2476 char str[1024];
2477 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2478 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2479 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002480 nextTable.CmdResetEvent(cmdBuffer, event);
2481}
2482
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002483XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00002484{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002485 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2486 if (pCB) {
2487 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002488 addCmd(pCB, CMD_WAITEVENTS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002489 }
2490 else {
2491 char str[1024];
2492 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2493 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2494 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002495 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
2496}
2497
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002498XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00002499{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002500 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2501 if (pCB) {
2502 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002503 addCmd(pCB, CMD_PIPELINEBARRIER);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002504 }
2505 else {
2506 char str[1024];
2507 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2508 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2509 }
Mike Stroyan55658c22014-12-04 11:08:39 +00002510 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
2511}
2512
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002513XGL_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 -06002514{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002515 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2516 if (pCB) {
2517 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002518 addCmd(pCB, CMD_BEGINQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002519 }
2520 else {
2521 char str[1024];
2522 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2523 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2524 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002525 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2526}
2527
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002528XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002529{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002530 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2531 if (pCB) {
2532 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002533 addCmd(pCB, CMD_ENDQUERY);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002534 }
2535 else {
2536 char str[1024];
2537 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2538 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2539 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002540 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2541}
2542
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002543XGL_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 -06002544{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002545 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2546 if (pCB) {
2547 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002548 addCmd(pCB, CMD_RESETQUERYPOOL);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002549 }
2550 else {
2551 char str[1024];
2552 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2553 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2554 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002555 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2556}
2557
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002558XGL_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 -06002559{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002560 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2561 if (pCB) {
2562 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002563 addCmd(pCB, CMD_WRITETIMESTAMP);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002564 }
2565 else {
2566 char str[1024];
2567 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2568 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2569 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002570 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002571}
2572
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002573XGL_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 -06002574{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002575 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2576 if (pCB) {
2577 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002578 addCmd(pCB, CMD_INITATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002579 }
2580 else {
2581 char str[1024];
2582 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2583 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2584 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002585 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
2586}
2587
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002588XGL_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 -06002589{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002590 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2591 if (pCB) {
2592 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002593 addCmd(pCB, CMD_LOADATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002594 }
2595 else {
2596 char str[1024];
2597 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2598 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2599 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002600 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002601}
2602
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002603XGL_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 -06002604{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002605 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2606 if (pCB) {
2607 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002608 addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002609 }
2610 else {
2611 char str[1024];
2612 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2613 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2614 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002615 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
2616}
2617
2618XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
2619{
2620 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
2621 return result;
2622}
2623
2624XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
2625{
2626 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
2627 return result;
2628}
2629
2630XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2631{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002632 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2633 if (pCB) {
2634 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002635 addCmd(pCB, CMD_BEGINRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002636 }
2637 else {
2638 char str[1024];
2639 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2640 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2641 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002642 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
2643}
2644
2645XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
2646{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002647 GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
2648 if (pCB) {
2649 g_lastCmdBuffer = cmdBuffer;
Tobin Ehlisd092d232015-02-13 13:30:07 -07002650 addCmd(pCB, CMD_ENDRENDERPASS);
Tobin Ehlis8cced212015-02-13 10:26:14 -07002651 }
2652 else {
2653 char str[1024];
2654 sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
2655 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
2656 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07002657 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002658}
2659
2660XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
2661{
2662 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
2663 return result;
2664}
2665
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002666XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002667{
Tobin Ehlise79df942014-11-18 16:38:08 -07002668 // This layer intercepts callbacks
2669 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
2670 if (!pNewDbgFuncNode)
2671 return XGL_ERROR_OUT_OF_MEMORY;
2672 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2673 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002674 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2675 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002676 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
2677 return result;
2678}
2679
2680XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
2681{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002682 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07002683 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
2684 while (pTrav) {
2685 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
2686 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002687 if (g_pDbgFunctionHead == pTrav)
2688 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07002689 free(pTrav);
2690 break;
2691 }
2692 pPrev = pTrav;
2693 pTrav = pTrav->pNext;
2694 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002695 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2696 return result;
2697}
2698
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002699XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002700{
2701 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2702 return result;
2703}
2704
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002705XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002706{
2707 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2708 return result;
2709}
2710
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002711XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002712{
2713 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2714 return result;
2715}
2716
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002717XGL_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 -06002718{
2719 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2720 return result;
2721}
2722
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002723XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002724{
2725 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2726}
2727
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002728XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002729{
2730 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2731}
2732
Ian Elliott81ac44c2015-01-13 17:52:38 -07002733#if defined(WIN32)
2734// FIXME: NEED WINDOWS EQUIVALENT
2735#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002736XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2737{
2738 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002739 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002740 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002741 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002742 return result;
2743}
2744
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002745XGL_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 -06002746{
Chia-I Wu6204f342014-11-07 13:33:45 +08002747 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002748 return result;
2749}
2750
2751XGL_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)
2752{
2753 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
2754 return result;
2755}
2756
2757XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2758{
2759 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2760 return result;
2761}
Ian Elliott81ac44c2015-01-13 17:52:38 -07002762#endif // WIN32
Tobin Ehlis8cced212015-02-13 10:26:14 -07002763// TODO : Want to pass in a cmdBuffer here based on which state to display
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002764void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002765{
Tobin Ehlis8cced212015-02-13 10:26:14 -07002766 // TODO : Currently just setting cmdBuffer based on global var
2767 dumpDotFile(g_lastCmdBuffer, outFileName);
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002768}
2769
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002770void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07002771{
Ian Elliott81ac44c2015-01-13 17:52:38 -07002772#if defined(_WIN32)
2773// FIXME: NEED WINDOWS EQUIVALENT
2774 char str[1024];
2775 sprintf(str, "Cannot execute dot program yet on Windows.");
2776 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2777#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002778 char dotExe[32] = "/usr/bin/dot";
2779 if( access(dotExe, X_OK) != -1) {
Tobin Ehlis8cced212015-02-13 10:26:14 -07002780 dumpDotFile(g_lastCmdBuffer, "/tmp/tmp.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07002781 char dotCmd[1024];
2782 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
2783 system(dotCmd);
2784 remove("/tmp/tmp.dot");
2785 }
2786 else {
2787 char str[1024];
2788 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
2789 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2790 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07002791#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002792}
2793
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002794XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002795{
2796 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08002797 void *addr;
2798
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002799 if (gpu == NULL)
2800 return NULL;
2801 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002802 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002803
Chia-I Wu706533e2015-01-05 13:18:57 +08002804 addr = layer_intercept_proc(funcName);
2805 if (addr)
2806 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002807 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002808 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002809 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07002810 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002811 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002812 if (gpuw->pGPA == NULL)
2813 return NULL;
2814 return gpuw->pGPA(gpuw->nextObject, funcName);
2815 }
2816}