blob: 4f936ce6828a75b0405467a95167fc18b6613093 [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;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -070046static XGL_LAYER_DBG_REPORT_LEVEL g_reportingLevel = XGL_DBG_LAYER_LEVEL_INFO;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070047static 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 }*/
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700669 sprintf(label, "SamplerAttachInfo Slot%u", j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700670 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;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700925 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700926 strOpt = getLayerOption("DrawStateReportLevel");
927 if (strOpt != NULL)
928 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700929
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700930 strOpt = getLayerOption("DrawStateDebugAction");
931 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700932 g_debugAction = atoi(strOpt);
933
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700934 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
935 {
936 strOpt = getLayerOption("DrawStateLogFilename");
937 if (strOpt)
938 {
939 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700940 }
941 if (g_logFile == NULL)
942 g_logFile = stdout;
943 }
944
945 // initialize Layer dispatch table
946 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600947 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600948 fpNextGPA = pCurObj->pGPA;
949 assert(fpNextGPA);
950
Chia-I Wu0f65b1e2015-01-04 23:11:43 +0800951 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
952
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600953 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600954 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600955}
956
957
958XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
959{
960 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600961 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700962 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600963 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600964 return result;
965}
966
967XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
968{
969 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600970 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700971 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600972 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600973 return result;
974}
975
976XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
977{
978 XGL_RESULT result = nextTable.DestroyDevice(device);
979 return result;
980}
981
982XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* pExtName)
983{
984 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600985 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700986 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600987 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600988 return result;
989}
990
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600991XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_SIZE* pOutLayerCount, XGL_CHAR* const* pOutLayers, XGL_VOID* pReserved)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600992{
Jon Ashburn451c16f2014-11-25 11:08:42 -0700993 if (gpu != NULL)
994 {
995 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
996 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -0700997 pthread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600998 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700999 return result;
1000 } else
1001 {
1002 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1003 return XGL_ERROR_INVALID_POINTER;
1004 // This layer compatible with all GPUs
1005 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001006 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001007 return XGL_SUCCESS;
1008 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001009}
1010
1011XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, XGL_UINT queueIndex, XGL_QUEUE* pQueue)
1012{
1013 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1014 return result;
1015}
1016
1017XGL_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)
1018{
1019 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1020 return result;
1021}
1022
1023XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs)
1024{
1025 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1026 return result;
1027}
1028
1029XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1030{
1031 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1032 return result;
1033}
1034
1035XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1036{
1037 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1038 return result;
1039}
1040
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1042{
1043 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1044 return result;
1045}
1046
1047XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1048{
1049 XGL_RESULT result = nextTable.FreeMemory(mem);
1050 return result;
1051}
1052
1053XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1054{
1055 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1056 return result;
1057}
1058
1059XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, XGL_VOID** ppData)
1060{
1061 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1062 return result;
1063}
1064
1065XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1066{
1067 XGL_RESULT result = nextTable.UnmapMemory(mem);
1068 return result;
1069}
1070
1071XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const XGL_VOID* pSysMem, XGL_SIZE memSize, XGL_GPU_MEMORY* pMem)
1072{
1073 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1074 return result;
1075}
1076
1077XGL_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)
1078{
1079 XGL_RESULT result = nextTable.RemapVirtualMemoryPages(device, rangeCount, pRanges, preWaitSemaphoreCount, pPreWaitSemaphores, postSignalSemaphoreCount, pPostSignalSemaphores);
1080 return result;
1081}
1082
1083XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1084{
1085 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001086 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001087 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001088 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001089 return result;
1090}
1091
1092XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1093{
1094 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1095 return result;
1096}
1097
1098XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1099{
1100 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1101 return result;
1102}
1103
1104XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1105{
1106 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1107 return result;
1108}
1109
1110XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1111{
1112 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1113 return result;
1114}
1115
1116XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1117{
1118 XGL_RESULT result = nextTable.DestroyObject(object);
1119 return result;
1120}
1121
1122XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1123{
1124 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1125 return result;
1126}
1127
1128XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1129{
1130 XGL_RESULT result = nextTable.BindObjectMemory(object, mem, offset);
1131 return result;
1132}
1133
1134XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1135{
1136 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1137 return result;
1138}
1139
1140XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1141{
1142 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1143 return result;
1144}
1145
1146XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, XGL_UINT fenceCount, const XGL_FENCE* pFences, XGL_BOOL waitAll, XGL_UINT64 timeout)
1147{
1148 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1149 return result;
1150}
1151
1152XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1153{
1154 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1155 return result;
1156}
1157
1158XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1159{
1160 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1161 return result;
1162}
1163
1164XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1165{
1166 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1167 return result;
1168}
1169
1170XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1171{
1172 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1173 return result;
1174}
1175
1176XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1177{
1178 XGL_RESULT result = nextTable.GetEventStatus(event);
1179 return result;
1180}
1181
1182XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1183{
1184 XGL_RESULT result = nextTable.SetEvent(event);
1185 return result;
1186}
1187
1188XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1189{
1190 XGL_RESULT result = nextTable.ResetEvent(event);
1191 return result;
1192}
1193
1194XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1195{
1196 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1197 return result;
1198}
1199
1200XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount, XGL_SIZE* pDataSize, XGL_VOID* pData)
1201{
1202 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1203 return result;
1204}
1205
1206XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1207{
1208 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1209 return result;
1210}
1211
1212XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1213{
1214 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1215 return result;
1216}
1217
1218XGL_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)
1219{
1220 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1221 return result;
1222}
1223
1224XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1225{
1226 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
1227 return result;
1228}
1229
1230XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1231{
1232 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1233 return result;
1234}
1235
1236XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1237{
1238 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1239 return result;
1240}
1241
1242XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1243{
1244 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1245 return result;
1246}
1247
1248XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1249{
1250 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1251 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001252 char str[1024];
1253 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1254 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001255 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001256 PIPELINE_NODE *pTrav = pPipelineHead;
1257 if (pTrav) {
1258 while (pTrav->pNext)
1259 pTrav = pTrav->pNext;
1260 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1261 pTrav = pTrav->pNext;
1262 }
1263 else {
1264 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1265 pPipelineHead = pTrav;
1266 }
1267 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1268 pTrav->pipeline = *pPipeline;
1269 initPipeline(pTrav, pCreateInfo);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001270 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001271 return result;
1272}
1273
1274XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1275{
1276 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1277 return result;
1278}
1279
1280XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, XGL_SIZE* pDataSize, XGL_VOID* pData)
1281{
1282 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1283 return result;
1284}
1285
1286XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, XGL_SIZE dataSize, const XGL_VOID* pData, XGL_PIPELINE* pPipeline)
1287{
1288 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1289 return result;
1290}
1291
1292XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1293{
1294 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1295 return result;
1296}
1297
1298XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1299{
1300 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001301 pthread_mutex_lock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -07001302 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1303 pNewNode->sampler = *pSampler;
1304 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1305 pNewNode->pNext = pSamplerHead;
1306 pSamplerHead = pNewNode;
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001307 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001308 return result;
1309}
1310
1311XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSet(XGL_DEVICE device, const XGL_DESCRIPTOR_SET_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_SET* pDescriptorSet)
1312{
1313 XGL_RESULT result = nextTable.CreateDescriptorSet(device, pCreateInfo, pDescriptorSet);
1314 // Create LL chain
Tobin Ehlise79df942014-11-18 16:38:08 -07001315 char str[1024];
1316 sprintf(str, "Created Descriptor Set (DS) %p", (void*)*pDescriptorSet);
1317 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001318 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001319 DS_LL_HEAD *pTrav = pDSHead;
1320 if (pTrav) {
1321 // Grow existing list
1322 while (pTrav->pNextDS)
1323 pTrav = pTrav->pNextDS;
1324 pTrav->pNextDS = (DS_LL_HEAD*)malloc(sizeof(DS_LL_HEAD));
1325 pTrav = pTrav->pNextDS;
1326 }
1327 else { // Create new list
1328 pTrav = (DS_LL_HEAD*)malloc(sizeof(DS_LL_HEAD));
1329 pDSHead = pTrav;
1330 }
1331 pTrav->dsSlot = (DS_SLOT*)malloc(sizeof(DS_SLOT) * pCreateInfo->slots);
1332 pTrav->dsID = *pDescriptorSet;
1333 pTrav->numSlots = pCreateInfo->slots;
1334 pTrav->pNextDS = NULL;
1335 pTrav->updateActive = XGL_FALSE;
1336 initDS(pTrav);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001337 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001338 return result;
1339}
1340
1341XGL_LAYER_EXPORT XGL_VOID XGLAPI xglBeginDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1342{
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001343 DS_LL_HEAD* pDS = getDS(descriptorSet);
1344 if (!pDS) {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001345 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001346 char str[1024];
1347 sprintf(str, "Specified Descriptor Set %p does not exist!", (void*)descriptorSet);
1348 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001349 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001350 else {
1351 pDS->updateActive = XGL_TRUE;
1352 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001353 nextTable.BeginDescriptorSetUpdate(descriptorSet);
1354}
1355
1356XGL_LAYER_EXPORT XGL_VOID XGLAPI xglEndDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1357{
1358 if (!dsUpdate(descriptorSet)) {
1359 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001360 char str[1024];
1361 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglEndDescriptorSetUpdate()!", (void*)descriptorSet);
1362 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 -06001363 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001364 else {
1365 DS_LL_HEAD* pDS = getDS(descriptorSet);
1366 if (!pDS) {
Tobin Ehlise79df942014-11-18 16:38:08 -07001367 char str[1024];
1368 sprintf(str, "Specified Descriptor Set %p does not exist!", (void*)descriptorSet);
1369 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis0f051a52014-10-24 13:03:56 -06001370 }
1371 else {
1372 pDS->updateActive = XGL_FALSE;
1373 }
1374 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001375 nextTable.EndDescriptorSetUpdate(descriptorSet);
1376}
1377
1378XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachSamplerDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_SAMPLER* pSamplers)
1379{
1380 if (!dsUpdate(descriptorSet)) {
1381 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001382 char str[1024];
1383 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1384 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 -06001385 }
1386 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001387 if (!dsSamplerMapping(descriptorSet, startSlot, slotCount, pSamplers)) {
1388 char str[1024];
1389 sprintf(str, "Unable to attach sampler descriptors to DS %p!", (void*)descriptorSet);
1390 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_SAMPLE_ATTACH_FAILED, "DS", str);
1391 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001392 }
1393 nextTable.AttachSamplerDescriptors(descriptorSet, startSlot, slotCount, pSamplers);
1394}
1395
1396XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachImageViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews)
1397{
1398 if (!dsUpdate(descriptorSet)) {
1399 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001400 char str[1024];
1401 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1402 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 -06001403 }
1404 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001405 if (!dsImageMapping(descriptorSet, startSlot, slotCount, pImageViews)) {
1406 char str[1024];
1407 sprintf(str, "Unable to attach image view descriptors to DS %p!", (void*)descriptorSet);
1408 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_IMAGE_ATTACH_FAILED, "DS", str);
1409 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001410 }
1411 nextTable.AttachImageViewDescriptors(descriptorSet, startSlot, slotCount, pImageViews);
1412}
1413
1414XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachMemoryViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemViews)
1415{
1416 if (!dsUpdate(descriptorSet)) {
1417 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001418 char str[1024];
1419 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1420 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 -06001421 }
1422 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001423 if (!dsMemMapping(descriptorSet, startSlot, slotCount, pMemViews)) {
1424 char str[1024];
1425 sprintf(str, "Unable to attach memory view descriptors to DS %p!", (void*)descriptorSet);
1426 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_DS_MEMORY_ATTACH_FAILED, "DS", str);
1427 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001428 }
1429 nextTable.AttachMemoryViewDescriptors(descriptorSet, startSlot, slotCount, pMemViews);
1430}
1431
1432XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachNestedDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_DESCRIPTOR_SET_ATTACH_INFO* pNestedDescriptorSets)
1433{
1434 if (!dsUpdate(descriptorSet)) {
1435 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001436 char str[1024];
1437 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglAttachSamplerDescriptors()!", (void*)descriptorSet);
1438 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 -06001439 }
1440 nextTable.AttachNestedDescriptors(descriptorSet, startSlot, slotCount, pNestedDescriptorSets);
1441}
1442
1443// TODO : Does xglBeginDescriptorSetUpdate() have to be called before this function?
1444XGL_LAYER_EXPORT XGL_VOID XGLAPI xglClearDescriptorSetSlots(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount)
1445{
1446 if (!dsUpdate(descriptorSet)) {
1447 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001448 char str[1024];
1449 sprintf(str, "You must call xglBeginDescriptorSetUpdate(%p) before this call to xglClearDescriptorSetSlots()!", (void*)descriptorSet);
1450 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 -06001451 }
1452 if (!clearDS(descriptorSet, startSlot, slotCount)) {
1453 // TODO : This is where we should flag a REAL error
Tobin Ehlise79df942014-11-18 16:38:08 -07001454 char str[1024];
1455 sprintf(str, "Unable to perform xglClearDescriptorSetSlots(%p, %u, %u) call!", descriptorSet, startSlot, slotCount);
1456 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_CLEAR_DS_FAILED, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001457 }
1458 nextTable.ClearDescriptorSetSlots(descriptorSet, startSlot, slotCount);
1459}
1460
1461XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateViewportState(XGL_DEVICE device, const XGL_VIEWPORT_STATE_CREATE_INFO* pCreateInfo, XGL_VIEWPORT_STATE_OBJECT* pState)
1462{
1463 XGL_RESULT result = nextTable.CreateViewportState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001464 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001465 return result;
1466}
1467
1468XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRasterState(XGL_DEVICE device, const XGL_RASTER_STATE_CREATE_INFO* pCreateInfo, XGL_RASTER_STATE_OBJECT* pState)
1469{
1470 XGL_RESULT result = nextTable.CreateRasterState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001471 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001472 return result;
1473}
1474
1475XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateMsaaState(XGL_DEVICE device, const XGL_MSAA_STATE_CREATE_INFO* pCreateInfo, XGL_MSAA_STATE_OBJECT* pState)
1476{
1477 XGL_RESULT result = nextTable.CreateMsaaState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001478 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_MSAA);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001479 return result;
1480}
1481
1482XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorBlendState(XGL_DEVICE device, const XGL_COLOR_BLEND_STATE_CREATE_INFO* pCreateInfo, XGL_COLOR_BLEND_STATE_OBJECT* pState)
1483{
1484 XGL_RESULT result = nextTable.CreateColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001485 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001486 return result;
1487}
1488
1489XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilState(XGL_DEVICE device, const XGL_DEPTH_STENCIL_STATE_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_STATE_OBJECT* pState)
1490{
1491 XGL_RESULT result = nextTable.CreateDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis56a61072014-11-21 08:58:46 -07001492 insertDynamicState(*pState, (PIPELINE_LL_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001493 return result;
1494}
1495
1496XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1497{
1498 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1499 return result;
1500}
1501
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001502XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001503{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001504 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001505 return result;
1506}
1507
1508XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1509{
1510 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1511 return result;
1512}
1513
1514XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1515{
1516 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1517 return result;
1518}
1519
1520XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
1521{
1522 if (getPipeline(pipeline)) {
1523 lastBoundPipeline = pipeline;
1524 }
1525 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001526 char str[1024];
1527 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
1528 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001529 }
1530 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1531}
1532
1533XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
1534{
1535 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1536}
1537
1538XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_STATE_OBJECT state)
1539{
Tobin Ehlis56a61072014-11-21 08:58:46 -07001540 setLastBoundDynamicState(state, stateBindPoint);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001541 nextTable.CmdBindStateObject(cmdBuffer, stateBindPoint, state);
1542}
1543
1544XGL_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)
1545{
1546 if (getDS(descriptorSet)) {
Tobin Ehlisb8154982014-10-27 14:53:17 -06001547 assert(index < XGL_MAX_DESCRIPTOR_SETS);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001548 if (dsUpdate(descriptorSet)) {
1549 char str[1024];
1550 sprintf(str, "You must call xglEndDescriptorSetUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
1551 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
1552 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001553 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001554 lastBoundDS[index] = descriptorSet;
Tobin Ehliseacc64f2014-11-24 17:09:09 -07001555 lastBoundSlotOffset[index] = slotOffset;
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001556 pthread_mutex_unlock(&globalLock);
Tobin Ehlise79df942014-11-18 16:38:08 -07001557 char str[1024];
1558 sprintf(str, "DS %p bound to DS index %u on pipeline %s", (void*)descriptorSet, index, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
1559 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001560 }
1561 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001562 char str[1024];
1563 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
1564 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001565 }
1566 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, index, descriptorSet, slotOffset);
1567}
1568
1569XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindDynamicMemoryView(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemView)
1570{
1571 nextTable.CmdBindDynamicMemoryView(cmdBuffer, pipelineBindPoint, pMemView);
1572}
1573
Chia-I Wu3b04af52014-11-08 10:48:20 +08001574XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindVertexData(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT binding)
1575{
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001576 lastVtxBinding = binding;
Chia-I Wu3b04af52014-11-08 10:48:20 +08001577 nextTable.CmdBindVertexData(cmdBuffer, mem, offset, binding);
1578}
1579
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001580XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindIndexData(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
1581{
1582 nextTable.CmdBindIndexData(cmdBuffer, mem, offset, indexType);
1583}
1584
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001585XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareMemoryRegions(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_MEMORY_STATE_TRANSITION* pStateTransitions)
1586{
1587 nextTable.CmdPrepareMemoryRegions(cmdBuffer, transitionCount, pStateTransitions);
1588}
1589
1590XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareImages(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_IMAGE_STATE_TRANSITION* pStateTransitions)
1591{
1592 nextTable.CmdPrepareImages(cmdBuffer, transitionCount, pStateTransitions);
1593}
1594
1595XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
1596{
Tobin Ehlise79df942014-11-18 16:38:08 -07001597 char str[1024];
1598 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", drawCount[DRAW]++);
1599 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001600 synchAndPrintDSConfig();
1601 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1602}
1603
1604XGL_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)
1605{
Tobin Ehlise79df942014-11-18 16:38:08 -07001606 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001607 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001608 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001609 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001610 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1611}
1612
1613XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1614{
Tobin Ehlise79df942014-11-18 16:38:08 -07001615 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001616 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001617 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001618 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001619 nextTable.CmdDrawIndirect(cmdBuffer, mem, offset, count, stride);
1620}
1621
1622XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1623{
Tobin Ehlise79df942014-11-18 16:38:08 -07001624 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001625 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001626 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001627 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001628 nextTable.CmdDrawIndexedIndirect(cmdBuffer, mem, offset, count, stride);
1629}
1630
1631XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, XGL_UINT x, XGL_UINT y, XGL_UINT z)
1632{
1633 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1634}
1635
1636XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1637{
1638 nextTable.CmdDispatchIndirect(cmdBuffer, mem, offset);
1639}
1640
1641XGL_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)
1642{
1643 nextTable.CmdCopyMemory(cmdBuffer, srcMem, destMem, regionCount, pRegions);
1644}
1645
1646XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT regionCount, const XGL_IMAGE_COPY* pRegions)
1647{
1648 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1649}
1650
1651XGL_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)
1652{
1653 nextTable.CmdCopyMemoryToImage(cmdBuffer, srcMem, destImage, regionCount, pRegions);
1654}
1655
1656XGL_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)
1657{
1658 nextTable.CmdCopyImageToMemory(cmdBuffer, srcImage, destMem, regionCount, pRegions);
1659}
1660
Mike Stroyan55658c22014-12-04 11:08:39 +00001661XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001662{
Mike Stroyan55658c22014-12-04 11:08:39 +00001663 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001664}
1665
1666XGL_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)
1667{
1668 nextTable.CmdUpdateMemory(cmdBuffer, destMem, destOffset, dataSize, pData);
1669}
1670
1671XGL_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)
1672{
1673 nextTable.CmdFillMemory(cmdBuffer, destMem, destOffset, fillSize, data);
1674}
1675
1676XGL_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)
1677{
1678 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1679}
1680
1681XGL_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)
1682{
1683 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1684}
1685
1686XGL_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)
1687{
1688 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1689}
1690
1691XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT rectCount, const XGL_IMAGE_RESOLVE* pRects)
1692{
1693 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1694}
1695
Mike Stroyan55658c22014-12-04 11:08:39 +00001696XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001697{
Mike Stroyan55658c22014-12-04 11:08:39 +00001698 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001699}
1700
1701XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
1702{
1703 nextTable.CmdResetEvent(cmdBuffer, event);
1704}
1705
Mike Stroyan55658c22014-12-04 11:08:39 +00001706XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
1707{
1708 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1709}
1710
1711XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPipelineBarrier( XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
1712{
1713 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1714}
1715
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001716XGL_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)
1717{
1718 nextTable.CmdMemoryAtomic(cmdBuffer, destMem, destOffset, srcData, atomicOp);
1719}
1720
1721XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot, XGL_FLAGS flags)
1722{
1723 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1724}
1725
1726XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot)
1727{
1728 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1729}
1730
1731XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount)
1732{
1733 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1734}
1735
1736XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset)
1737{
1738 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destMem, destOffset);
1739}
1740
1741XGL_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)
1742{
1743 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1744}
1745
1746XGL_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)
1747{
1748 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcMem, srcOffset);
1749}
1750
1751XGL_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)
1752{
1753 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destMem, destOffset);
1754}
1755
1756XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1757{
1758 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1759 return result;
1760}
1761
1762XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
1763{
Tobin Ehlise79df942014-11-18 16:38:08 -07001764 // This layer intercepts callbacks
1765 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1766 if (!pNewDbgFuncNode)
1767 return XGL_ERROR_OUT_OF_MEMORY;
1768 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1769 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001770 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1771 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001772 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1773 return result;
1774}
1775
1776XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1777{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001778 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07001779 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1780 while (pTrav) {
1781 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1782 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001783 if (g_pDbgFunctionHead == pTrav)
1784 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07001785 free(pTrav);
1786 break;
1787 }
1788 pPrev = pTrav;
1789 pTrav = pTrav->pNext;
1790 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001791 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1792 return result;
1793}
1794
1795XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, XGL_INT msgCode, XGL_DBG_MSG_FILTER filter)
1796{
1797 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
1798 return result;
1799}
1800
1801XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, XGL_SIZE tagSize, const XGL_VOID* pTag)
1802{
1803 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
1804 return result;
1805}
1806
1807XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
1808{
1809 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
1810 return result;
1811}
1812
1813XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
1814{
1815 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
1816 return result;
1817}
1818
1819XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const XGL_CHAR* pMarker)
1820{
1821 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
1822}
1823
1824XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
1825{
1826 nextTable.CmdDbgMarkerEnd(cmdBuffer);
1827}
1828
1829XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
1830{
1831 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001832 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001833 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001834 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001835 return result;
1836}
1837
Chia-I Wu6204f342014-11-07 13:33:45 +08001838XGL_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 -06001839{
Chia-I Wu6204f342014-11-07 13:33:45 +08001840 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001841 return result;
1842}
1843
1844XGL_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)
1845{
1846 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
1847 return result;
1848}
1849
1850XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
1851{
1852 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
1853 return result;
1854}
1855
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001856XGL_VOID drawStateDumpDotFile(char* outFileName)
1857{
1858 dumpDotFile(outFileName);
1859}
1860
Tobin Ehlis266473d2014-12-16 17:34:50 -07001861XGL_VOID drawStateDumpPngFile(char* outFileName)
1862{
1863 char dotExe[32] = "/usr/bin/dot";
1864 if( access(dotExe, X_OK) != -1) {
1865 dumpDotFile("/tmp/tmp.dot");
1866 char dotCmd[1024];
1867 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
1868 system(dotCmd);
1869 remove("/tmp/tmp.dot");
1870 }
1871 else {
1872 char str[1024];
1873 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
1874 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
1875 }
1876}
1877
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001878XGL_LAYER_EXPORT XGL_VOID* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* funcName)
1879{
1880 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08001881 void *addr;
1882
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001883 if (gpu == NULL)
1884 return NULL;
1885 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001886 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001887
Chia-I Wu706533e2015-01-05 13:18:57 +08001888 addr = layer_intercept_proc(funcName);
1889 if (addr)
1890 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08001891 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001892 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08001893 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07001894 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001895 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001896 if (gpuw->pGPA == NULL)
1897 return NULL;
1898 return gpuw->pGPA(gpuw->nextObject, funcName);
1899 }
1900}