blob: d8527bb9777e6be1acd7e84cb0ce41be88769d52 [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>
28#include <assert.h>
29#include <pthread.h>
Tobin Ehlis266473d2014-12-16 17:34:50 -070030#include <unistd.h>
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080031#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080032#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlisb8154982014-10-27 14:53:17 -060033#include "xgl_struct_string_helper.h"
Tobin Ehlisa701ef02014-11-27 15:43:39 -070034#include "xgl_struct_graphviz_helper.h"
Tobin Ehlise79df942014-11-18 16:38:08 -070035#include "draw_state.h"
Jon Ashburn2e9b5612014-12-22 13:38:27 -070036#include "layers_config.h"
Tobin Ehlis8726b9f2014-10-24 12:01:45 -060037
38static XGL_LAYER_DISPATCH_TABLE nextTable;
39static XGL_BASE_LAYER_OBJECT *pCurObj;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070040static pthread_once_t g_initOnce = PTHREAD_ONCE_INIT;
Tobin Ehlis9e142a32014-11-21 12:04:39 -070041// Could be smarter about locking with unique locks for various tasks, but just using one for now
42pthread_mutex_t globalLock = PTHREAD_MUTEX_INITIALIZER;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070043
Tobin Ehlise79df942014-11-18 16:38:08 -070044// Ptr to LL of dbg functions
Jon Ashburn2e9b5612014-12-22 13:38:27 -070045static XGL_LAYER_DBG_FUNCTION_NODE *g_pDbgFunctionHead = NULL;
46static XGL_LAYER_DBG_REPORT_LEVEL g_reportingLevel = XGL_DBG_LAYER_LEVEL_ERROR;
47static XGL_LAYER_DBG_ACTION g_debugAction = XGL_DBG_LAYER_ACTION_LOG_MSG;
48static FILE *g_logFile = NULL;
49
Tobin Ehlise79df942014-11-18 16:38:08 -070050// Utility function to handle reporting
51// If callbacks are enabled, use them, otherwise use printf
52static XGL_VOID layerCbMsg(XGL_DBG_MSG_TYPE msgType,
53 XGL_VALIDATION_LEVEL validationLevel,
54 XGL_BASE_OBJECT srcObject,
55 XGL_SIZE location,
56 XGL_INT msgCode,
Chia-I Wua837c522014-12-16 10:47:33 +080057 const char* pLayerPrefix,
58 const char* pMsg)
Tobin Ehlise79df942014-11-18 16:38:08 -070059{
Jon Ashburn2e9b5612014-12-22 13:38:27 -070060 if (g_debugAction & (XGL_DBG_LAYER_ACTION_LOG_MSG | XGL_DBG_LAYER_ACTION_CALLBACK)) {
61 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -070062 switch (msgType) {
63 case XGL_DBG_MSG_ERROR:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070064 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_ERROR) {
65 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
66 fprintf(g_logFile, "{%s}ERROR : %s\n", pLayerPrefix, pMsg);
67 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
68 while (pTrav) {
69 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
70 pTrav = pTrav->pNext;
71 }
72 }
Tobin Ehlise79df942014-11-18 16:38:08 -070073 break;
74 case XGL_DBG_MSG_WARNING:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070075 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_WARN) {
76 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
77 fprintf(g_logFile, "{%s}WARN : %s\n", pLayerPrefix, pMsg);
78 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
79 while (pTrav) {
80 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
81 pTrav = pTrav->pNext;
82 }
83 }
Tobin Ehlise79df942014-11-18 16:38:08 -070084 break;
85 case XGL_DBG_MSG_PERF_WARNING:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070086 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_PERF_WARN) {
87 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
88 fprintf(g_logFile, "{%s}PERF_WARN : %s\n", pLayerPrefix, pMsg);
89 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
90 while (pTrav) {
91 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
92 pTrav = pTrav->pNext;
93 }
94 }
Tobin Ehlise79df942014-11-18 16:38:08 -070095 break;
96 default:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070097 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_INFO) {
98 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
99 fprintf(g_logFile, "{%s}INFO : %s\n", pLayerPrefix, pMsg);
100 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
101 while (pTrav) {
102 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
103 pTrav = pTrav->pNext;
104 }
105 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700106 break;
107 }
108 }
109}
Tobin Ehlis26092022014-11-20 09:49:17 -0700110// Return the size of the underlying struct based on struct type
111static XGL_SIZE sTypeStructSize(XGL_STRUCTURE_TYPE sType)
112{
113 switch (sType)
114 {
115 case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
116 return sizeof(XGL_APPLICATION_INFO);
117 case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
118 return sizeof(XGL_DEVICE_CREATE_INFO);
119 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
120 return sizeof(XGL_MEMORY_ALLOC_INFO);
121 case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
122 return sizeof(XGL_MEMORY_OPEN_INFO);
123 case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
124 return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
125 case XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO:
126 return sizeof(XGL_MEMORY_VIEW_ATTACH_INFO);
127 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
128 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
129 case XGL_STRUCTURE_TYPE_MEMORY_STATE_TRANSITION:
130 return sizeof(XGL_MEMORY_STATE_TRANSITION);
131 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
132 return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
133 case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
134 return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
135 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
136 return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
137 case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
138 return sizeof(XGL_SHADER_CREATE_INFO);
139 case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
140 return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
141 case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
142 return sizeof(XGL_SAMPLER_CREATE_INFO);
143 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO:
144 return sizeof(XGL_DESCRIPTOR_SET_CREATE_INFO);
145 case XGL_STRUCTURE_TYPE_RASTER_STATE_CREATE_INFO:
146 return sizeof(XGL_RASTER_STATE_CREATE_INFO);
147 case XGL_STRUCTURE_TYPE_MSAA_STATE_CREATE_INFO:
148 return sizeof(XGL_MSAA_STATE_CREATE_INFO);
149 case XGL_STRUCTURE_TYPE_COLOR_BLEND_STATE_CREATE_INFO:
150 return sizeof(XGL_COLOR_BLEND_STATE_CREATE_INFO);
151 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO:
152 return sizeof(XGL_DEPTH_STENCIL_STATE_CREATE_INFO);
153 case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
154 return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
155 case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
156 return sizeof(XGL_EVENT_CREATE_INFO);
157 case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
158 return sizeof(XGL_FENCE_CREATE_INFO);
159 case XGL_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO:
160 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
161 case XGL_STRUCTURE_TYPE_SEMAPHORE_OPEN_INFO:
162 return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
163 case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
164 return sizeof(XGL_QUERY_POOL_CREATE_INFO);
165 case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
166 return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
167 case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
168 return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
169 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
170 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
171 case XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO:
172 return sizeof(XGL_PIPELINE_DB_STATE_CREATE_INFO);
173 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
174 return sizeof(XGL_PIPELINE_CB_STATE);
175 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
176 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
177 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
178 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
179 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
180 return sizeof(XGL_IMAGE_CREATE_INFO);
181 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
182 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
183 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
184 return sizeof(XGL_LAYER_CREATE_INFO);
185 default:
186 return 0;
187 }
188}
Tobin Ehlis56a61072014-11-21 08:58:46 -0700189// Return the size of the underlying struct based on Bind Point enum
190// Have to do this b/c VIEWPORT doesn't have sType in its createinfo struct
Chia-I Wu84d7f5c2014-12-16 00:43:20 +0800191static XGL_SIZE dynStateCreateInfoSize(XGL_STATE_BIND_POINT sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700192{
193 switch (sType)
194 {
195 case XGL_STATE_BIND_VIEWPORT:
196 return sizeof(XGL_VIEWPORT_STATE_CREATE_INFO);
197 case XGL_STATE_BIND_RASTER:
198 return sizeof(XGL_RASTER_STATE_CREATE_INFO);
199 case XGL_STATE_BIND_DEPTH_STENCIL:
200 return sizeof(XGL_DEPTH_STENCIL_STATE_CREATE_INFO);
201 case XGL_STATE_BIND_COLOR_BLEND:
202 return sizeof(XGL_COLOR_BLEND_STATE_CREATE_INFO);
203 case XGL_STATE_BIND_MSAA:
204 return sizeof(XGL_MSAA_STATE_CREATE_INFO);
205 default:
206 return 0;
207 }
208}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600209// Block of code at start here for managing/tracking Pipeline state that this layer cares about
210// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700211#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600212#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600213
214static uint64_t drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
215
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600216typedef struct _SHADER_DS_MAPPING {
217 XGL_UINT slotCount;
218 XGL_DESCRIPTOR_SLOT_INFO* pShaderMappingSlot;
219} SHADER_DS_MAPPING;
220
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600221typedef struct _PIPELINE_LL_HEADER {
222 XGL_STRUCTURE_TYPE sType;
223 const XGL_VOID* pNext;
224} PIPELINE_LL_HEADER;
225
Tobin Ehlis26092022014-11-20 09:49:17 -0700226typedef struct _PIPELINE_NODE {
227 XGL_PIPELINE pipeline;
228 struct _PIPELINE_NODE *pNext;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700229 XGL_GRAPHICS_PIPELINE_CREATE_INFO *pCreateTree; // Ptr to shadow of data in create tree
Tobin Ehlis26092022014-11-20 09:49:17 -0700230 // 1st dimension of array is shader type
231 SHADER_DS_MAPPING dsMapping[XGL_NUM_GRAPHICS_SHADERS][XGL_MAX_DESCRIPTOR_SETS];
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700232 // Vtx input info (if any)
233 XGL_UINT vtxBindingCount; // number of bindings
234 XGL_VERTEX_INPUT_BINDING_DESCRIPTION* pVertexBindingDescriptions;
235 XGL_UINT vtxAttributeCount; // number of attributes
236 XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* pVertexAttributeDescriptions;
Tobin Ehlis26092022014-11-20 09:49:17 -0700237} PIPELINE_NODE;
238
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700239typedef struct _SAMPLER_NODE {
240 XGL_SAMPLER sampler;
241 XGL_SAMPLER_CREATE_INFO createInfo;
242 struct _SAMPLER_NODE *pNext;
243} SAMPLER_NODE;
244
Tobin Ehlis56a61072014-11-21 08:58:46 -0700245typedef struct _DYNAMIC_STATE_NODE {
246 XGL_STATE_OBJECT stateObj;
247 XGL_STATE_BIND_POINT sType; // Extra data as VIEWPORT CreateInfo doesn't have sType
248 PIPELINE_LL_HEADER *pCreateInfo;
249 struct _DYNAMIC_STATE_NODE *pNext;
250} DYNAMIC_STATE_NODE;
251
252// 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 -0700253// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
254// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600255static PIPELINE_NODE *pPipelineHead = NULL;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700256static SAMPLER_NODE *pSamplerHead = NULL;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600257static XGL_PIPELINE lastBoundPipeline = NULL;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700258#define MAX_BINDING 0xFFFFFFFF
259static XGL_UINT lastVtxBinding = MAX_BINDING;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600260
Tobin Ehlis56a61072014-11-21 08:58:46 -0700261static DYNAMIC_STATE_NODE* pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
262static DYNAMIC_STATE_NODE* pLastBoundDynamicState[XGL_NUM_STATE_BIND_POINT] = {0};
263
264// Viewport state create info doesn't have sType so we have to pass in BIND_POINT
265static void insertDynamicState(const XGL_STATE_OBJECT state, const PIPELINE_LL_HEADER* pCreateInfo, const XGL_STATE_BIND_POINT sType)
266{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700267 pthread_mutex_lock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700268 // Insert new node at head of appropriate LL
269 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
270 pStateNode->pNext = pDynamicStateHead[sType];
271 pDynamicStateHead[sType] = pStateNode;
272 pStateNode->stateObj = state;
273 pStateNode->sType = sType;
274 pStateNode->pCreateInfo = (PIPELINE_LL_HEADER*)malloc(dynStateCreateInfoSize(sType));
275 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(sType));
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700276 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700277}
278// Set the last bound dynamic state of given type
279// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
280static void setLastBoundDynamicState(const XGL_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
281{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700282 pthread_mutex_lock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700283 DYNAMIC_STATE_NODE* pTrav = pDynamicStateHead[sType];
284 while (pTrav && (state != pTrav->stateObj)) {
285 pTrav = pTrav->pNext;
286 }
287 if (!pTrav) {
288 char str[1024];
289 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
290 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
291 }
292 pLastBoundDynamicState[sType] = pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700293 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700294}
295// Print the last bound dynamic state
296static void printDynamicState()
297{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700298 pthread_mutex_lock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700299 char str[1024];
300 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
301 if (pLastBoundDynamicState[i]) {
302 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pLastBoundDynamicState[i]->stateObj);
303 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
304 switch (pLastBoundDynamicState[i]->sType)
305 {
306 case XGL_STATE_BIND_VIEWPORT:
307 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", xgl_print_xgl_viewport_state_create_info((XGL_VIEWPORT_STATE_CREATE_INFO*)pLastBoundDynamicState[i]->pCreateInfo, " "));
308 break;
309 default:
310 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pLastBoundDynamicState[i]->pCreateInfo, " "));
311 break;
312 }
313 }
314 else {
315 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
316 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
317 }
318 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700319 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700320}
321// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600322static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
323{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700324 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600325 PIPELINE_NODE *pTrav = pPipelineHead;
326 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700327 if (pTrav->pipeline == pipeline) {
328 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600329 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700330 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600331 pTrav = pTrav->pNext;
332 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700333 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600334 return NULL;
335}
336
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700337// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
338static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
339{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700340 pthread_mutex_lock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700341 SAMPLER_NODE *pTrav = pSamplerHead;
342 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700343 if (sampler == pTrav->sampler) {
344 pthread_mutex_unlock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700345 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700346 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700347 pTrav = pTrav->pNext;
348 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700349 pthread_mutex_unlock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700350 return NULL;
351}
352
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600353// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700354// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600355static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
356{
Tobin Ehlis26092022014-11-20 09:49:17 -0700357 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700358 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis26092022014-11-20 09:49:17 -0700359 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis56a61072014-11-21 08:58:46 -0700360 PIPELINE_LL_HEADER *pShadowTrav = (PIPELINE_LL_HEADER*)pPipeline->pCreateTree;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600361 PIPELINE_LL_HEADER *pTrav = (PIPELINE_LL_HEADER*)pCreateInfo->pNext;
362 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700363 // Shadow the struct
364 pShadowTrav->pNext = (PIPELINE_LL_HEADER*)malloc(sTypeStructSize(pTrav->sType));
365 // Typically pNext is const so have to cast to avoid warning when we modify it here
366 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
367 pShadowTrav = (PIPELINE_LL_HEADER*)pShadowTrav->pNext;
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700368 // For deep copy DS Mapping into shadow
369 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *pShadowShaderCI = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pShadowTrav;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700370 // TODO : Now that we shadow whole create info, the special copies are just a convenience that can be done away with once shadow is complete and correct
Tobin Ehlis26092022014-11-20 09:49:17 -0700371 // Special copy of DS Mapping info
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600372 if (XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO == pTrav->sType) {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700373 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *pSSCI = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pTrav;
Tobin Ehlis26092022014-11-20 09:49:17 -0700374 for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
375 if (pSSCI->shader.descriptorSetMapping[i].descriptorCount > MAX_SLOTS) {
376 char str[1024];
377 sprintf(str, "descriptorCount for %s exceeds 2048 (%u), is this correct? Changing to 0", string_XGL_PIPELINE_SHADER_STAGE(pSSCI->shader.stage), pSSCI->shader.descriptorSetMapping[i].descriptorCount);
378 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_DESCRIPTOR_MAX_EXCEEDED, "DS", str);
379 pSSCI->shader.descriptorSetMapping[i].descriptorCount = 0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600380 }
Tobin Ehlis26092022014-11-20 09:49:17 -0700381 pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount = pSSCI->shader.descriptorSetMapping[i].descriptorCount;
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700382 // Deep copy DS Slot array into our shortcut data structure
Tobin Ehlis26092022014-11-20 09:49:17 -0700383 pPipeline->dsMapping[pSSCI->shader.stage][i].pShaderMappingSlot = (XGL_DESCRIPTOR_SLOT_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount);
384 memcpy(pPipeline->dsMapping[pSSCI->shader.stage][i].pShaderMappingSlot, pSSCI->shader.descriptorSetMapping[i].pDescriptorInfo, sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700385 // Deep copy into shadow tree
386 pShadowShaderCI->shader.descriptorSetMapping[i].descriptorCount = pSSCI->shader.descriptorSetMapping[i].descriptorCount;
387 pShadowShaderCI->shader.descriptorSetMapping[i].pDescriptorInfo = (XGL_DESCRIPTOR_SLOT_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pShadowShaderCI->shader.descriptorSetMapping[i].descriptorCount);
388 memcpy((XGL_DESCRIPTOR_SLOT_INFO*)pShadowShaderCI->shader.descriptorSetMapping[i].pDescriptorInfo, pSSCI->shader.descriptorSetMapping[i].pDescriptorInfo, sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pShadowShaderCI->shader.descriptorSetMapping[i].descriptorCount);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600389 }
390 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700391 else if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
392 // Special copy of Vtx info
393 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav;
394 pPipeline->vtxBindingCount = pVICI->bindingCount;
395 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
396 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
397 memcpy(pPipeline->pVertexBindingDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
398 pPipeline->vtxAttributeCount = pVICI->attributeCount;
399 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
400 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
401 memcpy(pPipeline->pVertexAttributeDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
402 }
Tobin Ehlisb8154982014-10-27 14:53:17 -0600403 pTrav = (PIPELINE_LL_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600404 }
405}
406
407// Block of code at start here specifically for managing/tracking DSs
408#define MAPPING_MEMORY 0x00000001
409#define MAPPING_IMAGE 0x00000002
410#define MAPPING_SAMPLER 0x00000004
411#define MAPPING_DS 0x00000008
412
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600413static char* stringSlotBinding(XGL_UINT binding)
414{
415 switch (binding)
416 {
417 case MAPPING_MEMORY:
418 return "Memory View";
419 case MAPPING_IMAGE:
420 return "Image View";
421 case MAPPING_SAMPLER:
422 return "Sampler";
423 default:
424 return "UNKNOWN DS BINDING";
425 }
426}
427
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600428typedef struct _DS_SLOT {
429 XGL_UINT slot;
Tobin Ehlis26092022014-11-20 09:49:17 -0700430 XGL_DESCRIPTOR_SLOT_INFO shaderSlotInfo[XGL_NUM_GRAPHICS_SHADERS];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600431 // Only 1 of 4 possible slot mappings active
432 XGL_UINT activeMapping;
433 XGL_UINT mappingMask; // store record of different mappings used
434 XGL_MEMORY_VIEW_ATTACH_INFO memView;
435 XGL_IMAGE_VIEW_ATTACH_INFO imageView;
436 XGL_SAMPLER sampler;
437} DS_SLOT;
438
439// Top-level node that points to start of DS
440typedef struct _DS_LL_HEAD {
441 XGL_DESCRIPTOR_SET dsID;
442 XGL_UINT numSlots;
443 struct _DS_LL_HEAD *pNextDS;
444 DS_SLOT *dsSlot; // Dynamically allocated array of DS_SLOTs
445 XGL_BOOL updateActive; // Track if DS is in an update block
446} DS_LL_HEAD;
447
448// ptr to HEAD of LL of DSs
449static DS_LL_HEAD *pDSHead = NULL;
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700450// Last DS that was bound, and slotOffset for the binding
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600451static XGL_DESCRIPTOR_SET lastBoundDS[XGL_MAX_DESCRIPTOR_SETS] = {NULL, NULL};
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700452static XGL_UINT lastBoundSlotOffset[XGL_MAX_DESCRIPTOR_SETS] = {0, 0};
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600453
454// Return DS Head ptr for specified ds or else NULL
455static DS_LL_HEAD* getDS(XGL_DESCRIPTOR_SET ds)
456{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700457 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600458 DS_LL_HEAD *pTrav = pDSHead;
459 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700460 if (pTrav->dsID == ds) {
461 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600462 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700463 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600464 pTrav = pTrav->pNextDS;
465 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700466 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600467 return NULL;
468}
469
470// Initialize a DS where all slots are UNUSED for all shaders
471static void initDS(DS_LL_HEAD *pDS)
472{
473 for (uint32_t i = 0; i < pDS->numSlots; i++) {
474 memset((void*)&pDS->dsSlot[i], 0, sizeof(DS_SLOT));
475 pDS->dsSlot[i].slot = i;
476 }
477}
478
479// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorSetUpdate() call sequence, otherwise XGL_FALSE
480static XGL_BOOL dsUpdate(XGL_DESCRIPTOR_SET ds)
481{
482 DS_LL_HEAD *pTrav = getDS(ds);
483 if (pTrav)
484 return pTrav->updateActive;
485 return XGL_FALSE;
486}
487
488// Clear specified slotCount DS Slots starting at startSlot
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700489// Return XGL_TRUE if DS exists and is successfully cleared to 0s
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600490static XGL_BOOL clearDS(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount)
491{
492 DS_LL_HEAD *pTrav = getDS(descriptorSet);
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700493 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600494 if (!pTrav || ((startSlot + slotCount) > pTrav->numSlots)) {
495 // TODO : Log more meaningful error here
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700496 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600497 return XGL_FALSE;
498 }
499 for (uint32_t i = startSlot; i < slotCount; i++) {
500 memset((void*)&pTrav->dsSlot[i], 0, sizeof(DS_SLOT));
501 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700502 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600503 return XGL_TRUE;
504}
505
506static void dsSetMapping(DS_SLOT* pSlot, XGL_UINT mapping)
507{
508 pSlot->mappingMask |= mapping;
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600509 pSlot->activeMapping = mapping;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600510}
Tobin Ehlise79df942014-11-18 16:38:08 -0700511// Populate pStr w/ a string noting all of the slot mappings based on mapping flag
512static char* noteSlotMapping(XGL_UINT32 mapping, char *pStr)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600513{
514 if (MAPPING_MEMORY & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700515 strcat(pStr, "\n\tMemory View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600516 if (MAPPING_IMAGE & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700517 strcat(pStr, "\n\tImage View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600518 if (MAPPING_SAMPLER & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700519 strcat(pStr, "\n\tSampler previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600520 if (MAPPING_DS & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700521 strcat(pStr, "\n\tDESCRIPTOR SET ptr previously mapped");
522 return pStr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600523}
524
Tobin Ehlise79df942014-11-18 16:38:08 -0700525static void dsSetMemMapping(XGL_DESCRIPTOR_SET descriptorSet, DS_SLOT* pSlot, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemView)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600526{
527 if (pSlot->mappingMask) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700528 char str[1024];
529 char map_str[1024] = {0};
530 sprintf(str, "While mapping Memory View to slot %u previous Mapping(s) identified:%s", pSlot->slot, noteSlotMapping(pSlot->mappingMask, map_str));
531 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_SLOT_REMAPPING, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600532 }
533 memcpy(&pSlot->memView, pMemView, sizeof(XGL_MEMORY_VIEW_ATTACH_INFO));
534 dsSetMapping(pSlot, MAPPING_MEMORY);
535}
536
537static XGL_BOOL dsMemMapping(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemViews)
538{
539 DS_LL_HEAD *pTrav = getDS(descriptorSet);
540 if (pTrav) {
541 if (pTrav->numSlots < (startSlot + slotCount)) {
542 return XGL_FALSE;
543 }
544 for (uint32_t i = 0; i < slotCount; i++) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700545 dsSetMemMapping(descriptorSet, &pTrav->dsSlot[i+startSlot], &pMemViews[i]);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600546 }
547 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600548 else
549 return XGL_FALSE;
550 return XGL_TRUE;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600551}
552
Tobin Ehlise79df942014-11-18 16:38:08 -0700553static void dsSetImageMapping(XGL_DESCRIPTOR_SET descriptorSet, DS_SLOT* pSlot, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600554{
555 if (pSlot->mappingMask) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700556 char str[1024];
557 char map_str[1024] = {0};
558 sprintf(str, "While mapping Image View to slot %u previous Mapping(s) identified:%s", pSlot->slot, noteSlotMapping(pSlot->mappingMask, map_str));
559 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_SLOT_REMAPPING, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600560 }
561 memcpy(&pSlot->imageView, pImageViews, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
562 dsSetMapping(pSlot, MAPPING_IMAGE);
563}
564
565static XGL_BOOL dsImageMapping(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews)
566{
567 DS_LL_HEAD *pTrav = getDS(descriptorSet);
568 if (pTrav) {
569 if (pTrav->numSlots < (startSlot + slotCount)) {
570 return XGL_FALSE;
571 }
572 for (uint32_t i = 0; i < slotCount; i++) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700573 dsSetImageMapping(descriptorSet, &pTrav->dsSlot[i+startSlot], &pImageViews[i]);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600574 }
575 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600576 else
577 return XGL_FALSE;
578 return XGL_TRUE;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600579}
580
Tobin Ehlise79df942014-11-18 16:38:08 -0700581static void dsSetSamplerMapping(XGL_DESCRIPTOR_SET descriptorSet, DS_SLOT* pSlot, const XGL_SAMPLER sampler)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600582{
583 if (pSlot->mappingMask) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700584 char str[1024];
585 char map_str[1024] = {0};
586 sprintf(str, "While mapping Sampler to slot %u previous Mapping(s) identified:%s", pSlot->slot, noteSlotMapping(pSlot->mappingMask, map_str));
587 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_SLOT_REMAPPING, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600588 }
589 pSlot->sampler = sampler;
590 dsSetMapping(pSlot, MAPPING_SAMPLER);
591}
592
593static XGL_BOOL dsSamplerMapping(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_SAMPLER* pSamplers)
594{
595 DS_LL_HEAD *pTrav = getDS(descriptorSet);
596 if (pTrav) {
597 if (pTrav->numSlots < (startSlot + slotCount)) {
598 return XGL_FALSE;
599 }
600 for (uint32_t i = 0; i < slotCount; i++) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700601 dsSetSamplerMapping(descriptorSet, &pTrav->dsSlot[i+startSlot], pSamplers[i]);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600602 }
603 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600604 else
605 return XGL_FALSE;
606 return XGL_TRUE;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600607}
Tobin Ehlis56a61072014-11-21 08:58:46 -0700608// Print the last bound Gfx Pipeline
609static void printPipeline()
610{
611 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
612 if (!pPipeTrav) {
613 // nothing to print
614 }
615 else {
616 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
617 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
618 }
619}
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700620// Dump subgraph w/ DS info
621static void dsDumpDot(FILE* pOutFile)
622{
623 const int i = 0; // hard-coding to just the first DS index for now
624 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
625 DS_LL_HEAD *pDS = getDS(lastBoundDS[i]);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700626 if (pDS) {
627 fprintf(pOutFile, "subgraph DS_SLOTS\n{\nlabel=\"DS0 Slots\"\n");
628 // First create simple array node as central DS reference point
629 fprintf(pOutFile, "\"DS0_MEMORY\" [\nlabel = <<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"ds2\">DS0 Memory</TD></TR>");
630 uint32_t j;
631 char label[1024];
632 for (j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisf1c468a2014-12-09 17:00:33 -0700633 // Don't draw unused slots
634 if (0 != pDS->dsSlot[j].activeMapping)
635 fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", j, j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700636 }
637 fprintf(pOutFile, "</TABLE>>\n];\n");
638 // Now tie each slot to its info
639 for (j = 0; j < pDS->numSlots; j++) {
640 switch (pDS->dsSlot[j].activeMapping)
641 {
642 case MAPPING_MEMORY:
643 /*
644 if (0 != skipUnusedCount) {// finish sequence of unused slots
645 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
646 strcat(ds_config_str, tmp_str);
647 skipUnusedCount = 0;
648 }*/
649 sprintf(label, "MemAttachInfo Slot%u", j);
650 fprintf(pOutFile, "%s", xgl_gv_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].memView, label));
651 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
652 break;
653 case MAPPING_IMAGE:
654 /*if (0 != skipUnusedCount) {// finish sequence of unused slots
655 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
656 strcat(ds_config_str, tmp_str);
657 skipUnusedCount = 0;
658 }*/
659 sprintf(label, "ImageAttachInfo Slot%u", j);
660 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_attach_info(&pDS->dsSlot[j].imageView, label));
661 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
662 break;
663 case MAPPING_SAMPLER:
664 /*if (0 != skipUnusedCount) {// finish sequence of unused slots
665 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
666 strcat(ds_config_str, tmp_str);
667 skipUnusedCount = 0;
668 }*/
669 sprintf(label, "ImageAttachInfo Slot%u", j);
670 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(getSamplerCreateInfo(pDS->dsSlot[j].sampler), label));
671 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
672 break;
673 default:
674 /*if (!skipUnusedCount) {// only report start of unused sequences
675 sprintf(tmp_str, "----Skipping slot(s) w/o a view attached...\n");
676 strcat(ds_config_str, tmp_str);
677 }*/
678 skipUnusedCount++;
679 break;
680 }
681
682 }
683 /*if (0 != skipUnusedCount) {// finish sequence of unused slots
684 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
685 strcat(ds_config_str, tmp_str);
686 skipUnusedCount = 0;
687 }*/
688 fprintf(pOutFile, "}\n");
689 }
690}
691// Dump a GraphViz dot file showing the pipeline
692static void dumpDotFile(char *outFileName)
693{
694 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
695 if (pPipeTrav) {
696 FILE* pOutFile;
697 pOutFile = fopen(outFileName, "w");
698 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
699 fprintf(pOutFile, "subgraph PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
700 fprintf(pOutFile, "%s", xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"));
701 fprintf(pOutFile, "}\n");
702 // TODO : Add dynamic state dump here
703 fprintf(pOutFile, "subgraph dynamicState\n{\nlabel=\"Non-Orthogonal XGL State\"\n");
704 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
705 if (pLastBoundDynamicState[i]) {
706 switch (pLastBoundDynamicState[i]->sType)
707 {
708 case XGL_STATE_BIND_VIEWPORT:
709 fprintf(pOutFile, "%s", xgl_gv_print_xgl_viewport_state_create_info((XGL_VIEWPORT_STATE_CREATE_INFO*)pLastBoundDynamicState[i]->pCreateInfo, "VIEWPORT State"));
710 break;
711 default:
712 fprintf(pOutFile, "%s", dynamic_gv_display(pLastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(pLastBoundDynamicState[i]->sType)));
713 break;
714 }
715 }
716 }
717 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
718 dsDumpDot(pOutFile);
719 fprintf(pOutFile, "}\n"); // close main graph "g"
720 fclose(pOutFile);
721 }
722}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600723// Synch up currently bound pipeline settings with DS mappings
724static void synchDSMapping()
725{
726 // First verify that we have a bound pipeline
727 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
Tobin Ehlise79df942014-11-18 16:38:08 -0700728 char str[1024];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600729 if (!pPipeTrav) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700730 sprintf(str, "Can't find last bound Pipeline %p!", (void*)lastBoundPipeline);
731 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600732 }
733 else {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700734 // Synch Descriptor Set Mapping
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600735 for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600736 DS_LL_HEAD *pDS;
737 if (lastBoundDS[i]) {
738 pDS = getDS(lastBoundDS[i]);
739 if (!pDS) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700740 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS to index %u?", (void*)lastBoundDS[i], i);
741 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600742 }
743 else { // We have a good DS & Pipeline, store pipeline mappings in DS
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700744 XGL_UINT slotOffset = lastBoundSlotOffset[i];
Tobin Ehlis26092022014-11-20 09:49:17 -0700745 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700746 if (pPipeTrav->dsMapping[j][i].slotCount > (pDS->numSlots - slotOffset)) {
747 sprintf(str, "DS Mapping for shader %u has more slots (%u) than DS %p (%u) minus slotOffset (%u) (%u slots available)!", j, pPipeTrav->dsMapping[j][i].slotCount, (void*)pDS->dsID, pDS->numSlots, slotOffset, (pDS->numSlots - slotOffset));
Tobin Ehlis21042792014-11-24 16:06:04 -0700748 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_DS_SLOT_NUM_MISMATCH, "DS", str);
749 }
750 else {
751 for (uint32_t r = 0; r < pPipeTrav->dsMapping[j][i].slotCount; r++) {
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700752 pDS->dsSlot[r+slotOffset].shaderSlotInfo[j] = pPipeTrav->dsMapping[j][i].pShaderMappingSlot[r];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600753 }
754 }
755 }
756 }
757 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600758 else {
Tobin Ehlis21042792014-11-24 16:06:04 -0700759 // Verify that no shader is mapping this DS
760 uint32_t dsUsed = 0;
761 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
762 if (pPipeTrav->dsMapping[j][i].slotCount > 0) {
763 dsUsed = 1;
764 sprintf(str, "No DS was bound to index %u, but shader type %s has slots bound to that DS.", i, string_XGL_PIPELINE_SHADER_STAGE(j));
765 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
766 }
767 }
768 if (0 == dsUsed) {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700769 sprintf(str, "No DS was bound to index %u, but no shaders are using that DS so this is not an issue.", i);
Tobin Ehlis21042792014-11-24 16:06:04 -0700770 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
771 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600772 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600773 }
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700774 // Verify Vtx binding
775 if (MAX_BINDING != lastVtxBinding) {
776 if (lastVtxBinding >= pPipeTrav->vtxBindingCount) {
777 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
778 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
779 }
780 else {
781 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[lastVtxBinding], "{DS}INFO : ");
782 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
783 free(tmpStr);
784 }
785 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600786 }
787}
788
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600789// Checks to make sure that shader mapping matches slot binding
790// Print an ERROR and return XGL_FALSE if they don't line up
791static XGL_BOOL verifyShaderSlotMapping(const XGL_UINT slot, const XGL_UINT slotBinding, const XGL_UINT shaderStage, const XGL_DESCRIPTOR_SET_SLOT_TYPE shaderMapping)
792{
793 XGL_BOOL error = XGL_FALSE;
Tobin Ehlise79df942014-11-18 16:38:08 -0700794 char str[1024];
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600795 switch (shaderMapping)
796 {
Cody Northrop40316a32014-12-09 19:08:33 -0700797 case XGL_SLOT_SHADER_TEXTURE_RESOURCE:
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600798 case XGL_SLOT_SHADER_RESOURCE:
799 if (MAPPING_MEMORY != slotBinding && MAPPING_IMAGE != slotBinding)
800 error = XGL_TRUE;
801 break;
802 case XGL_SLOT_SHADER_SAMPLER:
803 if (MAPPING_SAMPLER != slotBinding)
804 error = XGL_TRUE;
805 break;
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600806 case XGL_SLOT_SHADER_UAV:
807 if (MAPPING_MEMORY != slotBinding)
808 error = XGL_TRUE;
809 break;
810 case XGL_SLOT_NEXT_DESCRIPTOR_SET:
811 if (MAPPING_DS != slotBinding)
812 error = XGL_TRUE;
813 break;
814 case XGL_SLOT_UNUSED:
815 break;
816 default:
Tobin Ehlise79df942014-11-18 16:38:08 -0700817 sprintf(str, "For DS slot %u, unknown shader slot mapping w/ value %u", slot, shaderMapping);
818 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_UNKNOWN_DS_MAPPING, "DS", str);
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600819 return XGL_FALSE;
820 }
821 if (XGL_TRUE == error) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700822 sprintf(str, "DS Slot #%u binding of %s does not match %s shader mapping of %s", slot, stringSlotBinding(slotBinding), string_XGL_PIPELINE_SHADER_STAGE(shaderStage), string_XGL_DESCRIPTOR_SET_SLOT_TYPE(shaderMapping));
Tobin Ehlise79df942014-11-18 16:38:08 -0700823 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_DS_MAPPING_MISMATCH, "DS", str);
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600824 return XGL_FALSE;
825 }
826 return XGL_TRUE;
827}
828
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600829// Print details of DS config to stdout
830static void printDSConfig()
831{
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700832 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
Tobin Ehlise79df942014-11-18 16:38:08 -0700833 char tmp_str[1024];
834 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 Ehlis8726b9f2014-10-24 12:01:45 -0600835 for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600836 if (lastBoundDS[i]) {
837 DS_LL_HEAD *pDS = getDS(lastBoundDS[i]);
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700838 XGL_UINT slotOffset = lastBoundSlotOffset[i];
Tobin Ehlisb8154982014-10-27 14:53:17 -0600839 if (pDS) {
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700840 sprintf(tmp_str, "DS INFO : Slot bindings for DS[%u] (%p) - %u slots and slotOffset %u:\n", i, (void*)pDS->dsID, pDS->numSlots, slotOffset);
Tobin Ehlise79df942014-11-18 16:38:08 -0700841 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600842 for (uint32_t j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600843 switch (pDS->dsSlot[j].activeMapping)
844 {
845 case MAPPING_MEMORY:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700846 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700847 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
848 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700849 skipUnusedCount = 0;
850 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700851 sprintf(tmp_str, "----Slot %u\n Mapped to Memory View %p:\n%s", j, (void*)&pDS->dsSlot[j].memView, xgl_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].memView, " "));
852 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600853 break;
854 case MAPPING_IMAGE:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700855 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700856 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
857 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700858 skipUnusedCount = 0;
859 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700860 sprintf(tmp_str, "----Slot %u\n Mapped to Image View %p:\n%s", j, (void*)&pDS->dsSlot[j].imageView, xgl_print_xgl_image_view_attach_info(&pDS->dsSlot[j].imageView, " "));
861 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600862 break;
863 case MAPPING_SAMPLER:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700864 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700865 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
866 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700867 skipUnusedCount = 0;
868 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700869 sprintf(tmp_str, "----Slot %u\n Mapped to Sampler Object %p:\n%s", j, (void*)pDS->dsSlot[j].sampler, xgl_print_xgl_sampler_create_info(getSamplerCreateInfo(pDS->dsSlot[j].sampler), " "));
Tobin Ehlise79df942014-11-18 16:38:08 -0700870 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600871 break;
872 default:
Tobin Ehlise79df942014-11-18 16:38:08 -0700873 if (!skipUnusedCount) {// only report start of unused sequences
874 sprintf(tmp_str, "----Skipping slot(s) w/o a view attached...\n");
875 strcat(ds_config_str, tmp_str);
876 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700877 skipUnusedCount++;
Tobin Ehlisb8154982014-10-27 14:53:17 -0600878 break;
879 }
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600880 // For each shader type, check its mapping
Tobin Ehlis26092022014-11-20 09:49:17 -0700881 for (uint32_t k = 0; k < XGL_NUM_GRAPHICS_SHADERS; k++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600882 if (XGL_SLOT_UNUSED != pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700883 sprintf(tmp_str, " Shader type %s has %s slot type mapping to shaderEntityIndex %u\n", string_XGL_PIPELINE_SHADER_STAGE(k), string_XGL_DESCRIPTOR_SET_SLOT_TYPE(pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType), pDS->dsSlot[j].shaderSlotInfo[k].shaderEntityIndex);
Tobin Ehlise79df942014-11-18 16:38:08 -0700884 strcat(ds_config_str, tmp_str);
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600885 verifyShaderSlotMapping(j, pDS->dsSlot[j].activeMapping, k, pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600886 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600887 }
888 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700889 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700890 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
891 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700892 skipUnusedCount = 0;
893 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600894 }
Tobin Ehlisb8154982014-10-27 14:53:17 -0600895 else {
Tobin Ehlise79df942014-11-18 16:38:08 -0700896 char str[1024];
897 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS to index %u?", (void*)lastBoundDS[i], i);
898 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600899 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600900 }
901 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700902 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600903}
904
905static void synchAndPrintDSConfig()
906{
907 synchDSMapping();
908 printDSConfig();
Tobin Ehlis56a61072014-11-21 08:58:46 -0700909 printPipeline();
910 printDynamicState();
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700911 static int autoDumpOnce = 1;
912 if (autoDumpOnce) {
913 autoDumpOnce = 0;
914 dumpDotFile("pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -0700915 // Convert dot to png if dot available
916 if(access( "/usr/bin/dot", X_OK) != -1) {
917 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
918 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700919 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600920}
921
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700922static void initDrawState()
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600923{
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700924 const char *strOpt;
925 // initialize MemTracker options
926 strOpt = getLayerOption("DrawStateReportLevel");
927 if (strOpt != NULL)
928 g_reportingLevel = atoi(strOpt);
929 strOpt = getLayerOption("DrawStateDebugAction");
930 if (strOpt != NULL)
931 g_debugAction = atoi(strOpt);
932 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
933 {
934 strOpt = getLayerOption("DrawStateLogFilename");
935 if (strOpt)
936 {
937 g_logFile = fopen(strOpt, "w");
938
939 }
940 if (g_logFile == NULL)
941 g_logFile = stdout;
942 }
943
944 // initialize Layer dispatch table
945 // TODO handle multiple GPUs
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600946 GetProcAddrType fpNextGPA;
947 fpNextGPA = pCurObj->pGPA;
948 assert(fpNextGPA);
949
Chia-I Wu0f65b1e2015-01-04 23:11:43 +0800950 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
951
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600952 GetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetProcAddr");
953 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600954}
955
956
957XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
958{
959 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600960 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700961 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600962 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600963 return result;
964}
965
966XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
967{
968 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600969 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700970 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600971 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600972 return result;
973}
974
975XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
976{
977 XGL_RESULT result = nextTable.DestroyDevice(device);
978 return result;
979}
980
981XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* pExtName)
982{
983 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600984 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700985 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600986 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600987 return result;
988}
989
Jon Ashburn6847c2b2014-11-25 12:56:49 -0700990XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount, XGL_VOID* pReserved)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600991{
Jon Ashburn451c16f2014-11-25 11:08:42 -0700992 if (gpu != NULL)
993 {
994 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
995 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700996 pthread_once(&g_initOnce, initDrawState);
Jon Ashburn6847c2b2014-11-25 12:56:49 -0700997 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700998 return result;
999 } else
1000 {
1001 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1002 return XGL_ERROR_INVALID_POINTER;
1003 // This layer compatible with all GPUs
1004 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001005 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001006 return XGL_SUCCESS;
1007 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001008}
1009
1010XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, XGL_UINT queueIndex, XGL_QUEUE* pQueue)
1011{
1012 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1013 return result;
1014}
1015
1016XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, XGL_UINT cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
1017{
1018 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1019 return result;
1020}
1021
1022XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs)
1023{
1024 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1025 return result;
1026}
1027
1028XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1029{
1030 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1031 return result;
1032}
1033
1034XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1035{
1036 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1037 return result;
1038}
1039
1040XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMemoryHeapCount(XGL_DEVICE device, XGL_UINT* pCount)
1041{
1042 XGL_RESULT result = nextTable.GetMemoryHeapCount(device, pCount);
1043 return result;
1044}
1045
1046XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMemoryHeapInfo(XGL_DEVICE device, XGL_UINT heapId, XGL_MEMORY_HEAP_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1047{
1048 XGL_RESULT result = nextTable.GetMemoryHeapInfo(device, heapId, infoType, pDataSize, pData);
1049 return result;
1050}
1051
1052XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1053{
1054 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1055 return result;
1056}
1057
1058XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1059{
1060 XGL_RESULT result = nextTable.FreeMemory(mem);
1061 return result;
1062}
1063
1064XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1065{
1066 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1067 return result;
1068}
1069
1070XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, XGL_VOID** ppData)
1071{
1072 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1073 return result;
1074}
1075
1076XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1077{
1078 XGL_RESULT result = nextTable.UnmapMemory(mem);
1079 return result;
1080}
1081
1082XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const XGL_VOID* pSysMem, XGL_SIZE memSize, XGL_GPU_MEMORY* pMem)
1083{
1084 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1085 return result;
1086}
1087
1088XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglRemapVirtualMemoryPages(XGL_DEVICE device, XGL_UINT rangeCount, const XGL_VIRTUAL_MEMORY_REMAP_RANGE* pRanges, XGL_UINT preWaitSemaphoreCount, const XGL_QUEUE_SEMAPHORE* pPreWaitSemaphores, XGL_UINT postSignalSemaphoreCount, const XGL_QUEUE_SEMAPHORE* pPostSignalSemaphores)
1089{
1090 XGL_RESULT result = nextTable.RemapVirtualMemoryPages(device, rangeCount, pRanges, preWaitSemaphoreCount, pPreWaitSemaphores, postSignalSemaphoreCount, pPostSignalSemaphores);
1091 return result;
1092}
1093
1094XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1095{
1096 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001097 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001098 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001099 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001100 return result;
1101}
1102
1103XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1104{
1105 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1106 return result;
1107}
1108
1109XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1110{
1111 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1112 return result;
1113}
1114
1115XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1116{
1117 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1118 return result;
1119}
1120
1121XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1122{
1123 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1124 return result;
1125}
1126
1127XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1128{
1129 XGL_RESULT result = nextTable.DestroyObject(object);
1130 return result;
1131}
1132
1133XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1134{
1135 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1136 return result;
1137}
1138
1139XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1140{
1141 XGL_RESULT result = nextTable.BindObjectMemory(object, mem, offset);
1142 return result;
1143}
1144
1145XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1146{
1147 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1148 return result;
1149}
1150
1151XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1152{
1153 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1154 return result;
1155}
1156
1157XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, XGL_UINT fenceCount, const XGL_FENCE* pFences, XGL_BOOL waitAll, XGL_UINT64 timeout)
1158{
1159 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1160 return result;
1161}
1162
1163XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1164{
1165 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1166 return result;
1167}
1168
1169XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1170{
1171 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1172 return result;
1173}
1174
1175XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1176{
1177 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1178 return result;
1179}
1180
1181XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1182{
1183 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1184 return result;
1185}
1186
1187XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1188{
1189 XGL_RESULT result = nextTable.GetEventStatus(event);
1190 return result;
1191}
1192
1193XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1194{
1195 XGL_RESULT result = nextTable.SetEvent(event);
1196 return result;
1197}
1198
1199XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1200{
1201 XGL_RESULT result = nextTable.ResetEvent(event);
1202 return result;
1203}
1204
1205XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1206{
1207 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1208 return result;
1209}
1210
1211XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount, XGL_SIZE* pDataSize, XGL_VOID* pData)
1212{
1213 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1214 return result;
1215}
1216
1217XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1218{
1219 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1220 return result;
1221}
1222
1223XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1224{
1225 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1226 return result;
1227}
1228
1229XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1230{
1231 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1232 return result;
1233}
1234
1235XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1236{
1237 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
1238 return result;
1239}
1240
1241XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1242{
1243 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1244 return result;
1245}
1246
1247XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1248{
1249 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1250 return result;
1251}
1252
1253XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1254{
1255 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1256 return result;
1257}
1258
1259XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1260{
1261 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1262 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001263 char str[1024];
1264 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1265 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001266 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001267 PIPELINE_NODE *pTrav = pPipelineHead;
1268 if (pTrav) {
1269 while (pTrav->pNext)
1270 pTrav = pTrav->pNext;
1271 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1272 pTrav = pTrav->pNext;
1273 }
1274 else {
1275 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1276 pPipelineHead = pTrav;
1277 }
1278 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1279 pTrav->pipeline = *pPipeline;
1280 initPipeline(pTrav, pCreateInfo);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001281 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001282 return result;
1283}
1284
1285XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1286{
1287 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1288 return result;
1289}
1290
1291XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, XGL_SIZE* pDataSize, XGL_VOID* pData)
1292{
1293 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1294 return result;
1295}
1296
1297XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, XGL_SIZE dataSize, const XGL_VOID* pData, XGL_PIPELINE* pPipeline)
1298{
1299 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1300 return result;
1301}
1302
1303XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1304{
1305 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1306 return result;
1307}
1308
1309XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1310{
1311 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001312 pthread_mutex_lock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -07001313 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1314 pNewNode->sampler = *pSampler;
1315 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1316 pNewNode->pNext = pSamplerHead;
1317 pSamplerHead = pNewNode;
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001318 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001319 return result;
1320}
1321
1322XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSet(XGL_DEVICE device, const XGL_DESCRIPTOR_SET_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_SET* pDescriptorSet)
1323{
1324 XGL_RESULT result = nextTable.CreateDescriptorSet(device, pCreateInfo, pDescriptorSet);
1325 // Create LL chain
Tobin Ehlise79df942014-11-18 16:38:08 -07001326 char str[1024];
1327 sprintf(str, "Created Descriptor Set (DS) %p", (void*)*pDescriptorSet);
1328 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001329 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001330 DS_LL_HEAD *pTrav = pDSHead;
1331 if (pTrav) {
1332 // Grow existing list
1333 while (pTrav->pNextDS)
1334 pTrav = pTrav->pNextDS;
1335 pTrav->pNextDS = (DS_LL_HEAD*)malloc(sizeof(DS_LL_HEAD));
1336 pTrav = pTrav->pNextDS;
1337 }
1338 else { // Create new list
1339 pTrav = (DS_LL_HEAD*)malloc(sizeof(DS_LL_HEAD));
1340 pDSHead = pTrav;
1341 }
1342 pTrav->dsSlot = (DS_SLOT*)malloc(sizeof(DS_SLOT) * pCreateInfo->slots);
1343 pTrav->dsID = *pDescriptorSet;
1344 pTrav->numSlots = pCreateInfo->slots;
1345 pTrav->pNextDS = NULL;
1346 pTrav->updateActive = XGL_FALSE;
1347 initDS(pTrav);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001348 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001349 return result;
1350}
1351
1352XGL_LAYER_EXPORT XGL_VOID XGLAPI xglBeginDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1353{
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001354 DS_LL_HEAD* pDS = getDS(descriptorSet);
1355 if (!pDS) {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001356 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001357 char str[1024];
1358 sprintf(str, "Specified Descriptor Set %p does not exist!", (void*)descriptorSet);
1359 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001360 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001361 else {
1362 pDS->updateActive = XGL_TRUE;
1363 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001364 nextTable.BeginDescriptorSetUpdate(descriptorSet);
1365}
1366
1367XGL_LAYER_EXPORT XGL_VOID XGLAPI xglEndDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1368{
1369 if (!dsUpdate(descriptorSet)) {
1370 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001371 char str[1024];
1372 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglEndDescriptorSetUpdate()!", (void*)descriptorSet);
1373 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001374 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001375 else {
1376 DS_LL_HEAD* pDS = getDS(descriptorSet);
1377 if (!pDS) {
Tobin Ehlise79df942014-11-18 16:38:08 -07001378 char str[1024];
1379 sprintf(str, "Specified Descriptor Set %p does not exist!", (void*)descriptorSet);
1380 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001381 }
1382 else {
1383 pDS->updateActive = XGL_FALSE;
1384 }
1385 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001386 nextTable.EndDescriptorSetUpdate(descriptorSet);
1387}
1388
1389XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachSamplerDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_SAMPLER* pSamplers)
1390{
1391 if (!dsUpdate(descriptorSet)) {
1392 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001393 char str[1024];
1394 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1395 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_ATTACH_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001396 }
1397 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001398 if (!dsSamplerMapping(descriptorSet, startSlot, slotCount, pSamplers)) {
1399 char str[1024];
1400 sprintf(str, "Unable to attach sampler descriptors to DS %p!", (void*)descriptorSet);
1401 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_SAMPLE_ATTACH_FAILED, "DS", str);
1402 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001403 }
1404 nextTable.AttachSamplerDescriptors(descriptorSet, startSlot, slotCount, pSamplers);
1405}
1406
1407XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachImageViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews)
1408{
1409 if (!dsUpdate(descriptorSet)) {
1410 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001411 char str[1024];
1412 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1413 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_ATTACH_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001414 }
1415 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001416 if (!dsImageMapping(descriptorSet, startSlot, slotCount, pImageViews)) {
1417 char str[1024];
1418 sprintf(str, "Unable to attach image view descriptors to DS %p!", (void*)descriptorSet);
1419 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_IMAGE_ATTACH_FAILED, "DS", str);
1420 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001421 }
1422 nextTable.AttachImageViewDescriptors(descriptorSet, startSlot, slotCount, pImageViews);
1423}
1424
1425XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachMemoryViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemViews)
1426{
1427 if (!dsUpdate(descriptorSet)) {
1428 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001429 char str[1024];
1430 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1431 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_ATTACH_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001432 }
1433 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001434 if (!dsMemMapping(descriptorSet, startSlot, slotCount, pMemViews)) {
1435 char str[1024];
1436 sprintf(str, "Unable to attach memory view descriptors to DS %p!", (void*)descriptorSet);
1437 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_MEMORY_ATTACH_FAILED, "DS", str);
1438 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001439 }
1440 nextTable.AttachMemoryViewDescriptors(descriptorSet, startSlot, slotCount, pMemViews);
1441}
1442
1443XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachNestedDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_DESCRIPTOR_SET_ATTACH_INFO* pNestedDescriptorSets)
1444{
1445 if (!dsUpdate(descriptorSet)) {
1446 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001447 char str[1024];
1448 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1449 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_ATTACH_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001450 }
1451 nextTable.AttachNestedDescriptors(descriptorSet, startSlot, slotCount, pNestedDescriptorSets);
1452}
1453
1454// TODO : Does xglBeginDescriptorSetUpdate() have to be called before this function?
1455XGL_LAYER_EXPORT XGL_VOID XGLAPI xglClearDescriptorSetSlots(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount)
1456{
1457 if (!dsUpdate(descriptorSet)) {
1458 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001459 char str[1024];
1460 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglClearDescriptorSetSlots()!", (void*)descriptorSet);
1461 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_ATTACH_WITHOUT_BEGIN, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001462 }
1463 if (!clearDS(descriptorSet, startSlot, slotCount)) {
1464 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001465 char str[1024];
1466 sprintf(str, "Unable to perform xglClearDescriptorSetSlots(%p, %u, %u) call!", descriptorSet, startSlot, slotCount);
1467 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_CLEAR_DS_FAILED, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001468 }
1469 nextTable.ClearDescriptorSetSlots(descriptorSet, startSlot, slotCount);
1470}
1471
1472XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateViewportState(XGL_DEVICE device, const XGL_VIEWPORT_STATE_CREATE_INFO* pCreateInfo, XGL_VIEWPORT_STATE_OBJECT* pState)
1473{
1474 XGL_RESULT result = nextTable.CreateViewportState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001475 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001476 return result;
1477}
1478
1479XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRasterState(XGL_DEVICE device, const XGL_RASTER_STATE_CREATE_INFO* pCreateInfo, XGL_RASTER_STATE_OBJECT* pState)
1480{
1481 XGL_RESULT result = nextTable.CreateRasterState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001482 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001483 return result;
1484}
1485
1486XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateMsaaState(XGL_DEVICE device, const XGL_MSAA_STATE_CREATE_INFO* pCreateInfo, XGL_MSAA_STATE_OBJECT* pState)
1487{
1488 XGL_RESULT result = nextTable.CreateMsaaState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001489 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_MSAA);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001490 return result;
1491}
1492
1493XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorBlendState(XGL_DEVICE device, const XGL_COLOR_BLEND_STATE_CREATE_INFO* pCreateInfo, XGL_COLOR_BLEND_STATE_OBJECT* pState)
1494{
1495 XGL_RESULT result = nextTable.CreateColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001496 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001497 return result;
1498}
1499
1500XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilState(XGL_DEVICE device, const XGL_DEPTH_STENCIL_STATE_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_STATE_OBJECT* pState)
1501{
1502 XGL_RESULT result = nextTable.CreateDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001503 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001504 return result;
1505}
1506
1507XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1508{
1509 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1510 return result;
1511}
1512
1513XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_FLAGS flags)
1514{
1515 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, flags);
1516 return result;
1517}
1518
1519XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1520{
1521 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1522 return result;
1523}
1524
1525XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1526{
1527 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1528 return result;
1529}
1530
1531XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
1532{
1533 if (getPipeline(pipeline)) {
1534 lastBoundPipeline = pipeline;
1535 }
1536 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001537 char str[1024];
1538 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
1539 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001540 }
1541 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1542}
1543
1544XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
1545{
1546 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1547}
1548
1549XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_STATE_OBJECT state)
1550{
Tobin Ehlis56a61072014-11-21 08:58:46 -07001551 setLastBoundDynamicState(state, stateBindPoint);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001552 nextTable.CmdBindStateObject(cmdBuffer, stateBindPoint, state);
1553}
1554
1555XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT index, XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT slotOffset)
1556{
1557 if (getDS(descriptorSet)) {
Tobin Ehlisb8154982014-10-27 14:53:17 -06001558 assert(index < XGL_MAX_DESCRIPTOR_SETS);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001559 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001560 lastBoundDS[index] = descriptorSet;
Tobin Ehliseacc64f2014-11-24 17:09:09 -07001561 lastBoundSlotOffset[index] = slotOffset;
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001562 pthread_mutex_unlock(&globalLock);
Tobin Ehlise79df942014-11-18 16:38:08 -07001563 char str[1024];
1564 sprintf(str, "DS %p bound to DS index %u on pipeline %s", (void*)descriptorSet, index, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
1565 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001566 }
1567 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001568 char str[1024];
1569 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
1570 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001571 }
1572 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, index, descriptorSet, slotOffset);
1573}
1574
1575XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindDynamicMemoryView(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemView)
1576{
1577 nextTable.CmdBindDynamicMemoryView(cmdBuffer, pipelineBindPoint, pMemView);
1578}
1579
Chia-I Wu3b04af52014-11-08 10:48:20 +08001580XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindVertexData(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT binding)
1581{
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001582 lastVtxBinding = binding;
Chia-I Wu3b04af52014-11-08 10:48:20 +08001583 nextTable.CmdBindVertexData(cmdBuffer, mem, offset, binding);
1584}
1585
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001586XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindIndexData(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
1587{
1588 nextTable.CmdBindIndexData(cmdBuffer, mem, offset, indexType);
1589}
1590
1591XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindAttachments(XGL_CMD_BUFFER cmdBuffer, XGL_UINT colorAttachmentCount, const XGL_COLOR_ATTACHMENT_BIND_INFO* pColorAttachments, const XGL_DEPTH_STENCIL_BIND_INFO* pDepthStencilAttachment)
1592{
1593 nextTable.CmdBindAttachments(cmdBuffer, colorAttachmentCount, pColorAttachments, pDepthStencilAttachment);
1594}
1595
1596XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareMemoryRegions(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_MEMORY_STATE_TRANSITION* pStateTransitions)
1597{
1598 nextTable.CmdPrepareMemoryRegions(cmdBuffer, transitionCount, pStateTransitions);
1599}
1600
1601XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareImages(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_IMAGE_STATE_TRANSITION* pStateTransitions)
1602{
1603 nextTable.CmdPrepareImages(cmdBuffer, transitionCount, pStateTransitions);
1604}
1605
1606XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
1607{
Tobin Ehlise79df942014-11-18 16:38:08 -07001608 char str[1024];
1609 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", drawCount[DRAW]++);
1610 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001611 synchAndPrintDSConfig();
1612 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1613}
1614
1615XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount)
1616{
Tobin Ehlise79df942014-11-18 16:38:08 -07001617 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001618 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001619 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001620 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001621 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1622}
1623
1624XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1625{
Tobin Ehlise79df942014-11-18 16:38:08 -07001626 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001627 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001628 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001629 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001630 nextTable.CmdDrawIndirect(cmdBuffer, mem, offset, count, stride);
1631}
1632
1633XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1634{
Tobin Ehlise79df942014-11-18 16:38:08 -07001635 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001636 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001637 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001638 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001639 nextTable.CmdDrawIndexedIndirect(cmdBuffer, mem, offset, count, stride);
1640}
1641
1642XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, XGL_UINT x, XGL_UINT y, XGL_UINT z)
1643{
1644 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1645}
1646
1647XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1648{
1649 nextTable.CmdDispatchIndirect(cmdBuffer, mem, offset);
1650}
1651
1652XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY srcMem, XGL_GPU_MEMORY destMem, XGL_UINT regionCount, const XGL_MEMORY_COPY* pRegions)
1653{
1654 nextTable.CmdCopyMemory(cmdBuffer, srcMem, destMem, regionCount, pRegions);
1655}
1656
1657XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT regionCount, const XGL_IMAGE_COPY* pRegions)
1658{
1659 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1660}
1661
1662XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyMemoryToImage(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY srcMem, XGL_IMAGE destImage, XGL_UINT regionCount, const XGL_MEMORY_IMAGE_COPY* pRegions)
1663{
1664 nextTable.CmdCopyMemoryToImage(cmdBuffer, srcMem, destImage, regionCount, pRegions);
1665}
1666
1667XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyImageToMemory(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_GPU_MEMORY destMem, XGL_UINT regionCount, const XGL_MEMORY_IMAGE_COPY* pRegions)
1668{
1669 nextTable.CmdCopyImageToMemory(cmdBuffer, srcImage, destMem, regionCount, pRegions);
1670}
1671
1672XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_STATE srcImageState, XGL_IMAGE destImage, XGL_IMAGE_STATE destImageState)
1673{
1674 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageState, destImage, destImageState);
1675}
1676
1677XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdUpdateMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const XGL_UINT32* pData)
1678{
1679 nextTable.CmdUpdateMemory(cmdBuffer, destMem, destOffset, dataSize, pData);
1680}
1681
1682XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdFillMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, XGL_UINT32 data)
1683{
1684 nextTable.CmdFillMemory(cmdBuffer, destMem, destOffset, fillSize, data);
1685}
1686
1687XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const XGL_FLOAT color[4], XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1688{
1689 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1690}
1691
1692XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const XGL_UINT32 color[4], XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1693{
1694 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1695}
1696
1697XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, XGL_FLOAT depth, XGL_UINT32 stencil, XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1698{
1699 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1700}
1701
1702XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT rectCount, const XGL_IMAGE_RESOLVE* pRects)
1703{
1704 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1705}
1706
1707XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
1708{
1709 nextTable.CmdSetEvent(cmdBuffer, event);
1710}
1711
1712XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
1713{
1714 nextTable.CmdResetEvent(cmdBuffer, event);
1715}
1716
1717XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdMemoryAtomic(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_UINT64 srcData, XGL_ATOMIC_OP atomicOp)
1718{
1719 nextTable.CmdMemoryAtomic(cmdBuffer, destMem, destOffset, srcData, atomicOp);
1720}
1721
1722XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot, XGL_FLAGS flags)
1723{
1724 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1725}
1726
1727XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot)
1728{
1729 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1730}
1731
1732XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount)
1733{
1734 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1735}
1736
1737XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset)
1738{
1739 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destMem, destOffset);
1740}
1741
1742XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, const XGL_UINT32* pData)
1743{
1744 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1745}
1746
1747XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, XGL_GPU_MEMORY srcMem, XGL_GPU_SIZE srcOffset)
1748{
1749 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcMem, srcOffset);
1750}
1751
1752XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset)
1753{
1754 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destMem, destOffset);
1755}
1756
1757XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1758{
1759 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1760 return result;
1761}
1762
1763XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
1764{
Tobin Ehlise79df942014-11-18 16:38:08 -07001765 // This layer intercepts callbacks
1766 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1767 if (!pNewDbgFuncNode)
1768 return XGL_ERROR_OUT_OF_MEMORY;
1769 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1770 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001771 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1772 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001773 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1774 return result;
1775}
1776
1777XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1778{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001779 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07001780 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1781 while (pTrav) {
1782 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1783 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001784 if (g_pDbgFunctionHead == pTrav)
1785 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07001786 free(pTrav);
1787 break;
1788 }
1789 pPrev = pTrav;
1790 pTrav = pTrav->pNext;
1791 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001792 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1793 return result;
1794}
1795
1796XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, XGL_INT msgCode, XGL_DBG_MSG_FILTER filter)
1797{
1798 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
1799 return result;
1800}
1801
1802XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, XGL_SIZE tagSize, const XGL_VOID* pTag)
1803{
1804 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
1805 return result;
1806}
1807
1808XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
1809{
1810 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
1811 return result;
1812}
1813
1814XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
1815{
1816 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
1817 return result;
1818}
1819
1820XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const XGL_CHAR* pMarker)
1821{
1822 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
1823}
1824
1825XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
1826{
1827 nextTable.CmdDbgMarkerEnd(cmdBuffer);
1828}
1829
1830XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
1831{
1832 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001833 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001834 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001835 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001836 return result;
1837}
1838
Chia-I Wu6204f342014-11-07 13:33:45 +08001839XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, XGL_UINT64* pMsc)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001840{
Chia-I Wu6204f342014-11-07 13:33:45 +08001841 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001842 return result;
1843}
1844
1845XGL_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)
1846{
1847 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
1848 return result;
1849}
1850
1851XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
1852{
1853 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
1854 return result;
1855}
1856
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001857XGL_VOID drawStateDumpDotFile(char* outFileName)
1858{
1859 dumpDotFile(outFileName);
1860}
1861
Tobin Ehlis266473d2014-12-16 17:34:50 -07001862XGL_VOID drawStateDumpPngFile(char* outFileName)
1863{
1864 char dotExe[32] = "/usr/bin/dot";
1865 if( access(dotExe, X_OK) != -1) {
1866 dumpDotFile("/tmp/tmp.dot");
1867 char dotCmd[1024];
1868 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
1869 system(dotCmd);
1870 remove("/tmp/tmp.dot");
1871 }
1872 else {
1873 char str[1024];
1874 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
1875 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
1876 }
1877}
1878
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001879XGL_LAYER_EXPORT XGL_VOID* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* funcName)
1880{
1881 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08001882 void *addr;
1883
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001884 if (gpu == NULL)
1885 return NULL;
1886 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001887 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001888
Chia-I Wu706533e2015-01-05 13:18:57 +08001889 addr = layer_intercept_proc(funcName);
1890 if (addr)
1891 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08001892 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001893 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08001894 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07001895 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001896 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001897 if (gpuw->pGPA == NULL)
1898 return NULL;
1899 return gpuw->pGPA(gpuw->nextObject, funcName);
1900 }
1901}