blob: 5e6e6fed687e66aaa06683d0b9989479237ca749 [file] [log] [blame]
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
Ian Elliott81ac44c2015-01-13 17:52:38 -070028#include "loader_platform.h"
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080029#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080030#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlisb8154982014-10-27 14:53:17 -060031#include "xgl_struct_string_helper.h"
Tobin Ehlisa701ef02014-11-27 15:43:39 -070032#include "xgl_struct_graphviz_helper.h"
Tobin Ehlise79df942014-11-18 16:38:08 -070033#include "draw_state.h"
Jon Ashburn2e9b5612014-12-22 13:38:27 -070034#include "layers_config.h"
Tobin Ehlis8726b9f2014-10-24 12:01:45 -060035
36static XGL_LAYER_DISPATCH_TABLE nextTable;
37static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott81ac44c2015-01-13 17:52:38 -070038static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
39static int globalLockInitialized = 0;
40static loader_platform_thread_mutex globalLock;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070041
Tobin Ehlise79df942014-11-18 16:38:08 -070042// Ptr to LL of dbg functions
Jon Ashburn2e9b5612014-12-22 13:38:27 -070043static XGL_LAYER_DBG_FUNCTION_NODE *g_pDbgFunctionHead = NULL;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -070044static XGL_LAYER_DBG_REPORT_LEVEL g_reportingLevel = XGL_DBG_LAYER_LEVEL_INFO;
Jon Ashburn2e9b5612014-12-22 13:38:27 -070045static XGL_LAYER_DBG_ACTION g_debugAction = XGL_DBG_LAYER_ACTION_LOG_MSG;
46static FILE *g_logFile = NULL;
47
Tobin Ehlise79df942014-11-18 16:38:08 -070048// Utility function to handle reporting
49// If callbacks are enabled, use them, otherwise use printf
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060050static void layerCbMsg(XGL_DBG_MSG_TYPE msgType,
Tobin Ehlise79df942014-11-18 16:38:08 -070051 XGL_VALIDATION_LEVEL validationLevel,
52 XGL_BASE_OBJECT srcObject,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060053 size_t location,
54 int32_t msgCode,
Chia-I Wua837c522014-12-16 10:47:33 +080055 const char* pLayerPrefix,
56 const char* pMsg)
Tobin Ehlise79df942014-11-18 16:38:08 -070057{
Jon Ashburn2e9b5612014-12-22 13:38:27 -070058 if (g_debugAction & (XGL_DBG_LAYER_ACTION_LOG_MSG | XGL_DBG_LAYER_ACTION_CALLBACK)) {
59 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -070060 switch (msgType) {
61 case XGL_DBG_MSG_ERROR:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070062 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_ERROR) {
63 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
64 fprintf(g_logFile, "{%s}ERROR : %s\n", pLayerPrefix, pMsg);
65 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
66 while (pTrav) {
67 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
68 pTrav = pTrav->pNext;
69 }
70 }
Tobin Ehlise79df942014-11-18 16:38:08 -070071 break;
72 case XGL_DBG_MSG_WARNING:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070073 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_WARN) {
74 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
75 fprintf(g_logFile, "{%s}WARN : %s\n", pLayerPrefix, pMsg);
76 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
77 while (pTrav) {
78 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
79 pTrav = pTrav->pNext;
80 }
81 }
Tobin Ehlise79df942014-11-18 16:38:08 -070082 break;
83 case XGL_DBG_MSG_PERF_WARNING:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070084 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_PERF_WARN) {
85 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
86 fprintf(g_logFile, "{%s}PERF_WARN : %s\n", pLayerPrefix, pMsg);
87 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
88 while (pTrav) {
89 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
90 pTrav = pTrav->pNext;
91 }
92 }
Tobin Ehlise79df942014-11-18 16:38:08 -070093 break;
94 default:
Jon Ashburn2e9b5612014-12-22 13:38:27 -070095 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_INFO) {
96 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
97 fprintf(g_logFile, "{%s}INFO : %s\n", pLayerPrefix, pMsg);
98 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
99 while (pTrav) {
100 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
101 pTrav = pTrav->pNext;
102 }
103 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700104 break;
105 }
106 }
107}
Tobin Ehlis26092022014-11-20 09:49:17 -0700108// Return the size of the underlying struct based on struct type
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600109static size_t sTypeStructSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis26092022014-11-20 09:49:17 -0700110{
111 switch (sType)
112 {
113 case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
114 return sizeof(XGL_APPLICATION_INFO);
115 case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
116 return sizeof(XGL_DEVICE_CREATE_INFO);
117 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
118 return sizeof(XGL_MEMORY_ALLOC_INFO);
119 case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
120 return sizeof(XGL_MEMORY_OPEN_INFO);
121 case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
122 return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700123 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO:
124 return sizeof(XGL_BUFFER_VIEW_ATTACH_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700125 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
126 return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700127 case XGL_STRUCTURE_TYPE_EVENT_WAIT_INFO:
128 return sizeof(XGL_EVENT_WAIT_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700129 case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
130 return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
131 case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
132 return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
133 case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
134 return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
135 case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
136 return sizeof(XGL_SHADER_CREATE_INFO);
137 case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
138 return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
139 case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
140 return sizeof(XGL_SAMPLER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700141 case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
142 return sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
143 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
144 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
145 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
146 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
147 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
148 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
149 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
150 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700151 case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
152 return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
153 case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
154 return sizeof(XGL_EVENT_CREATE_INFO);
155 case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
156 return sizeof(XGL_FENCE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600157 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_CREATE_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700158 return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
Mark Lobodzinski4eca6972015-01-26 10:34:00 -0600159 case XGL_STRUCTURE_TYPE_QUEUE_SEMAPHORE_OPEN_INFO:
Tobin Ehlis26092022014-11-20 09:49:17 -0700160 return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
161 case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
162 return sizeof(XGL_QUERY_POOL_CREATE_INFO);
163 case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
164 return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
165 case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
166 return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700167 case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
168 return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700169 case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
170 return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700171 case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
172 return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700173 case XGL_STRUCTURE_TYPE_PIPELINE_VP_STATE_CREATE_INFO:
174 return sizeof(XGL_PIPELINE_VP_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700175 case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
176 return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
177 case XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO:
178 return sizeof(XGL_PIPELINE_MS_STATE_CREATE_INFO);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700179 case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
180 return sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700181 case XGL_STRUCTURE_TYPE_PIPELINE_DS_STATE_CREATE_INFO:
182 return sizeof(XGL_PIPELINE_DS_STATE_CREATE_INFO);
183 case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
184 return sizeof(XGL_IMAGE_CREATE_INFO);
185 case XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
186 return sizeof(XGL_BUFFER_CREATE_INFO);
187 case XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
188 return sizeof(XGL_BUFFER_VIEW_CREATE_INFO);
189 case XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
190 return sizeof(XGL_FRAMEBUFFER_CREATE_INFO);
191 case XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO:
192 return sizeof(XGL_CMD_BUFFER_BEGIN_INFO);
193 case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
194 return sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);
195 case XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
196 return sizeof(XGL_RENDER_PASS_CREATE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700197 case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
198 return sizeof(XGL_LAYER_CREATE_INFO);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700199 case XGL_STRUCTURE_TYPE_PIPELINE_BARRIER:
200 return sizeof(XGL_PIPELINE_BARRIER);
201 case XGL_STRUCTURE_TYPE_MEMORY_BARRIER:
202 return sizeof(XGL_MEMORY_BARRIER);
203 case XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
204 return sizeof(XGL_BUFFER_MEMORY_BARRIER);
205 case XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
206 return sizeof(XGL_IMAGE_MEMORY_BARRIER);
207 case XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO:
208 return sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
209 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
210 return sizeof(XGL_UPDATE_SAMPLERS);
211 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
212 return sizeof(XGL_UPDATE_SAMPLER_TEXTURES);
213 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
214 return sizeof(XGL_UPDATE_IMAGES);
215 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
216 return sizeof(XGL_UPDATE_BUFFERS);
217 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
218 return sizeof(XGL_UPDATE_AS_COPY);
219 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:
220 return sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);
221 case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:
222 return sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);
Tobin Ehlis26092022014-11-20 09:49:17 -0700223 default:
224 return 0;
225 }
226}
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700227// Return the size of the underlying struct based on sType
228static size_t dynStateCreateInfoSize(XGL_STRUCTURE_TYPE sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700229{
230 switch (sType)
231 {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700232 case XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO:
233 return sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO);
234 case XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO:
235 return sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO);
236 case XGL_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO:
237 return sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO);
238 case XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO:
239 return sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700240 default:
241 return 0;
242 }
243}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600244// Block of code at start here for managing/tracking Pipeline state that this layer cares about
245// Just track 2 shaders for now
Tobin Ehlis26092022014-11-20 09:49:17 -0700246#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600247#define MAX_SLOTS 2048
Tobin Ehlisb8154982014-10-27 14:53:17 -0600248
249static uint64_t drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
250
Tobin Ehlis56a61072014-11-21 08:58:46 -0700251// 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 -0700252// Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates
253// to that same cmd buffer by separate thread are not changing state from underneath us
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700254static PIPELINE_NODE* g_pPipelineHead = NULL;
255static SAMPLER_NODE* g_pSamplerHead = NULL;
256static IMAGE_NODE* g_pImageHead = NULL;
257static BUFFER_NODE* g_pBufferHead = NULL;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600258static XGL_PIPELINE lastBoundPipeline = NULL;
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700259#define MAX_BINDING 0xFFFFFFFF
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600260static uint32_t lastVtxBinding = MAX_BINDING;
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700261static uint32_t lastIdxBinding = MAX_BINDING;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600262
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700263static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0};
264static DYNAMIC_STATE_NODE* g_pLastBoundDynamicState[XGL_NUM_STATE_BIND_POINT] = {0};
Tobin Ehlis56a61072014-11-21 08:58:46 -0700265
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700266static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700267{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700268 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700269 // Insert new node at head of appropriate LL
270 DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700271 pStateNode->pNext = g_pDynamicStateHead[bindPoint];
272 g_pDynamicStateHead[bindPoint] = pStateNode;
Tobin Ehlis56a61072014-11-21 08:58:46 -0700273 pStateNode->stateObj = state;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700274 pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(dynStateCreateInfoSize(pCreateInfo->sType));
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700275 memcpy(pStateNode->pCreateInfo, pCreateInfo, dynStateCreateInfoSize(pCreateInfo->sType));
Ian Elliott81ac44c2015-01-13 17:52:38 -0700276 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700277}
278// Set the last bound dynamic state of given type
279// TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer?
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700280static void setLastBoundDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700281{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700282 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700283 DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
Tobin Ehlis56a61072014-11-21 08:58:46 -0700284 while (pTrav && (state != pTrav->stateObj)) {
285 pTrav = pTrav->pNext;
286 }
287 if (!pTrav) {
288 char str[1024];
289 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
290 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str);
291 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700292 g_pLastBoundDynamicState[sType] = pTrav;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700293 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700294}
295// Print the last bound dynamic state
296static void printDynamicState()
297{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700298 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700299 char str[1024];
300 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700301 if (g_pLastBoundDynamicState[i]) {
302 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), g_pLastBoundDynamicState[i]->stateObj);
303 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, g_pLastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str);
304 switch (g_pLastBoundDynamicState[i]->pCreateInfo->sType)
Tobin Ehlis56a61072014-11-21 08:58:46 -0700305 {
306 case XGL_STATE_BIND_VIEWPORT:
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700307 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 -0700308 break;
309 default:
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700310 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 -0700311 break;
312 }
313 }
314 else {
315 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i));
316 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
317 }
318 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700319 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis56a61072014-11-21 08:58:46 -0700320}
321// Retrieve pipeline node ptr for given pipeline object
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600322static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline)
323{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700324 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700325 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600326 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700327 if (pTrav->pipeline == pipeline) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700328 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600329 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700330 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600331 pTrav = pTrav->pNext;
332 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700333 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600334 return NULL;
335}
336
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700337// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
338static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
339{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700340 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700341 SAMPLER_NODE *pTrav = g_pSamplerHead;
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700342 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700343 if (sampler == pTrav->sampler) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700344 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700345 return &pTrav->createInfo;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700346 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700347 pTrav = pTrav->pNext;
348 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700349 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700350 return NULL;
351}
352
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600353// Init the pipeline mapping info based on pipeline create info LL tree
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700354// Threading note : Calls to this function should wrapped in mutex
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600355static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
356{
Tobin Ehlis26092022014-11-20 09:49:17 -0700357 // First init create info, we'll shadow the structs as we go down the tree
Tobin Ehlis56a61072014-11-21 08:58:46 -0700358 pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis26092022014-11-20 09:49:17 -0700359 memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700360 GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree;
361 GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600362 while (pTrav) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700363 // Shadow the struct
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700364 pShadowTrav->pNext = (GENERIC_HEADER*)malloc(sTypeStructSize(pTrav->sType));
Tobin Ehlis26092022014-11-20 09:49:17 -0700365 // Typically pNext is const so have to cast to avoid warning when we modify it here
366 memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700367 pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext;
368 // Special copy of Vtx info as it has embedded array
369 if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700370 XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav;
371 pPipeline->vtxBindingCount = pVICI->bindingCount;
372 uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION);
373 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize);
374 memcpy(pPipeline->pVertexBindingDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
375 pPipeline->vtxAttributeCount = pVICI->attributeCount;
376 allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);
377 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize);
378 memcpy(pPipeline->pVertexAttributeDescriptions, pVICI->pVertexAttributeDescriptions, allocSize);
379 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700380 pTrav = (GENERIC_HEADER*)pTrav->pNext;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600381 }
382}
383
384// Block of code at start here specifically for managing/tracking DSs
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600385
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700386// ptr to HEAD of LL of DS Regions
387static REGION_NODE* g_pRegionHead = NULL;
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700388// ptr to HEAD of LL of top-level Layouts
389static LAYOUT_NODE* g_pLayoutHead = NULL;
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700390// Last DS that was bound, and slotOffset for the binding
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700391static XGL_DESCRIPTOR_SET g_lastBoundDS = NULL;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700392static uint32_t lastBoundSlotOffset = 0;
393
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700394// Return Region node ptr for specified region or else NULL
395static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region)
396{
397 pthread_mutex_lock(&globalLock);
398 REGION_NODE* pTrav = g_pRegionHead;
399 while (pTrav) {
400 if (pTrav->region == region) {
401 pthread_mutex_unlock(&globalLock);
402 return pTrav;
403 }
404 pTrav = pTrav->pNext;
405 }
406 pthread_mutex_unlock(&globalLock);
407 return NULL;
408}
409
410// Return Set node ptr for specified set or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700411static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set)
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700412{
413 pthread_mutex_lock(&globalLock);
414 REGION_NODE* pTrav = g_pRegionHead;
415 while (pTrav) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700416 SET_NODE* pSet = pTrav->pSets;
417 while (pSet) {
418 if (pSet->set == set) {
419 pthread_mutex_unlock(&globalLock);
420 return pSet;
421 }
422 pSet = pSet->pNext;
423 }
424 pTrav = pTrav->pNext;
425 }
426 pthread_mutex_unlock(&globalLock);
427 return NULL;
428}
429
430static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) {
431 pthread_mutex_lock(&globalLock);
432 LAYOUT_NODE* pTrav = g_pLayoutHead;
433 while (pTrav) {
434 if (pTrav->layout == layout) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700435 pthread_mutex_unlock(&globalLock);
436 return pTrav;
437 }
438 pTrav = pTrav->pNext;
439 }
440 pthread_mutex_unlock(&globalLock);
441 return NULL;
442}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600443
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700444static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct)
445{
446 switch (pUpdateStruct->sType)
447 {
448 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
449 return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index;
450 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
451 return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index;
452 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
453 return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index;
454 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
455 return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index;
456 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
457 return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex;
458 default:
459 // TODO : Flag specific error for this case
460 return 0;
461 }
462}
463
464static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct)
465{
466 switch (pUpdateStruct->sType)
467 {
468 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
469 return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index);
470 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
471 return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index);
472 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
473 return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index);
474 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
475 return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index);
476 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
477 // TODO : Need to understand this case better and make sure code is correct
478 return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex);
479 default:
480 // TODO : Flag specific error for this case
481 return 0;
482 }
483}
484
485// Verify that the descriptor type in the update struct matches what's expected by the layout
486static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, XGL_DESCRIPTOR_TYPE type)
487{
488 // First get actual type of update
489 XGL_DESCRIPTOR_TYPE actualType;
490 switch (pUpdateStruct->sType)
491 {
492 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
493 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER;
494 break;
495 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
496 actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
497 break;
498 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
499 actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType;
500 break;
501 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
502 actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType;
503 break;
504 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
505 actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType;
506 break;
507 default:
508 // TODO : Flag specific error for this case
509 return 0;
510 }
511 if (actualType == type)
512 return 1;
513 return 0;
514}
515
516// Verify that update region for this update does not exceed max layout index for this type
517static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx)
518{
519 if (getUpdateUpperBound(pUpdateStruct) > layoutIdx)
520 return 0;
521 return 1;
522}
523
524// Determine the update type, allocate a new struct of that type, shadow the given pUpdate
525// struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER
526static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
527{
528 GENERIC_HEADER* pNewNode = NULL;
529 uint32_t array_size = 0;
530 switch (pUpdate->sType)
531 {
532 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
533 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS));
534 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS));
535 array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count;
536 ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size);
537 memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size);
538 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
539 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
540 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES));
541 array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count;
542 ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size);
543 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) {
544 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));
545 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
546 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));
547 }
548 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
549 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
550 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
551 array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
552 ((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO*)malloc(array_size);
553 memcpy((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews, ((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews, array_size);
554 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
555 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
556 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
557 array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * ((XGL_UPDATE_BUFFERS*)pNewNode)->count;
558 ((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO*)malloc(array_size);
559 memcpy((XGL_BUFFER_VIEW_ATTACH_INFO*)((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews, ((XGL_UPDATE_BUFFERS*)pUpdate)->pBufferViews, array_size);
560 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
561 pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
562 memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY));
563 default:
564 // TODO : Flag specific error for this case
565 return NULL;
566 }
567 // Make sure that pNext for the shadow copy is NULL
568 pNewNode->pNext = NULL;
569 return pNewNode;
570}
571// For given ds, update it's mapping based on pUpdateChain linked-list
572static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain)
573{
574 SET_NODE* pSet = getSetNode(ds);
575 LAYOUT_NODE* pLayout = pSet->pLayouts;
576 XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pCIList = NULL;
577 uint32_t layoutIdx = pCIList->count;
578 GENERIC_HEADER* pUpdates = pUpdateChain;
579 // Perform all updates
580 while (pUpdates) {
581 pCIList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList;
582 // For each update first find the layout section that it overlaps
583 while (layoutIdx < getUpdateIndex(pUpdates)) {
584 pCIList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCIList->pNext;
585 layoutIdx += pCIList->count;
586 }
587 // Now verify that update is of the right type
588 if (!validateUpdateType(pUpdates, pCIList->descriptorType)) {
589 char str[1024];
590 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));
591 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str);
592 }
593 else { // TODO : should we skip update on a type mismatch or force it?
594 // Next verify that update is correct size
595 if (!validateUpdateSize(pUpdates, layoutIdx)) {
596 char str[1024];
597 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} "));
598 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str);
599 }
600 else {
601 // Finally perform the update
602 // TODO : Info message that update successful
603 GENERIC_HEADER* pUpdateInsert = pSet->pUpdateStructs;
604 GENERIC_HEADER* pPrev = pUpdateInsert;
605 // Create new update struct for this set's shadow copy
606 GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates);
607 if (NULL == pNewNode) {
608 char str[1024];
609 sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()");
610 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
611 }
612 else {
613 if (!pUpdateInsert) {
614 pSet->pUpdateStructs = pNewNode;
615 }
616 else {
617 // Find either the existing, matching region, or end of list for initial update chain
618 // TODO : Need to validate this, I suspect there are holes in my algorithm
619 uint32_t totalIndex = 0;
620 while (pUpdateInsert && (getUpdateIndex(pUpdates) != totalIndex)) {
621 totalIndex = getUpdateUpperBound(pUpdates);
622 pPrev = pUpdateInsert;
623 pUpdateInsert = (GENERIC_HEADER*)pUpdateInsert->pNext;
624 }
625 pPrev->pNext = pNewNode;
626 }
627 }
628 }
629 }
630 pUpdates = (GENERIC_HEADER*)pUpdates->pNext;
631 }
632}
633// Free a shadowed update node
634static void freeShadowUpdateNode(GENERIC_HEADER* pUpdate)
635{
636 switch (pUpdate->sType)
637 {
638 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
639 free((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers);
640 free(pUpdate);
641 break;
642 case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
643 for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->count; i++) {
644 free((XGL_IMAGE_VIEW_ATTACH_INFO*)(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i].pImageView));
645 }
646 free((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews);
647 free(pUpdate);
648 break;
649 case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
650 free((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews);
651 free(pUpdate);
652 break;
653 case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
654 free((XGL_BUFFER_VIEW_ATTACH_INFO*)((XGL_UPDATE_BUFFERS*)pUpdate)->pBufferViews);
655 free(pUpdate);
656 break;
657 case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
658 free(pUpdate);
659 break;
660 default:
661 // TODO : Flag specific error for this case
662 break;
663 }
664}
665// Currently clearing a set it removing all previous updates to that set
666// TODO : Validate if this is correct clearing behavior
667static void clearDescriptorSet(XGL_DESCRIPTOR_SET set)
668{
669 SET_NODE* pSet = getSetNode(set);
670 if (!pSet) {
671 // TODO : Return error
672 }
673 else {
674 GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
675 GENERIC_HEADER* pFreeMe = pUpdate;
676 while (pUpdate) {
677 pFreeMe = pUpdate;
678 pUpdate = (GENERIC_HEADER*)pUpdate->pNext;
679 freeShadowUpdateNode(pFreeMe);
680 }
681 }
682}
683
684static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region)
685{
686 REGION_NODE* pRegion = getRegionNode(region);
687 if (!pRegion) {
688 char str[1024];
689 sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region);
690 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str);
691 }
692 else
693 {
694 // For every set off of this region, clear it
695 SET_NODE* pSet = pRegion->pSets;
696 while (pSet) {
697 clearDescriptorSet(pSet->set);
698 }
699 }
700}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600701// Return DS Head ptr for specified ds or else NULL
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700702/*
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600703static DS_LL_HEAD* getDS(XGL_DESCRIPTOR_SET ds)
704{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700705 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600706 DS_LL_HEAD *pTrav = pDSHead;
707 while (pTrav) {
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700708 if (pTrav->dsID == ds) {
Ian Elliott81ac44c2015-01-13 17:52:38 -0700709 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600710 return pTrav;
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700711 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600712 pTrav = pTrav->pNextDS;
713 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700714 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600715 return NULL;
716}
717
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600718// Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorSetUpdate() call sequence, otherwise XGL_FALSE
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600719static bool32_t dsUpdate(XGL_DESCRIPTOR_SET ds)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600720{
721 DS_LL_HEAD *pTrav = getDS(ds);
722 if (pTrav)
723 return pTrav->updateActive;
724 return XGL_FALSE;
725}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700726*/
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600727
728// Clear specified slotCount DS Slots starting at startSlot
Tobin Ehlis9e142a32014-11-21 12:04:39 -0700729// Return XGL_TRUE if DS exists and is successfully cleared to 0s
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700730/*
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600731static bool32_t clearDS(XGL_DESCRIPTOR_SET descriptorSet, uint32_t startSlot, uint32_t slotCount)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600732{
733 DS_LL_HEAD *pTrav = getDS(descriptorSet);
Ian Elliott81ac44c2015-01-13 17:52:38 -0700734 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600735 if (!pTrav || ((startSlot + slotCount) > pTrav->numSlots)) {
736 // TODO : Log more meaningful error here
Ian Elliott81ac44c2015-01-13 17:52:38 -0700737 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600738 return XGL_FALSE;
739 }
740 for (uint32_t i = startSlot; i < slotCount; i++) {
741 memset((void*)&pTrav->dsSlot[i], 0, sizeof(DS_SLOT));
742 }
Ian Elliott81ac44c2015-01-13 17:52:38 -0700743 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600744 return XGL_TRUE;
745}
746
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600747static void dsSetMapping(DS_SLOT* pSlot, uint32_t mapping)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600748{
749 pSlot->mappingMask |= mapping;
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600750 pSlot->activeMapping = mapping;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600751}
Tobin Ehlise79df942014-11-18 16:38:08 -0700752// Populate pStr w/ a string noting all of the slot mappings based on mapping flag
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700753static char* noteSlotMapping(uint32_t32 mapping, char *pStr)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600754{
755 if (MAPPING_MEMORY & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700756 strcat(pStr, "\n\tMemory View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600757 if (MAPPING_IMAGE & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700758 strcat(pStr, "\n\tImage View previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600759 if (MAPPING_SAMPLER & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700760 strcat(pStr, "\n\tSampler previously mapped");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600761 if (MAPPING_DS & mapping)
Tobin Ehlise79df942014-11-18 16:38:08 -0700762 strcat(pStr, "\n\tDESCRIPTOR SET ptr previously mapped");
763 return pStr;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600764}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700765*/
Tobin Ehlis56a61072014-11-21 08:58:46 -0700766// Print the last bound Gfx Pipeline
767static void printPipeline()
768{
769 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
770 if (!pPipeTrav) {
771 // nothing to print
772 }
773 else {
774 char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}");
775 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr);
776 }
777}
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700778// Dump subgraph w/ DS info
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700779/*
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700780static void dsDumpDot(FILE* pOutFile)
781{
782 const int i = 0; // hard-coding to just the first DS index for now
783 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700784 DS_LL_HEAD *pDS = getDS(lastBoundDS);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700785 if (pDS) {
786 fprintf(pOutFile, "subgraph DS_SLOTS\n{\nlabel=\"DS0 Slots\"\n");
787 // First create simple array node as central DS reference point
788 fprintf(pOutFile, "\"DS0_MEMORY\" [\nlabel = <<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"ds2\">DS0 Memory</TD></TR>");
789 uint32_t j;
790 char label[1024];
791 for (j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisf1c468a2014-12-09 17:00:33 -0700792 // Don't draw unused slots
793 if (0 != pDS->dsSlot[j].activeMapping)
794 fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", j, j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700795 }
796 fprintf(pOutFile, "</TABLE>>\n];\n");
797 // Now tie each slot to its info
798 for (j = 0; j < pDS->numSlots; j++) {
799 switch (pDS->dsSlot[j].activeMapping)
800 {
801 case MAPPING_MEMORY:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700802 sprintf(label, "MemAttachInfo Slot%u", j);
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700803 fprintf(pOutFile, "%s", xgl_gv_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].buffView, label));
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700804 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
805 break;
806 case MAPPING_IMAGE:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700807 sprintf(label, "ImageAttachInfo Slot%u", j);
808 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_attach_info(&pDS->dsSlot[j].imageView, label));
809 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
810 break;
811 case MAPPING_SAMPLER:
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700812 sprintf(label, "SamplerAttachInfo Slot%u", j);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700813 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(getSamplerCreateInfo(pDS->dsSlot[j].sampler), label));
814 fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
815 break;
816 default:
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700817 skipUnusedCount++;
818 break;
819 }
820
821 }
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700822 fprintf(pOutFile, "}\n");
823 }
824}
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700825*/
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700826// Dump a GraphViz dot file showing the pipeline
827static void dumpDotFile(char *outFileName)
828{
829 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
830 if (pPipeTrav) {
831 FILE* pOutFile;
832 pOutFile = fopen(outFileName, "w");
833 fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
834 fprintf(pOutFile, "subgraph PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
835 fprintf(pOutFile, "%s", xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"));
836 fprintf(pOutFile, "}\n");
837 // TODO : Add dynamic state dump here
838 fprintf(pOutFile, "subgraph dynamicState\n{\nlabel=\"Non-Orthogonal XGL State\"\n");
839 for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700840 if (g_pLastBoundDynamicState[i]) {
841 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 -0700842 }
843 }
844 fprintf(pOutFile, "}\n"); // close dynamicState subgraph
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700845 //dsDumpDot(pOutFile);
Tobin Ehlisa701ef02014-11-27 15:43:39 -0700846 fprintf(pOutFile, "}\n"); // close main graph "g"
847 fclose(pOutFile);
848 }
849}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600850// Synch up currently bound pipeline settings with DS mappings
851static void synchDSMapping()
852{
853 // First verify that we have a bound pipeline
854 PIPELINE_NODE *pPipeTrav = getPipeline(lastBoundPipeline);
Tobin Ehlise79df942014-11-18 16:38:08 -0700855 char str[1024];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600856 if (!pPipeTrav) {
Tobin Ehlise79df942014-11-18 16:38:08 -0700857 sprintf(str, "Can't find last bound Pipeline %p!", (void*)lastBoundPipeline);
858 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600859 }
860 else {
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700861 // Synch Descriptor Set Mapping
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700862 //for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700863/*
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600864 DS_LL_HEAD *pDS;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700865 if (lastBoundDS) {
866 pDS = getDS(lastBoundDS);
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600867 if (!pDS) {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700868 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS?", (void*)lastBoundDS);
Tobin Ehlise79df942014-11-18 16:38:08 -0700869 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600870 }
871 else { // We have a good DS & Pipeline, store pipeline mappings in DS
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700872 uint32_t slotOffset = lastBoundSlotOffset;
Tobin Ehlis26092022014-11-20 09:49:17 -0700873 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700874 if (pPipeTrav->dsMapping[j].count > (pDS->numSlots - slotOffset)) {
875 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 -0700876 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_DS_SLOT_NUM_MISMATCH, "DS", str);
877 }
878 else {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700879 for (uint32_t r = 0; r < pPipeTrav->dsMapping[j].count; r++) {
880 pDS->dsSlot[r+slotOffset].shaderSlotInfo[j] = pPipeTrav->dsMapping[j].pShaderMappingSlot[r];
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600881 }
882 }
883 }
884 }
885 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600886 else {
Tobin Ehlis21042792014-11-24 16:06:04 -0700887 // Verify that no shader is mapping this DS
888 uint32_t dsUsed = 0;
889 for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700890 if (pPipeTrav->dsMapping[j].count > 0) {
Tobin Ehlis21042792014-11-24 16:06:04 -0700891 dsUsed = 1;
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700892 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 -0700893 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
894 }
895 }
896 if (0 == dsUsed) {
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700897 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 -0700898 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str);
899 }
Tobin Ehlis0f051a52014-10-24 13:03:56 -0600900 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700901*/
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700902 //}
Tobin Ehlis1affd3c2014-11-25 10:24:15 -0700903 // Verify Vtx binding
904 if (MAX_BINDING != lastVtxBinding) {
905 if (lastVtxBinding >= pPipeTrav->vtxBindingCount) {
906 sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", lastVtxBinding, (pPipeTrav->vtxBindingCount - 1));
907 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str);
908 }
909 else {
910 char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[lastVtxBinding], "{DS}INFO : ");
911 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr);
912 free(tmpStr);
913 }
914 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600915 }
916}
917
918// Print details of DS config to stdout
919static void printDSConfig()
920{
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700921 uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
Tobin Ehlise79df942014-11-18 16:38:08 -0700922 char tmp_str[1024];
923 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 -0600924 for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600925 if (lastBoundDS[i]) {
926 DS_LL_HEAD *pDS = getDS(lastBoundDS[i]);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600927 uint32_t slotOffset = lastBoundSlotOffset[i];
Tobin Ehlisb8154982014-10-27 14:53:17 -0600928 if (pDS) {
Tobin Ehliseacc64f2014-11-24 17:09:09 -0700929 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 -0700930 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600931 for (uint32_t j = 0; j < pDS->numSlots; j++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600932 switch (pDS->dsSlot[j].activeMapping)
933 {
934 case MAPPING_MEMORY:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700935 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700936 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
937 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700938 skipUnusedCount = 0;
939 }
Tobin Ehlis2f3726c2015-01-15 17:51:52 -0700940 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 -0700941 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600942 break;
943 case MAPPING_IMAGE:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700944 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700945 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
946 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700947 skipUnusedCount = 0;
948 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700949 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, " "));
950 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600951 break;
952 case MAPPING_SAMPLER:
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700953 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700954 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
955 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700956 skipUnusedCount = 0;
957 }
Tobin Ehlis5a1d9f32014-11-20 10:48:56 -0700958 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 -0700959 strcat(ds_config_str, tmp_str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600960 break;
961 default:
Tobin Ehlise79df942014-11-18 16:38:08 -0700962 if (!skipUnusedCount) {// only report start of unused sequences
963 sprintf(tmp_str, "----Skipping slot(s) w/o a view attached...\n");
964 strcat(ds_config_str, tmp_str);
965 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700966 skipUnusedCount++;
Tobin Ehlisb8154982014-10-27 14:53:17 -0600967 break;
968 }
Tobin Ehlis9e3d7532014-10-27 17:12:54 -0600969 // For each shader type, check its mapping
Tobin Ehlis26092022014-11-20 09:49:17 -0700970 for (uint32_t k = 0; k < XGL_NUM_GRAPHICS_SHADERS; k++) {
Tobin Ehlisb8154982014-10-27 14:53:17 -0600971 if (XGL_SLOT_UNUSED != pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType) {
Tobin Ehlis26092022014-11-20 09:49:17 -0700972 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 -0700973 strcat(ds_config_str, tmp_str);
Tobin Ehlis41415bb2015-01-22 10:45:21 -0700974 //verifyShaderSlotMapping(j, pDS->dsSlot[j].activeMapping, k, pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600975 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600976 }
977 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700978 if (0 != skipUnusedCount) {// finish sequence of unused slots
Tobin Ehlise79df942014-11-18 16:38:08 -0700979 sprintf(tmp_str, "----Skipped %u slot%s w/o a view attached...\n", skipUnusedCount, (1 != skipUnusedCount) ? "s" : "");
980 strcat(ds_config_str, tmp_str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700981 skipUnusedCount = 0;
982 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600983 }
Tobin Ehlisb8154982014-10-27 14:53:17 -0600984 else {
Tobin Ehlise79df942014-11-18 16:38:08 -0700985 char str[1024];
986 sprintf(str, "Can't find last bound DS %p. Did you need to bind DS to index %u?", (void*)lastBoundDS[i], i);
987 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -0600988 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600989 }
990 }
Tobin Ehlise79df942014-11-18 16:38:08 -0700991 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -0600992}
993
994static void synchAndPrintDSConfig()
995{
996 synchDSMapping();
997 printDSConfig();
Tobin Ehlis56a61072014-11-21 08:58:46 -0700998 printPipeline();
999 printDynamicState();
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001000 static int autoDumpOnce = 1;
1001 if (autoDumpOnce) {
1002 autoDumpOnce = 0;
1003 dumpDotFile("pipeline_dump.dot");
Tobin Ehlis266473d2014-12-16 17:34:50 -07001004 // Convert dot to png if dot available
Ian Elliott81ac44c2015-01-13 17:52:38 -07001005#if defined(_WIN32)
1006// FIXME: NEED WINDOWS EQUIVALENT
1007#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07001008 if(access( "/usr/bin/dot", X_OK) != -1) {
1009 system("/usr/bin/dot pipeline_dump.dot -Tpng -o pipeline_dump.png");
1010 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001011#endif // WIN32
Tobin Ehlisa701ef02014-11-27 15:43:39 -07001012 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001013}
1014
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001015static void initDrawState()
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001016{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001017 const char *strOpt;
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001018 // initialize DrawState options
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001019 strOpt = getLayerOption("DrawStateReportLevel");
1020 if (strOpt != NULL)
1021 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001022
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001023 strOpt = getLayerOption("DrawStateDebugAction");
1024 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -07001025 g_debugAction = atoi(strOpt);
1026
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001027 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
1028 {
1029 strOpt = getLayerOption("DrawStateLogFilename");
1030 if (strOpt)
1031 {
1032 g_logFile = fopen(strOpt, "w");
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001033 }
1034 if (g_logFile == NULL)
1035 g_logFile = stdout;
1036 }
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001037 // initialize Layer dispatch table
1038 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001039 xglGetProcAddrType fpNextGPA;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001040 fpNextGPA = pCurObj->pGPA;
1041 assert(fpNextGPA);
1042
Chia-I Wu0f65b1e2015-01-04 23:11:43 +08001043 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
1044
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001045 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001046 nextTable.GetProcAddr = fpGetProcAddr;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001047
1048 if (!globalLockInitialized)
1049 {
1050 // TODO/TBD: Need to delete this mutex sometime. How??? One
1051 // suggestion is to call this during xglCreateInstance(), and then we
1052 // can clean it up during xglDestroyInstance(). However, that requires
1053 // that the layer have per-instance locks. We need to come back and
1054 // address this soon.
1055 loader_platform_thread_create_mutex(&globalLock);
1056 globalLockInitialized = 1;
1057 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001058}
1059
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001060XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
1061{
1062 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
1063 return result;
1064}
1065
1066XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
1067{
1068 XGL_RESULT result = nextTable.DestroyInstance(instance);
1069 return result;
1070}
1071
1072XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
1073{
1074 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
1075 return result;
1076}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001077
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001078XGL_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 -06001079{
1080 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001081 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001082 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001083 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001084 return result;
1085}
1086
1087XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1088{
1089 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001090 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001091 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001092 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001093 return result;
1094}
1095
1096XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1097{
1098 XGL_RESULT result = nextTable.DestroyDevice(device);
1099 return result;
1100}
1101
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001102XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001103{
1104 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001105 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001106 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001107 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001108 return result;
1109}
1110
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001111XGL_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 -06001112{
Jon Ashburn451c16f2014-11-25 11:08:42 -07001113 if (gpu != NULL)
1114 {
1115 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1116 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001117 loader_platform_thread_once(&g_initOnce, initDrawState);
Mark Lobodzinski953a1692015-01-09 15:12:03 -06001118 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001119 return result;
1120 } else
1121 {
1122 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1123 return XGL_ERROR_INVALID_POINTER;
1124 // This layer compatible with all GPUs
1125 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +08001126 strncpy((char *) pOutLayers[0], "DrawState", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -07001127 return XGL_SUCCESS;
1128 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001129}
1130
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001131XGL_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 -06001132{
1133 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1134 return result;
1135}
1136
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001137XGL_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 -06001138{
1139 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence);
1140 return result;
1141}
1142
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001143XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001144{
1145 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1146 return result;
1147}
1148
1149XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1150{
1151 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1152 return result;
1153}
1154
1155XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1156{
1157 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1158 return result;
1159}
1160
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001161XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1162{
1163 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1164 return result;
1165}
1166
1167XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1168{
1169 XGL_RESULT result = nextTable.FreeMemory(mem);
1170 return result;
1171}
1172
1173XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1174{
1175 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1176 return result;
1177}
1178
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001179XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001180{
1181 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1182 return result;
1183}
1184
1185XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1186{
1187 XGL_RESULT result = nextTable.UnmapMemory(mem);
1188 return result;
1189}
1190
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001191XGL_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 -06001192{
1193 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1194 return result;
1195}
1196
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001197XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1198{
1199 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001200 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001201 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001202 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001203 return result;
1204}
1205
1206XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1207{
1208 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1209 return result;
1210}
1211
1212XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1213{
1214 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1215 return result;
1216}
1217
1218XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1219{
1220 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1221 return result;
1222}
1223
1224XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1225{
1226 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1227 return result;
1228}
1229
1230XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1231{
1232 XGL_RESULT result = nextTable.DestroyObject(object);
1233 return result;
1234}
1235
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001236XGL_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 -06001237{
1238 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1239 return result;
1240}
1241
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001242XGL_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 -06001243{
Jon Ashburned62b412015-01-15 10:39:19 -07001244 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001245 return result;
1246}
1247
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001248XGL_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)
1249{
1250 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1251 return result;
1252}
1253
1254XGL_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)
1255{
1256 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1257 return result;
1258}
1259
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001260XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1261{
1262 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1263 return result;
1264}
1265
1266XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1267{
1268 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1269 return result;
1270}
1271
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001272XGL_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 -06001273{
1274 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1275 return result;
1276}
1277
1278XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1279{
1280 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1281 return result;
1282}
1283
1284XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1285{
1286 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1287 return result;
1288}
1289
1290XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1291{
1292 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1293 return result;
1294}
1295
1296XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1297{
1298 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1299 return result;
1300}
1301
1302XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1303{
1304 XGL_RESULT result = nextTable.GetEventStatus(event);
1305 return result;
1306}
1307
1308XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1309{
1310 XGL_RESULT result = nextTable.SetEvent(event);
1311 return result;
1312}
1313
1314XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1315{
1316 XGL_RESULT result = nextTable.ResetEvent(event);
1317 return result;
1318}
1319
1320XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1321{
1322 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1323 return result;
1324}
1325
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001326XGL_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 -06001327{
1328 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1329 return result;
1330}
1331
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001332XGL_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 -06001333{
1334 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1335 return result;
1336}
1337
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001338XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1339{
1340 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001341 if (XGL_SUCCESS == result) {
1342 pthread_mutex_lock(&globalLock);
1343 BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
1344 pNewNode->buffer = *pBuffer;
1345 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
1346 pNewNode->pNext = g_pBufferHead;
1347 g_pBufferHead = pNewNode;
1348 pthread_mutex_unlock(&globalLock);
1349 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001350 return result;
1351}
1352
1353XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1354{
1355 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1356 return result;
1357}
1358
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001359XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1360{
1361 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1362 return result;
1363}
1364
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001365XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1366{
1367 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1368 return result;
1369}
1370
1371XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1372{
1373 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1374 return result;
1375}
1376
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001377XGL_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 -06001378{
1379 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1380 return result;
1381}
1382
1383XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1384{
1385 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001386 if (XGL_SUCCESS == result) {
1387 pthread_mutex_lock(&globalLock);
1388 IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE));
1389 pNewNode->image = *pView;
1390 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO));
1391 pNewNode->pNext = g_pImageHead;
1392 g_pImageHead = pNewNode;
1393 pthread_mutex_unlock(&globalLock);
1394 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001395 return result;
1396}
1397
1398XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1399{
1400 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1401 return result;
1402}
1403
1404XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1405{
1406 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1407 return result;
1408}
1409
1410XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1411{
1412 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1413 return result;
1414}
1415
1416XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1417{
1418 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1419 // Create LL HEAD for this Pipeline
Tobin Ehlise79df942014-11-18 16:38:08 -07001420 char str[1024];
1421 sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline);
1422 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001423 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001424 PIPELINE_NODE *pTrav = g_pPipelineHead;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001425 if (pTrav) {
1426 while (pTrav->pNext)
1427 pTrav = pTrav->pNext;
1428 pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
1429 pTrav = pTrav->pNext;
1430 }
1431 else {
1432 pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001433 g_pPipelineHead = pTrav;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001434 }
1435 memset((void*)pTrav, 0, sizeof(PIPELINE_NODE));
1436 pTrav->pipeline = *pPipeline;
1437 initPipeline(pTrav, pCreateInfo);
Ian Elliott81ac44c2015-01-13 17:52:38 -07001438 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001439 return result;
1440}
1441
1442XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1443{
1444 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1445 return result;
1446}
1447
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001448XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001449{
1450 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1451 return result;
1452}
1453
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001454XGL_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 -06001455{
1456 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1457 return result;
1458}
1459
1460XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1461{
1462 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1463 return result;
1464}
1465
1466XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1467{
1468 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001469 if (XGL_SUCCESS == result) {
Ian Elliott81ac44c2015-01-13 17:52:38 -07001470 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001471 SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE));
1472 pNewNode->sampler = *pSampler;
1473 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO));
1474 pNewNode->pNext = g_pSamplerHead;
1475 g_pSamplerHead = pNewNode;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001476 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001477 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001478 return result;
1479}
1480
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001481XGL_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)
1482{
1483 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1484 if (XGL_SUCCESS == result) {
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001485 // Create new layout node off of prior layout
1486 LAYOUT_NODE* pTopLayout = getLayoutNode(g_pLayoutHead);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001487 LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE));
1488 if (NULL == pNewNode) {
1489 char str[1024];
1490 sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()");
1491 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1492 }
1493 memset(pNewNode, 0, sizeof(LAYOUT_NODE));
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001494 // TODO : API Currently missing a count here that we should multiply by struct size
1495 pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1496 memcpy(pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));
1497 pNewNode->layout = *pSetLayout;
1498 pNewNode->stageFlags = stageFlag;
1499 LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout);
1500 // Point to prior node or NULL if no prior node
1501 // TODO : Flag an internal error here if priorNode was not NULL, but we still get a NULL LAYOUT_NODE
1502 pNewNode->pPriorSetLayout = pPriorNode;
1503 // Put new node at Head of global Layer list
1504 pNewNode->pNext = pTopLayout;
1505 g_pLayoutHead = pNewNode;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001506 }
1507 return result;
1508}
1509
1510XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
1511{
1512 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1513 if (XGL_SUCCESS == result) {
1514 if (!g_pRegionHead) {
1515 char str[1024];
1516 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1517 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1518 }
1519 else {
1520 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1521 if (!pRegionNode) {
1522 char str[1024];
1523 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1524 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1525 }
1526 else {
1527 pRegionNode->updateActive = 1;
1528 }
1529 }
1530 }
1531 return result;
1532}
1533
1534XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
1535{
1536 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1537 if (XGL_SUCCESS == result) {
1538 if (!g_pRegionHead) {
1539 char str[1024];
1540 sprintf(str, "No descriptor region found! Global descriptor region is NULL!");
1541 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_NO_DS_REGION, "DS", str);
1542 }
1543 else {
1544 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1545 if (!pRegionNode) {
1546 char str[1024];
1547 sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead);
1548 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str);
1549 }
1550 else {
1551 if (!pRegionNode->updateActive) {
1552 char str[1024];
1553 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!");
1554 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str);
1555 }
1556 else {
1557 pRegionNode->updateActive = 0;
1558 }
1559 }
1560 }
1561 }
1562 return result;
1563}
1564
1565XGL_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)
1566{
1567 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1568 if (XGL_SUCCESS == result) {
1569 // Insert this region into Global Region LL at head
1570 char str[1024];
1571 sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion);
1572 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str);
1573 pthread_mutex_lock(&globalLock);
1574 REGION_NODE *pTrav = g_pRegionHead;
1575 REGION_NODE pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE));
1576 if (NULL == pNewNode) {
1577 char str[1024];
1578 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
1579 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1580 }
1581 else {
1582 memset(pNewNode, 0, sizeof(REGION_NODE));
1583 pNewNode->pNext = g_pRegionHead;
1584 g_pRegionHead = pNewNode;
1585 memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO));
1586 pNewNode->regionUsage = regionUsage;
1587 pNewNode->updateActive = 0;
1588 pNewNode->maxSets = maxSets;
1589 pNewNode->region = *pDescriptorRegion;
1590 }
1591 pthread_mutex_unlock(&globalLock);
1592 }
1593 else {
1594 // Need to do anything if region create fails?
1595 }
1596 return result;
1597}
1598
1599XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
1600{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001601 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001602 if (XGL_SUCCESS == result) {
1603 clearDescriptorRegion(descriptorRegion);
1604 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001605 return result;
1606}
1607
1608XGL_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)
1609{
1610 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001611 if ((XGL_SUCCESS == result) || (*pCount > 0)) {
1612 REGION_NODE *pRegionNode = getRegionNode(descriptorRegion);
1613 if (!pRegionNode) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001614 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001615 sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion);
1616 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descrtiptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str);
1617 }
1618 else {
1619 for (uint32_t i; i < *pCount; i++) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001620 char str[1024];
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001621 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]);
1622 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSet[i], 0, DRAWSTATE_NONE, "DS", str);
1623 pthread_mutex_lock(&globalLock);
1624 // Create new set node and add to head of region nodes
1625 SET_NODE pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE));
1626 if (NULL == pNewNode) {
1627 char str[1024];
1628 sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()");
1629 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pDescriptorSet[i], 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str);
1630 }
1631 else {
1632 memset(pNewNode, 0, sizeof(SET_NODE));
1633 // Insert set at head of Set LL for this region
1634 pNewNode->pNext = pRegionNode->pSets;
1635 pRegionNode->pSets = pNewNode;
1636 LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]);
1637 if (NULL == pLayout) {
1638 char str[1024];
1639 sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]);
1640 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str);
1641 }
1642 pNewNode->pLayouts = pLayout;
1643 pNewNode->region = descriptorRegion;
1644 pNewNode->set = pDescriptorSets[i];
1645 pNewNode->setUsage = setUsage;
1646 pNewNode->descriptorCount = ;
1647 }
1648 pthread_mutex_unlock(&globalLock);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001649 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001650 }
1651 }
1652 return result;
1653}
1654
1655XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
1656{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001657 for (uint32_t i = 0; i < count; i++) {
1658 clearDescriptorSet(descriptorSets[i]);
1659 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001660 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
1661}
1662
1663XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
1664{
1665 REGION_NODE* pRegionNode = getRegionNode(g_pRegionHead);
1666 if (!pRegionNode->updateActive) {
1667 char str[1024];
1668 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!");
1669 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str);
1670 }
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001671 else {
1672 // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors
1673 dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain);
1674 }
1675
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001676 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
1677}
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001678
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001679XGL_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 -06001680{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001681 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001682 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001683 return result;
1684}
1685
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001686XGL_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 -06001687{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001688 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001689 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001690 return result;
1691}
1692
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001693XGL_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 -06001694{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001695 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001696 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001697 return result;
1698}
1699
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001700XGL_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 -06001701{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001702 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001703 insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001704 return result;
1705}
1706
1707XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1708{
1709 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1710 return result;
1711}
1712
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001713XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001714{
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001715 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001716 return result;
1717}
1718
1719XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1720{
1721 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1722 return result;
1723}
1724
1725XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1726{
1727 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1728 return result;
1729}
1730
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001731XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001732{
1733 if (getPipeline(pipeline)) {
1734 lastBoundPipeline = pipeline;
1735 }
1736 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001737 char str[1024];
1738 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
1739 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001740 }
1741 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1742}
1743
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001744XGL_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 -06001745{
1746 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1747}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001748/*
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001749
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001750XGL_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 -06001751{
1752 if (getDS(descriptorSet)) {
Tobin Ehlisb8154982014-10-27 14:53:17 -06001753 assert(index < XGL_MAX_DESCRIPTOR_SETS);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001754 if (dsUpdate(descriptorSet)) {
1755 char str[1024];
1756 sprintf(str, "You must call xglEndDescriptorSetUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet);
1757 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str);
1758 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07001759 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001760 lastBoundDS[index] = descriptorSet;
Tobin Ehliseacc64f2014-11-24 17:09:09 -07001761 lastBoundSlotOffset[index] = slotOffset;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001762 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlise79df942014-11-18 16:38:08 -07001763 char str[1024];
1764 sprintf(str, "DS %p bound to DS index %u on pipeline %s", (void*)descriptorSet, index, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint));
1765 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001766 }
1767 else {
Tobin Ehlise79df942014-11-18 16:38:08 -07001768 char str[1024];
1769 sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet);
1770 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_DS, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001771 }
1772 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, index, descriptorSet, slotOffset);
1773}
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001774*/
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001775
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001776
1777XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
1778{
1779 setLastBoundDynamicState(state, stateBindPoint);
1780 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
1781}
1782
1783XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
1784{
Tobin Ehlis41415bb2015-01-22 10:45:21 -07001785 // TODO : Improve this. Can track per-cmd buffer and store bind point and pUserData
1786 g_lastBoundDS = descriptorSet;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001787 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
1788}
1789
1790XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
1791{
1792 lastIdxBinding = binding;
1793 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
1794}
1795
1796XGL_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 +08001797{
Tobin Ehlis1affd3c2014-11-25 10:24:15 -07001798 lastVtxBinding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001799 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001800}
1801
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001802XGL_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 -06001803{
Tobin Ehlise79df942014-11-18 16:38:08 -07001804 char str[1024];
1805 sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", drawCount[DRAW]++);
1806 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001807 synchAndPrintDSConfig();
1808 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1809}
1810
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001811XGL_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 -06001812{
Tobin Ehlise79df942014-11-18 16:38:08 -07001813 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001814 sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001815 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001816 synchAndPrintDSConfig();
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001817 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1818}
1819
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001820XGL_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 -06001821{
Tobin Ehlise79df942014-11-18 16:38:08 -07001822 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001823 sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001824 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001825 synchAndPrintDSConfig();
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001826 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001827}
1828
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001829XGL_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 -06001830{
Tobin Ehlise79df942014-11-18 16:38:08 -07001831 char str[1024];
Tobin Ehlis62086412014-11-19 16:19:28 -07001832 sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", drawCount[DRAW_INDEXED_INDIRECT]++);
Tobin Ehlise79df942014-11-18 16:38:08 -07001833 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str);
Tobin Ehlisb8154982014-10-27 14:53:17 -06001834 synchAndPrintDSConfig();
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001835 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001836}
1837
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001838XGL_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 -06001839{
1840 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1841}
1842
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001843XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001844{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001845 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001846}
1847
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001848XGL_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 -06001849{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001850 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001851}
1852
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001853XGL_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 -06001854{
1855 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1856}
1857
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001858XGL_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 -06001859{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001860 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001861}
1862
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001863XGL_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 -06001864{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001865 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001866}
1867
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001868XGL_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 -06001869{
Mike Stroyan55658c22014-12-04 11:08:39 +00001870 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001871}
1872
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001873XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
1874{
1875 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
1876}
1877
1878XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
1879{
1880 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
1881}
1882
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001883XGL_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 -06001884{
1885 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1886}
1887
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001888XGL_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 -06001889{
1890 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1891}
1892
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001893XGL_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 -06001894{
1895 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1896}
1897
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001898XGL_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 -06001899{
1900 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1901}
1902
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001903XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001904{
Mike Stroyan55658c22014-12-04 11:08:39 +00001905 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001906}
1907
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001908XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001909{
1910 nextTable.CmdResetEvent(cmdBuffer, event);
1911}
1912
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001913XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00001914{
1915 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1916}
1917
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001918XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00001919{
1920 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1921}
1922
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001923XGL_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 -06001924{
1925 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1926}
1927
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001928XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001929{
1930 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1931}
1932
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001933XGL_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 -06001934{
1935 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1936}
1937
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001938XGL_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 -06001939{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001940 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001941}
1942
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001943XGL_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 -06001944{
1945 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1946}
1947
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001948XGL_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 -06001949{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001950 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001951}
1952
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001953XGL_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 -06001954{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001955 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1956}
1957
1958XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
1959{
1960 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
1961 return result;
1962}
1963
1964XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
1965{
1966 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
1967 return result;
1968}
1969
1970XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1971{
1972 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
1973}
1974
1975XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1976{
1977 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001978}
1979
1980XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1981{
1982 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1983 return result;
1984}
1985
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001986XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001987{
Tobin Ehlise79df942014-11-18 16:38:08 -07001988 // This layer intercepts callbacks
1989 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1990 if (!pNewDbgFuncNode)
1991 return XGL_ERROR_OUT_OF_MEMORY;
1992 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1993 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07001994 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1995 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06001996 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1997 return result;
1998}
1999
2000XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
2001{
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002002 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlise79df942014-11-18 16:38:08 -07002003 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
2004 while (pTrav) {
2005 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
2006 pPrev->pNext = pTrav->pNext;
Jon Ashburn2e9b5612014-12-22 13:38:27 -07002007 if (g_pDbgFunctionHead == pTrav)
2008 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlise79df942014-11-18 16:38:08 -07002009 free(pTrav);
2010 break;
2011 }
2012 pPrev = pTrav;
2013 pTrav = pTrav->pNext;
2014 }
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002015 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2016 return result;
2017}
2018
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002019XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002020{
2021 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2022 return result;
2023}
2024
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002025XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002026{
2027 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2028 return result;
2029}
2030
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002031XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002032{
2033 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2034 return result;
2035}
2036
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002037XGL_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 -06002038{
2039 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2040 return result;
2041}
2042
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002043XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002044{
2045 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2046}
2047
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002048XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002049{
2050 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2051}
2052
Ian Elliott81ac44c2015-01-13 17:52:38 -07002053#if defined(WIN32)
2054// FIXME: NEED WINDOWS EQUIVALENT
2055#else // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002056XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2057{
2058 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002059 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002060 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002061 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002062 return result;
2063}
2064
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002065XGL_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 -06002066{
Chia-I Wu6204f342014-11-07 13:33:45 +08002067 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002068 return result;
2069}
2070
2071XGL_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)
2072{
2073 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
2074 return result;
2075}
2076
2077XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2078{
2079 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2080 return result;
2081}
Ian Elliott81ac44c2015-01-13 17:52:38 -07002082#endif // WIN32
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002083
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002084void drawStateDumpDotFile(char* outFileName)
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002085{
2086 dumpDotFile(outFileName);
2087}
2088
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002089void drawStateDumpPngFile(char* outFileName)
Tobin Ehlis266473d2014-12-16 17:34:50 -07002090{
Ian Elliott81ac44c2015-01-13 17:52:38 -07002091#if defined(_WIN32)
2092// FIXME: NEED WINDOWS EQUIVALENT
2093 char str[1024];
2094 sprintf(str, "Cannot execute dot program yet on Windows.");
2095 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2096#else // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002097 char dotExe[32] = "/usr/bin/dot";
2098 if( access(dotExe, X_OK) != -1) {
2099 dumpDotFile("/tmp/tmp.dot");
2100 char dotCmd[1024];
2101 sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName);
2102 system(dotCmd);
2103 remove("/tmp/tmp.dot");
2104 }
2105 else {
2106 char str[1024];
2107 sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName);
2108 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str);
2109 }
Ian Elliott81ac44c2015-01-13 17:52:38 -07002110#endif // WIN32
Tobin Ehlis266473d2014-12-16 17:34:50 -07002111}
2112
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002113XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002114{
2115 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08002116 void *addr;
2117
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002118 if (gpu == NULL)
2119 return NULL;
2120 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002121 loader_platform_thread_once(&g_initOnce, initDrawState);
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002122
Chia-I Wu706533e2015-01-05 13:18:57 +08002123 addr = layer_intercept_proc(funcName);
2124 if (addr)
2125 return addr;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002126 else if (!strncmp("drawStateDumpDotFile", funcName, sizeof("drawStateDumpDotFile")))
Tobin Ehlisa701ef02014-11-27 15:43:39 -07002127 return drawStateDumpDotFile;
Chia-I Wu7461fcf2014-12-27 15:16:07 +08002128 else if (!strncmp("drawStateDumpPngFile", funcName, sizeof("drawStateDumpPngFile")))
Tobin Ehlis266473d2014-12-16 17:34:50 -07002129 return drawStateDumpPngFile;
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002130 else {
Tobin Ehlis8726b9f2014-10-24 12:01:45 -06002131 if (gpuw->pGPA == NULL)
2132 return NULL;
2133 return gpuw->pGPA(gpuw->nextObject, funcName);
2134 }
2135}