blob: 53e3c461d1d0c53b8db0c8c7cd8c61786ec4ae73 [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
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060052static void layerCbMsg(XGL_DBG_MSG_TYPE msgType,
Tobin Ehlise79df942014-11-18 16:38:08 -070053 XGL_VALIDATION_LEVEL validationLevel,
54 XGL_BASE_OBJECT srcObject,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060055 size_t location,
56 int32_t 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
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600111static size_t sTypeStructSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis26092022014-11-20 09:49:17 -0700112{
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);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700125 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
126 return sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700127 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
128 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700129 case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
130 return sizeof(XGL_EVENT_WAIT_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700131 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);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700143 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
144 return sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
145 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
146 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
147 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
148 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
149 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
150 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
151 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
152 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700153 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);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600159 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700160 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600161 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700162 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);
Tobin Ehlis26092022014-11-20 09:49:17 -0700169 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
170 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700171 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
172 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700173 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
174 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700175 case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
176 return sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700177 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
178 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
179 case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
180 return sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700181 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
182 return sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700183 case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
184 return sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
185 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
186 return sizeof(XGL_IMAGE_CREATE_INFO);
187 case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
188 return sizeof(XGL_BUFFER_CREATE_INFO);
189 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
190 return sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
191 case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
192 return sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
193 case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
194 return sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
195 case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
196 return sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
197 case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
198 return sizeof(XGL_RENDER_PASS_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700199 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
200 return sizeof(XGL_LAYER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700201 case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
202 return sizeof(XGL_PIPELINE_BARRIER);
203 case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
204 return sizeof(XGL_MEMORY_BARRIER);
205 case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
206 return sizeof(XGL_BUFFER_MEMORY_BARRIER);
207 case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
208 return sizeof(XGL_IMAGE_MEMORY_BARRIER);
209 case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
210 return sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
211 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
212 return sizeof(XGL_UPDATE_SAMPLERS);
213 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
214 return sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
215 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
216 return sizeof(XGL_UPDATE_IMAGES);
217 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
218 return sizeof(XGL_UPDATE_BUFFERS);
219 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
220 return sizeof(XGL_UPDATE_AS_COPY);
221 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
222 return sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
223 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
224 return sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700225 default:
226 return 0;
227 }
228}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700229// Return the size of the underlying struct based on sType
230static size_t dynStateCreateInfoSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700231{
232 switch (sType)
233 {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700234 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
235 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
236 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
237 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
238 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
239 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
240 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
241 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700242 default:
243 return 0;
244 }
245}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600246// Block of code at start here for managing/tracking Pipeline state that this layer cares about
247// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700248#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600249#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600250
251static uint64_t drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
252
Tobin Ehlis56a61072014-11-21 08:58:46 -0700253// 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 -0700254// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
255// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700256static PIPELINE_NODE* g_pPipelineHead = NULL;
257static SAMPLER_NODE* g_pSamplerHead = NULL;
258static IMAGE_NODE* g_pImageHead = NULL;
259static BUFFER_NODE* g_pBufferHead = NULL;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600260static XGL_PIPELINE lastBoundPipeline = NULL;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700261#define MAX_BINDING 0xFFFFFFFF
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600262static uint32_t lastVtxBinding = MAX_BINDING;
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700263static uint32_t lastIdxBinding = MAX_BINDING;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600264
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700265static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
266static DYNAMIC_STATE_NODE* g_pLastBoundDynamicState[XGL_NUM_STATE_BIND_POINT] = {0};
Tobin Ehlis56a61072014-11-21 08:58:46 -0700267
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700268static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700269{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700270 pthread_mutex_lock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700271 // Insert new node at head of appropriate LL
272 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700273 pStateNode->pNext = g_pDynamicStateHead[bindPoint];
274 g_pDynamicStateHead[bindPoint] = pStateNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700275 pStateNode->stateObj = state;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700276 pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700277 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700278 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700279}
280// Set the last bound dynamic state of given type
281// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700282static void setLastBoundDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700283{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700284 pthread_mutex_lock(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700285 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
Tobin Ehlis56a61072014-11-21 08:58:46 -0700286 while (pTrav && (state != pTrav->stateObj)) {
287 pTrav = pTrav->pNext;
288 }
289 if (!pTrav) {
290 char str[1024];
291 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
292 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
293 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700294 g_pLastBoundDynamicState[sType] = pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700295 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700296}
297// Print the last bound dynamic state
298static void printDynamicState()
299{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700300 pthread_mutex_lock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700301 char str[1024];
302 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700303 if (g_pLastBoundDynamicState[i]) {
304 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), g_pLastBoundDynamicState[i]->stateObj);
305 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, g_pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
306 switch (g_pLastBoundDynamicState[i]->pCreateInfo->sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700307 {
308 case XGL_STATE_BIND_VIEWPORT:
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700309 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, g_pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", xgl_print_xgl_dynamic_vp_state_create_info((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)g_pLastBoundDynamicState[i]->pCreateInfo, " "));
Tobin Ehlis56a61072014-11-21 08:58:46 -0700310 break;
311 default:
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700312 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, g_pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(g_pLastBoundDynamicState[i]->pCreateInfo, " "));
Tobin Ehlis56a61072014-11-21 08:58:46 -0700313 break;
314 }
315 }
316 else {
317 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
318 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
319 }
320 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700321 pthread_mutex_unlock(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700322}
323// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600324static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
325{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700326 pthread_mutex_lock(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700327 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600328 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700329 if (pTrav->pipeline == pipeline) {
330 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600331 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700332 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600333 pTrav = pTrav->pNext;
334 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700335 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600336 return NULL;
337}
338
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700339// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
340static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
341{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700342 pthread_mutex_lock(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700343 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700344 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700345 if (sampler == pTrav->sampler) {
346 pthread_mutex_unlock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700347 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700348 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700349 pTrav = pTrav->pNext;
350 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700351 pthread_mutex_unlock(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700352 return NULL;
353}
354
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600355// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700356// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600357static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
358{
Tobin Ehlis26092022014-11-20 09:49:17 -0700359 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700360 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis26092022014-11-20 09:49:17 -0700361 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700362 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
363 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600364 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700365 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700366 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis26092022014-11-20 09:49:17 -0700367 // Typically pNext is const so have to cast to avoid warning when we modify it here
368 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700369 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
370 // Special copy of Vtx info as it has embedded array
371 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700372 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav;
373 pPipeline->vtxBindingCount = pVICI->bindingCount;
374 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
375 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
376 memcpy(pPipeline->pVertexBindingDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
377 pPipeline->vtxAttributeCount = pVICI->attributeCount;
378 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
379 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
380 memcpy(pPipeline->pVertexAttributeDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
381 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700382 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600383 }
384}
385
386// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600387
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700388// ptr to HEAD of LL of DS Regions
389static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700390// ptr to HEAD of LL of top-level Layouts
391static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700392// Last DS that was bound, and slotOffset for the binding
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700393static XGL_DESCRIPTOR_SET g_lastBoundDS = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700394static uint32_t lastBoundSlotOffset = 0;
395
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700396// Return Region node ptr for specified region or else NULL
397static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
398{
399 pthread_mutex_lock(&globalLock);
400 REGION_NODE* pTrav = g_pRegionHead;
401 while (pTrav) {
402 if (pTrav->region == region) {
403 pthread_mutex_unlock(&globalLock);
404 return pTrav;
405 }
406 pTrav = pTrav->pNext;
407 }
408 pthread_mutex_unlock(&globalLock);
409 return NULL;
410}
411
412// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700413static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700414{
415 pthread_mutex_lock(&globalLock);
416 REGION_NODE* pTrav = g_pRegionHead;
417 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700418 SET_NODE* pSet = pTrav->pSets;
419 while (pSet) {
420 if (pSet->set == set) {
421 pthread_mutex_unlock(&globalLock);
422 return pSet;
423 }
424 pSet = pSet->pNext;
425 }
426 pTrav = pTrav->pNext;
427 }
428 pthread_mutex_unlock(&globalLock);
429 return NULL;
430}
431
432static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
433 pthread_mutex_lock(&globalLock);
434 LAYOUT_NODE* pTrav = g_pLayoutHead;
435 while (pTrav) {
436 if (pTrav->layout == layout) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700437 pthread_mutex_unlock(&globalLock);
438 return pTrav;
439 }
440 pTrav = pTrav->pNext;
441 }
442 pthread_mutex_unlock(&globalLock);
443 return NULL;
444}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600445
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700446static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
447{
448 switch (pUpdateStruct->sType)
449 {
450 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
451 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
452 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
453 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
454 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
455 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
456 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
457 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
458 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
459 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
460 default:
461 // TODO : Flag specific error for this case
462 return 0;
463 }
464}
465
466static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
467{
468 switch (pUpdateStruct->sType)
469 {
470 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
471 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index);
472 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
473 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index);
474 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
475 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index);
476 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
477 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index);
478 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
479 // TODO : Need to understand this case better and make sure code is correct
480 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex);
481 default:
482 // TODO : Flag specific error for this case
483 return 0;
484 }
485}
486
487// Verify that the descriptor type in the update struct matches what's expected by the layout
488static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, XGL_DESCRIPTOR_TYPE type)
489{
490 // First get actual type of update
491 XGL_DESCRIPTOR_TYPE actualType;
492 switch (pUpdateStruct->sType)
493 {
494 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
495 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
496 break;
497 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
498 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
499 break;
500 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
501 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
502 break;
503 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
504 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
505 break;
506 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
507 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
508 break;
509 default:
510 // TODO : Flag specific error for this case
511 return 0;
512 }
513 if (actualType == type)
514 return 1;
515 return 0;
516}
517
518// Verify that update region for this update does not exceed max layout index for this type
519static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
520{
521 if (getUpdateUpperBound(pUpdateStruct) > layoutIdx)
522 return 0;
523 return 1;
524}
525
526// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
527// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
528static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
529{
530 GENERIC_HEADER* pNewNode = NULL;
531 uint32_t array_size = 0;
532 switch (pUpdate->sType)
533 {
534 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
535 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
536 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
537 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
538 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
539 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
540 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
541 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
542 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
543 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
544 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
545 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
546 memcpy((XGL_SAMPLER_IMAGE_VIEW_INFO*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i], &((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i], sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO));
547 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
548 memcpy((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i].pImageView, ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
549 }
550 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
551 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
552 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
553 array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
554 ((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO*)malloc(array_size);
555 memcpy((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews, ((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews, array_size);
556 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
557 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
558 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
559 array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * ((XGL_UPDATE_BUFFERS*)pNewNode)->count;
560 ((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO*)malloc(array_size);
561 memcpy((XGL_BUFFER_VIEW_ATTACH_INFO*)((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews, ((XGL_UPDATE_BUFFERS*)pUpdate)->pBufferViews, array_size);
562 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
563 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
564 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
565 default:
566 // TODO : Flag specific error for this case
567 return NULL;
568 }
569 // Make sure that pNext for the shadow copy is NULL
570 pNewNode->pNext = NULL;
571 return pNewNode;
572}
573// For given ds, update it's mapping based on pUpdateChain linked-list
574static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
575{
576 SET_NODE* pSet = getSetNode(ds);
577 LAYOUT_NODE* pLayout = pSet->pLayouts;
578 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pCIList = NULL;
579 uint32_t layoutIdx = pCIList->count;
580 GENERIC_HEADER* pUpdates = pUpdateChain;
581 // Perform all updates
582 while (pUpdates) {
583 pCIList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
584 // For each update first find the layout section that it overlaps
585 while (layoutIdx < getUpdateIndex(pUpdates)) {
586 pCIList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCIList->pNext;
587 layoutIdx += pCIList->count;
588 }
589 // Now verify that update is of the right type
590 if (!validateUpdateType(pUpdates, pCIList->descriptorType)) {
591 char str[1024];
592 sprintf(str, "Descriptor update type of %s does not match overlapping layout type of %s!", string_XGL_STRUCTURE_TYPE(pUpdates->sType), string_XGL_DESCRIPTOR_TYPE(pCIList->descriptorType));
593 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
594 }
595 else { // TODO : should we skip update on a type mismatch or force it?
596 // Next verify that update is correct size
597 if (!validateUpdateSize(pUpdates, layoutIdx)) {
598 char str[1024];
599 sprintf(str, "Descriptor update type of %s is out of bounds for matching layout w/ CI:\n%s!", string_XGL_STRUCTURE_TYPE(pUpdates->sType), xgl_print_xgl_descriptor_set_layout_create_info(pCIList, "{DS} "));
600 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
601 }
602 else {
603 // Finally perform the update
604 // TODO : Info message that update successful
605 GENERIC_HEADER* pUpdateInsert = pSet->pUpdateStructs;
606 GENERIC_HEADER* pPrev = pUpdateInsert;
607 // Create new update struct for this set's shadow copy
608 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
609 if (NULL == pNewNode) {
610 char str[1024];
611 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
612 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
613 }
614 else {
615 if (!pUpdateInsert) {
616 pSet->pUpdateStructs = pNewNode;
617 }
618 else {
619 // Find either the existing, matching region, or end of list for initial update chain
620 // TODO : Need to validate this, I suspect there are holes in my algorithm
621 uint32_t totalIndex = 0;
622 while (pUpdateInsert && (getUpdateIndex(pUpdates) != totalIndex)) {
623 totalIndex = getUpdateUpperBound(pUpdates);
624 pPrev = pUpdateInsert;
625 pUpdateInsert = (GENERIC_HEADER*)pUpdateInsert->pNext;
626 }
627 pPrev->pNext = pNewNode;
628 }
629 }
630 }
631 }
632 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
633 }
634}
635// Free a shadowed update node
636static void freeShadowUpdateNode(GENERIC_HEADER* pUpdate)
637{
638 switch (pUpdate->sType)
639 {
640 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
641 free((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers);
642 free(pUpdate);
643 break;
644 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
645 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->count; i++) {
646 free((XGL_IMAGE_VIEW_ATTACH_INFO*)(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i].pImageView));
647 }
648 free((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews);
649 free(pUpdate);
650 break;
651 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
652 free((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews);
653 free(pUpdate);
654 break;
655 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
656 free((XGL_BUFFER_VIEW_ATTACH_INFO*)((XGL_UPDATE_BUFFERS*)pUpdate)->pBufferViews);
657 free(pUpdate);
658 break;
659 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
660 free(pUpdate);
661 break;
662 default:
663 // TODO : Flag specific error for this case
664 break;
665 }
666}
667// Currently clearing a set it removing all previous updates to that set
668// TODO : Validate if this is correct clearing behavior
669static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
670{
671 SET_NODE* pSet = getSetNode(set);
672 if (!pSet) {
673 // TODO : Return error
674 }
675 else {
676 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
677 GENERIC_HEADER* pFreeMe = pUpdate;
678 while (pUpdate) {
679 pFreeMe = pUpdate;
680 pUpdate = (GENERIC_HEADER*)pUpdate->pNext;
681 freeShadowUpdateNode(pFreeMe);
682 }
683 }
684}
685
686static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
687{
688 REGION_NODE* pRegion = getRegionNode(region);
689 if (!pRegion) {
690 char str[1024];
691 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
692 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
693 }
694 else
695 {
696 // For every set off of this region, clear it
697 SET_NODE* pSet = pRegion->pSets;
698 while (pSet) {
699 clearDescriptorSet(pSet->set);
700 }
701 }
702}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600703// Return DS Head ptr for specified ds or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700704/*
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600705static DS_LL_HEAD* getDS(XGL_DESCRIPTOR_SET ds)
706{
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700707 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600708 DS_LL_HEAD *pTrav = pDSHead;
709 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700710 if (pTrav->dsID == ds) {
711 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600712 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700713 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600714 pTrav = pTrav->pNextDS;
715 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700716 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600717 return NULL;
718}
719
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600720// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorSetUpdate() call sequence, otherwise XGL_FALSE
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600721static bool32_t dsUpdate(XGL_DESCRIPTOR_SET ds)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600722{
723 DS_LL_HEAD *pTrav = getDS(ds);
724 if (pTrav)
725 return pTrav->updateActive;
726 return XGL_FALSE;
727}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700728*/
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600729
730// Clear specified slotCount DS Slots starting at startSlot
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700731// Return XGL_TRUE if DS exists and is successfully cleared to 0s
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700732/*
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600733static bool32_t clearDS(XGL_DESCRIPTOR_SET descriptorSet, uint32_t startSlot, uint32_t slotCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600734{
735 DS_LL_HEAD *pTrav = getDS(descriptorSet);
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700736 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600737 if (!pTrav || ((startSlot + slotCount) > pTrav->numSlots)) {
738 // TODO : Log more meaningful error here
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700739 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600740 return XGL_FALSE;
741 }
742 for (uint32_t i = startSlot; i < slotCount; i++) {
743 memset((void*)&pTrav->dsSlot[i], 0, sizeof(DS_SLOT));
744 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700745 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600746 return XGL_TRUE;
747}
748
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600749static void dsSetMapping(DS_SLOT* pSlot, uint32_t mapping)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600750{
751 pSlot->mappingMask |= mapping;
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600752 pSlot->activeMapping = mapping;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600753}
Tobin Ehlise79df942014-11-18 16:38:08 -0700754// Populate pStr w/ a string noting all of the slot mappings based on mapping flag
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700755static char* noteSlotMapping(uint32_t32 mapping, char *pStr)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600756{
757 if (MAPPING_MEMORY & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700758 strcat(pStr, "\n\tMemory View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600759 if (MAPPING_IMAGE & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700760 strcat(pStr, "\n\tImage View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600761 if (MAPPING_SAMPLER & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700762 strcat(pStr, "\n\tSampler previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600763 if (MAPPING_DS & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700764 strcat(pStr, "\n\tDESCRIPTOR SET ptr previously mapped");
765 return pStr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600766}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700767*/
Tobin Ehlis56a61072014-11-21 08:58:46 -0700768// Print the last bound Gfx Pipeline
769static void printPipeline()
770{
771 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
772 if (!pPipeTrav) {
773 // nothing to print
774 }
775 else {
776 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
777 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
778 }
779}
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700780// Dump subgraph w/ DS info
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700781/*
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700782static void dsDumpDot(FILE* pOutFile)
783{
784 const int i = 0; // hard-coding to just the first DS index for now
785 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700786 DS_LL_HEAD *pDS = getDS(lastBoundDS);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700787 if (pDS) {
788 fprintf(pOutFile, "subgraph DS_SLOTS\n{\nlabel=\"DS0 Slots\"\n");
789 // First create simple array node as central DS reference point
790 fprintf(pOutFile, "\"DS0_MEMORY\" [\nlabel = <<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"ds2\">DS0 Memory</TD></TR>");
791 uint32_t j;
792 char label[1024];
793 for (j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisf1c468a2014-12-09 17:00:33 -0700794 // Don't draw unused slots
795 if (0 != pDS->dsSlot[j].activeMapping)
796 fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", j, j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700797 }
798 fprintf(pOutFile, "</TABLE>>\n];\n");
799 // Now tie each slot to its info
800 for (j = 0; j < pDS->numSlots; j++) {
801 switch (pDS->dsSlot[j].activeMapping)
802 {
803 case MAPPING_MEMORY:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700804 sprintf(label, "MemAttachInfo Slot%u", j);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700805 fprintf(pOutFile, "%s", xgl_gv_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].buffView, label));
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700806 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
807 break;
808 case MAPPING_IMAGE:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700809 sprintf(label, "ImageAttachInfo Slot%u", j);
810 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_attach_info(&pDS->dsSlot[j].imageView, label));
811 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
812 break;
813 case MAPPING_SAMPLER:
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700814 sprintf(label, "SamplerAttachInfo Slot%u", j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700815 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(getSamplerCreateInfo(pDS->dsSlot[j].sampler), label));
816 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
817 break;
818 default:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700819 skipUnusedCount++;
820 break;
821 }
822
823 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700824 fprintf(pOutFile, "}\n");
825 }
826}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700827*/
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700828// Dump a GraphViz dot file showing the pipeline
829static void dumpDotFile(char *outFileName)
830{
831 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
832 if (pPipeTrav) {
833 FILE* pOutFile;
834 pOutFile = fopen(outFileName, "w");
835 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
836 fprintf(pOutFile, "subgraph PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
837 fprintf(pOutFile, "%s", xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"));
838 fprintf(pOutFile, "}\n");
839 // TODO : Add dynamic state dump here
840 fprintf(pOutFile, "subgraph dynamicState\n{\nlabel=\"Non-Orthogonal XGL State\"\n");
841 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700842 if (g_pLastBoundDynamicState[i]) {
843 fprintf(pOutFile, "%s", dynamic_gv_display(g_pLastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(g_pLastBoundDynamicState[i]->pCreateInfo->sType)));
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700844 }
845 }
846 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700847 //dsDumpDot(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700848 fprintf(pOutFile, "}\n"); // close main graph "g"
849 fclose(pOutFile);
850 }
851}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600852// Synch up currently bound pipeline settings with DS mappings
853static void synchDSMapping()
854{
855 // First verify that we have a bound pipeline
856 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
Tobin Ehlise79df942014-11-18 16:38:08 -0700857 char str[1024];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600858 if (!pPipeTrav) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700859 sprintf(str, "Can't find last bound Pipeline %p!", (void*)lastBoundPipeline);
860 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600861 }
862 else {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700863 // Synch Descriptor Set Mapping
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700864 //for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700865/*
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600866 DS_LL_HEAD *pDS;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700867 if (lastBoundDS) {
868 pDS = getDS(lastBoundDS);
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600869 if (!pDS) {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700870 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS?", (void*)lastBoundDS);
Tobin Ehlise79df942014-11-18 16:38:08 -0700871 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600872 }
873 else { // We have a good DS & Pipeline, store pipeline mappings in DS
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700874 uint32_t slotOffset = lastBoundSlotOffset;
Tobin Ehlis26092022014-11-20 09:49:17 -0700875 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700876 if (pPipeTrav->dsMapping[j].count > (pDS->numSlots - slotOffset)) {
877 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].count, (void*)pDS->dsID, pDS->numSlots, slotOffset, (pDS->numSlots - slotOffset));
Tobin Ehlis21042792014-11-24 16:06:04 -0700878 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_DS_SLOT_NUM_MISMATCH, "DS", str);
879 }
880 else {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700881 for (uint32_t r = 0; r < pPipeTrav->dsMapping[j].count; r++) {
882 pDS->dsSlot[r+slotOffset].shaderSlotInfo[j] = pPipeTrav->dsMapping[j].pShaderMappingSlot[r];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600883 }
884 }
885 }
886 }
887 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600888 else {
Tobin Ehlis21042792014-11-24 16:06:04 -0700889 // Verify that no shader is mapping this DS
890 uint32_t dsUsed = 0;
891 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700892 if (pPipeTrav->dsMapping[j].count > 0) {
Tobin Ehlis21042792014-11-24 16:06:04 -0700893 dsUsed = 1;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700894 sprintf(str, "No DS was bound, but shader type %s has slots bound to that DS.", string_XGL_PIPELINE_SHADER_STAGE(j));
Tobin Ehlis21042792014-11-24 16:06:04 -0700895 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
896 }
897 }
898 if (0 == dsUsed) {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700899 sprintf(str, "No DS was bound, but no shaders are using that DS so this is not an issue.");
Tobin Ehlis21042792014-11-24 16:06:04 -0700900 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
901 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600902 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700903*/
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700904 //}
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700905 // Verify Vtx binding
906 if (MAX_BINDING != lastVtxBinding) {
907 if (lastVtxBinding >= pPipeTrav->vtxBindingCount) {
908 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
909 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
910 }
911 else {
912 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[lastVtxBinding], "{DS}INFO : ");
913 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
914 free(tmpStr);
915 }
916 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600917 }
918}
919
920// Print details of DS config to stdout
921static void printDSConfig()
922{
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700923 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
Tobin Ehlise79df942014-11-18 16:38:08 -0700924 char tmp_str[1024];
925 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 -0600926 for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600927 if (lastBoundDS[i]) {
928 DS_LL_HEAD *pDS = getDS(lastBoundDS[i]);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600929 uint32_t slotOffset = lastBoundSlotOffset[i];
Tobin Ehlisb8154982014-10-27 14:53:17 -0600930 if (pDS) {
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700931 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 -0700932 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600933 for (uint32_t j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600934 switch (pDS->dsSlot[j].activeMapping)
935 {
936 case MAPPING_MEMORY:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700937 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700938 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
939 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700940 skipUnusedCount = 0;
941 }
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700942 sprintf(tmp_str, "----Slot %u\n Mapped to Memory View %p:\n%s", j, (void*)&pDS->dsSlot[j].buffView, xgl_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].buffView, " "));
Tobin Ehlise79df942014-11-18 16:38:08 -0700943 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600944 break;
945 case MAPPING_IMAGE:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700946 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700947 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
948 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700949 skipUnusedCount = 0;
950 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700951 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, " "));
952 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600953 break;
954 case MAPPING_SAMPLER:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700955 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700956 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
957 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700958 skipUnusedCount = 0;
959 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700960 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 -0700961 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600962 break;
963 default:
Tobin Ehlise79df942014-11-18 16:38:08 -0700964 if (!skipUnusedCount) {// only report start of unused sequences
965 sprintf(tmp_str, "----Skipping slot(s) w/o a view attached...\n");
966 strcat(ds_config_str, tmp_str);
967 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700968 skipUnusedCount++;
Tobin Ehlisb8154982014-10-27 14:53:17 -0600969 break;
970 }
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600971 // For each shader type, check its mapping
Tobin Ehlis26092022014-11-20 09:49:17 -0700972 for (uint32_t k = 0; k < XGL_NUM_GRAPHICS_SHADERS; k++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600973 if (XGL_SLOT_UNUSED != pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700974 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 -0700975 strcat(ds_config_str, tmp_str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700976 //verifyShaderSlotMapping(j, pDS->dsSlot[j].activeMapping, k, pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600977 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600978 }
979 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700980 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700981 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
982 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700983 skipUnusedCount = 0;
984 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600985 }
Tobin Ehlisb8154982014-10-27 14:53:17 -0600986 else {
Tobin Ehlise79df942014-11-18 16:38:08 -0700987 char str[1024];
988 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS to index %u?", (void*)lastBoundDS[i], i);
989 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600990 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600991 }
992 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700993 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600994}
995
996static void synchAndPrintDSConfig()
997{
998 synchDSMapping();
999 printDSConfig();
Tobin Ehlis56a61072014-11-21 08:58:46 -07001000 printPipeline();
1001 printDynamicState();
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001002 static int autoDumpOnce = 1;
1003 if (autoDumpOnce) {
1004 autoDumpOnce = 0;
1005 dumpDotFile("pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001006 // Convert dot to png if dot available
1007 if(access( "/usr/bin/dot", X_OK) != -1) {
1008 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
1009 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001010 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001011}
1012
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001013static void initDrawState()
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001014{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001015 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001016 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001017 strOpt = getLayerOption("DrawStateReportLevel");
1018 if (strOpt != NULL)
1019 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001020
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001021 strOpt = getLayerOption("DrawStateDebugAction");
1022 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001023 g_debugAction = atoi(strOpt);
1024
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001025 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1026 {
1027 strOpt = getLayerOption("DrawStateLogFilename");
1028 if (strOpt)
1029 {
1030 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001031 }
1032 if (g_logFile == NULL)
1033 g_logFile = stdout;
1034 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001035 // initialize Layer dispatch table
1036 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001037 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001038 fpNextGPA = pCurObj->pGPA;
1039 assert(fpNextGPA);
1040
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001041 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1042
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001043 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001044 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001045}
1046
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001047XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1048{
1049 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1050 return result;
1051}
1052
1053XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1054{
1055 XGL_RESULT result = nextTable.DestroyInstance(instance);
1056 return result;
1057}
1058
1059XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1060{
1061 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1062 return result;
1063}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001064
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001065XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001066{
1067 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001068 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001069 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001070 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001071 return result;
1072}
1073
1074XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1075{
1076 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001077 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001078 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001079 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001080 return result;
1081}
1082
1083XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1084{
1085 XGL_RESULT result = nextTable.DestroyDevice(device);
1086 return result;
1087}
1088
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001089XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001090{
1091 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001092 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001093 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001094 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001095 return result;
1096}
1097
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001098XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, size_t maxLayerCount, size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001099{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001100 if (gpu != NULL)
1101 {
1102 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1103 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001104 pthread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001105 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001106 return result;
1107 } else
1108 {
1109 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1110 return XGL_ERROR_INVALID_POINTER;
1111 // This layer compatible with all GPUs
1112 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001113 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001114 return XGL_SUCCESS;
1115 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001116}
1117
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001118XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, uint32_t queueIndex, XGL_QUEUE* pQueue)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001119{
1120 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1121 return result;
1122}
1123
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001124XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001125{
1126 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1127 return result;
1128}
1129
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001130XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001131{
1132 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1133 return result;
1134}
1135
1136XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1137{
1138 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1139 return result;
1140}
1141
1142XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1143{
1144 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1145 return result;
1146}
1147
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001148XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1149{
1150 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1151 return result;
1152}
1153
1154XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1155{
1156 XGL_RESULT result = nextTable.FreeMemory(mem);
1157 return result;
1158}
1159
1160XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1161{
1162 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1163 return result;
1164}
1165
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001166XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001167{
1168 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1169 return result;
1170}
1171
1172XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1173{
1174 XGL_RESULT result = nextTable.UnmapMemory(mem);
1175 return result;
1176}
1177
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001178XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const void* pSysMem, size_t memSize, XGL_GPU_MEMORY* pMem)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001179{
1180 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1181 return result;
1182}
1183
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001184XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1185{
1186 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001187 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001188 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001189 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001190 return result;
1191}
1192
1193XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1194{
1195 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1196 return result;
1197}
1198
1199XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1200{
1201 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1202 return result;
1203}
1204
1205XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1206{
1207 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1208 return result;
1209}
1210
1211XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1212{
1213 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1214 return result;
1215}
1216
1217XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1218{
1219 XGL_RESULT result = nextTable.DestroyObject(object);
1220 return result;
1221}
1222
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001223XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001224{
1225 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1226 return result;
1227}
1228
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001229XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001230{
Jon Ashburned62b412015-01-15 10:39:19 -07001231 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001232 return result;
1233}
1234
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001235XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemoryRange(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_SIZE rangeOffset, XGL_GPU_SIZE rangeSize, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1236{
1237 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1238 return result;
1239}
1240
1241XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindImageMemoryRange(XGL_IMAGE image, uint32_t allocationIdx, const XGL_IMAGE_MEMORY_BIND_INFO* bindInfo, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1242{
1243 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1244 return result;
1245}
1246
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001247XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1248{
1249 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1250 return result;
1251}
1252
1253XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1254{
1255 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1256 return result;
1257}
1258
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001259XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001260{
1261 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1262 return result;
1263}
1264
1265XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1266{
1267 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1268 return result;
1269}
1270
1271XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1272{
1273 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1274 return result;
1275}
1276
1277XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1278{
1279 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1280 return result;
1281}
1282
1283XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1284{
1285 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1286 return result;
1287}
1288
1289XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1290{
1291 XGL_RESULT result = nextTable.GetEventStatus(event);
1292 return result;
1293}
1294
1295XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1296{
1297 XGL_RESULT result = nextTable.SetEvent(event);
1298 return result;
1299}
1300
1301XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1302{
1303 XGL_RESULT result = nextTable.ResetEvent(event);
1304 return result;
1305}
1306
1307XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1308{
1309 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1310 return result;
1311}
1312
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001313XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001314{
1315 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1316 return result;
1317}
1318
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001319XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001320{
1321 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1322 return result;
1323}
1324
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001325XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1326{
1327 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001328 if (XGL_SUCCESS == result) {
1329 pthread_mutex_lock(&globalLock);
1330 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1331 pNewNode->buffer = *pBuffer;
1332 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
1333 pNewNode->pNext = g_pBufferHead;
1334 g_pBufferHead = pNewNode;
1335 pthread_mutex_unlock(&globalLock);
1336 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001337 return result;
1338}
1339
1340XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1341{
1342 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1343 return result;
1344}
1345
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001346XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1347{
1348 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1349 return result;
1350}
1351
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001352XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1353{
1354 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1355 return result;
1356}
1357
1358XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1359{
1360 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1361 return result;
1362}
1363
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001364XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001365{
1366 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1367 return result;
1368}
1369
1370XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1371{
1372 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001373 if (XGL_SUCCESS == result) {
1374 pthread_mutex_lock(&globalLock);
1375 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
1376 pNewNode->image = *pView;
1377 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1378 pNewNode->pNext = g_pImageHead;
1379 g_pImageHead = pNewNode;
1380 pthread_mutex_unlock(&globalLock);
1381 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001382 return result;
1383}
1384
1385XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1386{
1387 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1388 return result;
1389}
1390
1391XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1392{
1393 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1394 return result;
1395}
1396
1397XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1398{
1399 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1400 return result;
1401}
1402
1403XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1404{
1405 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1406 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001407 char str[1024];
1408 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1409 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001410 pthread_mutex_lock(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001411 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001412 if (pTrav) {
1413 while (pTrav->pNext)
1414 pTrav = pTrav->pNext;
1415 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1416 pTrav = pTrav->pNext;
1417 }
1418 else {
1419 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001420 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001421 }
1422 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1423 pTrav->pipeline = *pPipeline;
1424 initPipeline(pTrav, pCreateInfo);
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001425 pthread_mutex_unlock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001426 return result;
1427}
1428
1429XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1430{
1431 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1432 return result;
1433}
1434
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001435XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001436{
1437 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1438 return result;
1439}
1440
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001441XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, size_t dataSize, const void* pData, XGL_PIPELINE* pPipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001442{
1443 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1444 return result;
1445}
1446
1447XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1448{
1449 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1450 return result;
1451}
1452
1453XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1454{
1455 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001456 if (XGL_SUCCESS == result) {
1457 pthread_mutex_lock(&globalLock);
1458 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1459 pNewNode->sampler = *pSampler;
1460 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1461 pNewNode->pNext = g_pSamplerHead;
1462 g_pSamplerHead = pNewNode;
1463 pthread_mutex_unlock(&globalLock);
1464 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001465 return result;
1466}
1467
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001468XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(XGL_DEVICE device, XGL_FLAGS stageFlags, const uint32_t* pSetBindPoints, XGL_DESCRIPTOR_SET_LAYOUT priorSetLayout, const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList, XGL_DESCRIPTOR_SET_LAYOUT* pSetLayout)
1469{
1470 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1471 if (XGL_SUCCESS == result) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001472 // Create new layout node off of prior layout
1473 LAYOUT_NODE* pTopLayout = getLayoutNode(g_pLayoutHead);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001474 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
1475 if (NULL == pNewNode) {
1476 char str[1024];
1477 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
1478 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1479 }
1480 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001481 // TODO : API Currently missing a count here that we should multiply by struct size
1482 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1483 memcpy(pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1484 pNewNode->layout = *pSetLayout;
1485 pNewNode->stageFlags = stageFlag;
1486 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
1487 // Point to prior node or NULL if no prior node
1488 // TODO : Flag an internal error here if priorNode was not NULL, but we still get a NULL LAYOUT_NODE
1489 pNewNode->pPriorSetLayout = pPriorNode;
1490 // Put new node at Head of global Layer list
1491 pNewNode->pNext = pTopLayout;
1492 g_pLayoutHead = pNewNode;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001493 }
1494 return result;
1495}
1496
1497XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
1498{
1499 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1500 if (XGL_SUCCESS == result) {
1501 if (!g_pRegionHead) {
1502 char str[1024];
1503 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1504 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1505 }
1506 else {
1507 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1508 if (!pRegionNode) {
1509 char str[1024];
1510 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1511 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1512 }
1513 else {
1514 pRegionNode->updateActive = 1;
1515 }
1516 }
1517 }
1518 return result;
1519}
1520
1521XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
1522{
1523 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1524 if (XGL_SUCCESS == result) {
1525 if (!g_pRegionHead) {
1526 char str[1024];
1527 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1528 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1529 }
1530 else {
1531 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1532 if (!pRegionNode) {
1533 char str[1024];
1534 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1535 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1536 }
1537 else {
1538 if (!pRegionNode->updateActive) {
1539 char str[1024];
1540 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
1541 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
1542 }
1543 else {
1544 pRegionNode->updateActive = 0;
1545 }
1546 }
1547 }
1548 }
1549 return result;
1550}
1551
1552XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorRegion(XGL_DEVICE device, XGL_DESCRIPTOR_REGION_USAGE regionUsage, uint32_t maxSets, const XGL_DESCRIPTOR_REGION_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_REGION* pDescriptorRegion)
1553{
1554 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1555 if (XGL_SUCCESS == result) {
1556 // Insert this region into Global Region LL at head
1557 char str[1024];
1558 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
1559 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
1560 pthread_mutex_lock(&globalLock);
1561 REGION_NODE *pTrav = g_pRegionHead;
1562 REGION_NODE pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
1563 if (NULL == pNewNode) {
1564 char str[1024];
1565 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
1566 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1567 }
1568 else {
1569 memset(pNewNode, 0, sizeof(REGION_NODE));
1570 pNewNode->pNext = g_pRegionHead;
1571 g_pRegionHead = pNewNode;
1572 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
1573 pNewNode->regionUsage = regionUsage;
1574 pNewNode->updateActive = 0;
1575 pNewNode->maxSets = maxSets;
1576 pNewNode->region = *pDescriptorRegion;
1577 }
1578 pthread_mutex_unlock(&globalLock);
1579 }
1580 else {
1581 // Need to do anything if region create fails?
1582 }
1583 return result;
1584}
1585
1586XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
1587{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001588 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001589 if (XGL_SUCCESS == result) {
1590 clearDescriptorRegion(descriptorRegion);
1591 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001592 return result;
1593}
1594
1595XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_DESCRIPTOR_SET_USAGE setUsage, uint32_t count, const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts, XGL_DESCRIPTOR_SET* pDescriptorSets, uint32_t* pCount)
1596{
1597 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001598 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
1599 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
1600 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001601 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001602 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
1603 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descrtiptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
1604 }
1605 else {
1606 for (uint32_t i; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001607 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001608 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
1609 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSet[i], 0, DRAWSTATE_NONE, "DS", str);
1610 pthread_mutex_lock(&globalLock);
1611 // Create new set node and add to head of region nodes
1612 SET_NODE pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
1613 if (NULL == pNewNode) {
1614 char str[1024];
1615 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
1616 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pDescriptorSet[i], 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1617 }
1618 else {
1619 memset(pNewNode, 0, sizeof(SET_NODE));
1620 // Insert set at head of Set LL for this region
1621 pNewNode->pNext = pRegionNode->pSets;
1622 pRegionNode->pSets = pNewNode;
1623 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
1624 if (NULL == pLayout) {
1625 char str[1024];
1626 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
1627 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1628 }
1629 pNewNode->pLayouts = pLayout;
1630 pNewNode->region = descriptorRegion;
1631 pNewNode->set = pDescriptorSets[i];
1632 pNewNode->setUsage = setUsage;
1633 pNewNode->descriptorCount = ;
1634 }
1635 pthread_mutex_unlock(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001636 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001637 }
1638 }
1639 return result;
1640}
1641
1642XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
1643{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001644 for (uint32_t i = 0; i < count; i++) {
1645 clearDescriptorSet(descriptorSets[i]);
1646 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001647 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
1648}
1649
1650XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
1651{
1652 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1653 if (!pRegionNode->updateActive) {
1654 char str[1024];
1655 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
1656 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str);
1657 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001658 else {
1659 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
1660 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
1661 }
1662
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001663 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
1664}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001665
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001666XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicViewportState(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_VP_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001667{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001668 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001669 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001670 return result;
1671}
1672
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001673XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicRasterState(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_RS_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001674{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001675 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001676 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001677 return result;
1678}
1679
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001680XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicColorBlendState(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_CB_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001681{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001682 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001683 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001684 return result;
1685}
1686
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001687XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicDepthStencilState(XGL_DEVICE device, const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_DS_STATE_OBJECT* pState)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001688{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001689 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001690 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001691 return result;
1692}
1693
1694XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1695{
1696 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1697 return result;
1698}
1699
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001700XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001701{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001702 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001703 return result;
1704}
1705
1706XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1707{
1708 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1709 return result;
1710}
1711
1712XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1713{
1714 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1715 return result;
1716}
1717
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001718XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001719{
1720 if (getPipeline(pipeline)) {
1721 lastBoundPipeline = pipeline;
1722 }
1723 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001724 char str[1024];
1725 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
1726 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001727 }
1728 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1729}
1730
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001731XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001732{
1733 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1734}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001735/*
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001736
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001737XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t index, XGL_DESCRIPTOR_SET descriptorSet, uint32_t slotOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001738{
1739 if (getDS(descriptorSet)) {
Tobin Ehlisb8154982014-10-27 14:53:17 -06001740 assert(index < XGL_MAX_DESCRIPTOR_SETS);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001741 if (dsUpdate(descriptorSet)) {
1742 char str[1024];
1743 sprintf(str, "You must call xglEndDescriptorSetUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
1744 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
1745 }
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001746 pthread_mutex_lock(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001747 lastBoundDS[index] = descriptorSet;
Tobin Ehliseacc64f2014-11-24 17:09:09 -07001748 lastBoundSlotOffset[index] = slotOffset;
Tobin Ehlis9e142a32014-11-21 12:04:39 -07001749 pthread_mutex_unlock(&globalLock);
Tobin Ehlise79df942014-11-18 16:38:08 -07001750 char str[1024];
1751 sprintf(str, "DS %p bound to DS index %u on pipeline %s", (void*)descriptorSet, index, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
1752 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001753 }
1754 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001755 char str[1024];
1756 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
1757 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001758 }
1759 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, index, descriptorSet, slotOffset);
1760}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001761*/
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001762
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001763
1764XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
1765{
1766 setLastBoundDynamicState(state, stateBindPoint);
1767 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
1768}
1769
1770XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
1771{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001772 // TODO : Improve this. Can track per-cmd buffer and store bind point and pUserData
1773 g_lastBoundDS = descriptorSet;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001774 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
1775}
1776
1777XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
1778{
1779 lastIdxBinding = binding;
1780 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
1781}
1782
1783XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding)
Chia-I Wu3b04af52014-11-08 10:48:20 +08001784{
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001785 lastVtxBinding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001786 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001787}
1788
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001789XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001790{
Tobin Ehlise79df942014-11-18 16:38:08 -07001791 char str[1024];
1792 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", drawCount[DRAW]++);
1793 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001794 synchAndPrintDSConfig();
1795 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1796}
1797
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001798XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001799{
Tobin Ehlise79df942014-11-18 16:38:08 -07001800 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001801 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001802 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001803 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001804 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1805}
1806
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001807XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001808{
Tobin Ehlise79df942014-11-18 16:38:08 -07001809 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001810 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001811 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001812 synchAndPrintDSConfig();
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001813 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001814}
1815
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001816XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001817{
Tobin Ehlise79df942014-11-18 16:38:08 -07001818 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001819 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001820 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001821 synchAndPrintDSConfig();
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001822 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001823}
1824
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001825XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001826{
1827 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1828}
1829
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001830XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001831{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001832 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001833}
1834
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001835XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001836{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001837 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001838}
1839
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001840XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t regionCount, const XGL_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001841{
1842 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1843}
1844
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001845XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_IMAGE destImage, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001846{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001847 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001848}
1849
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001850XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001851{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001852 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001853}
1854
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001855XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001856{
Mike Stroyan55658c22014-12-04 11:08:39 +00001857 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001858}
1859
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001860XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
1861{
1862 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
1863}
1864
1865XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
1866{
1867 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
1868}
1869
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001870XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const float color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001871{
1872 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1873}
1874
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001875XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const uint32_t color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001876{
1877 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1878}
1879
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001880XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, float depth, uint32_t stencil, uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001881{
1882 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1883}
1884
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001885XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001886{
1887 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1888}
1889
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001890XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001891{
Mike Stroyan55658c22014-12-04 11:08:39 +00001892 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001893}
1894
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001895XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001896{
1897 nextTable.CmdResetEvent(cmdBuffer, event);
1898}
1899
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001900XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00001901{
1902 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1903}
1904
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001905XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00001906{
1907 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1908}
1909
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001910XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001911{
1912 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1913}
1914
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001915XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001916{
1917 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1918}
1919
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001920XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001921{
1922 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1923}
1924
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001925XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001926{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001927 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001928}
1929
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001930XGL_LAYER_EXPORT void XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001931{
1932 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1933}
1934
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001935XGL_LAYER_EXPORT void XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER srcBuffer, XGL_GPU_SIZE srcOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001936{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001937 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001938}
1939
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001940XGL_LAYER_EXPORT void XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001941{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001942 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1943}
1944
1945XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
1946{
1947 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
1948 return result;
1949}
1950
1951XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
1952{
1953 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
1954 return result;
1955}
1956
1957XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1958{
1959 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
1960}
1961
1962XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1963{
1964 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001965}
1966
1967XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1968{
1969 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1970 return result;
1971}
1972
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001973XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001974{
Tobin Ehlise79df942014-11-18 16:38:08 -07001975 // This layer intercepts callbacks
1976 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1977 if (!pNewDbgFuncNode)
1978 return XGL_ERROR_OUT_OF_MEMORY;
1979 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1980 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001981 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1982 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001983 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1984 return result;
1985}
1986
1987XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1988{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001989 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07001990 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1991 while (pTrav) {
1992 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1993 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001994 if (g_pDbgFunctionHead == pTrav)
1995 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07001996 free(pTrav);
1997 break;
1998 }
1999 pPrev = pTrav;
2000 pTrav = pTrav->pNext;
2001 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002002 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2003 return result;
2004}
2005
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002006XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002007{
2008 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2009 return result;
2010}
2011
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002012XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002013{
2014 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2015 return result;
2016}
2017
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002018XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002019{
2020 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2021 return result;
2022}
2023
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002024XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002025{
2026 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2027 return result;
2028}
2029
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002030XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002031{
2032 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2033}
2034
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002035XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002036{
2037 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2038}
2039
2040XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2041{
2042 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002043 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002044 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002045 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002046 return result;
2047}
2048
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002049XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, uint64_t* pMsc)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002050{
Chia-I Wu6204f342014-11-07 13:33:45 +08002051 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002052 return result;
2053}
2054
2055XGL_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)
2056{
2057 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
2058 return result;
2059}
2060
2061XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2062{
2063 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2064 return result;
2065}
2066
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002067void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002068{
2069 dumpDotFile(outFileName);
2070}
2071
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002072void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07002073{
2074 char dotExe[32] = "/usr/bin/dot";
2075 if( access(dotExe, X_OK) != -1) {
2076 dumpDotFile("/tmp/tmp.dot");
2077 char dotCmd[1024];
2078 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
2079 system(dotCmd);
2080 remove("/tmp/tmp.dot");
2081 }
2082 else {
2083 char str[1024];
2084 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
2085 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2086 }
2087}
2088
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002089XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002090{
2091 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08002092 void *addr;
2093
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002094 if (gpu == NULL)
2095 return NULL;
2096 pCurObj = gpuw;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002097 pthread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002098
Chia-I Wu706533e2015-01-05 13:18:57 +08002099 addr = layer_intercept_proc(funcName);
2100 if (addr)
2101 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002102 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002103 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002104 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07002105 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002106 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002107 if (gpuw->pGPA == NULL)
2108 return NULL;
2109 return gpuw->pGPA(gpuw->nextObject, funcName);
2110 }
2111}