blob: 1be90a85314bc1b713e552e57ceeecb1a8b40320 [file] [log] [blame]
Tobin Ehlis6663f492014-11-10 12:29:12 -07001/*
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002 * Vulkan
Tobin Ehlis6663f492014-11-10 12:29:12 -07003 *
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05004 * Copyright (C) 2015 LunarG, Inc.
Tobin Ehlis6663f492014-11-10 12:29:12 -07005 *
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
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050017* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Tobin Ehlis6663f492014-11-10 12:29:12 -070018 * 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
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050025#include <inttypes.h>
Tobin Ehlis6663f492014-11-10 12:29:12 -070026#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29#include <assert.h>
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050030#include <list>
31#include <map>
32using namespace std;
33
Ian Elliott2d4ab1e2015-01-13 17:52:38 -070034#include "loader_platform.h"
Chia-I Wuaa4121f2015-01-04 23:11:43 +080035#include "xgl_dispatch_table_helper.h"
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050036#include "xgl_struct_string_helper_cpp.h"
Tobin Ehliscd9223b2014-11-19 16:19:28 -070037#include "mem_tracker.h"
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070038#include "layers_config.h"
Ian Elliott655cad72015-02-12 17:08:34 -070039// The following is #included again to catch certain OS-specific functions
40// being used:
41#include "loader_platform.h"
Jon Ashburn2e672892015-02-16 08:46:53 -070042#include "layers_msg.h"
Tobin Ehlis6663f492014-11-10 12:29:12 -070043
44static XGL_LAYER_DISPATCH_TABLE nextTable;
45static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -070046static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060047// TODO : This can be much smarter, using separate locks for separate global data
48static int globalLockInitialized = 0;
49static loader_platform_thread_mutex globalLock;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070050
Tobin Ehlisc145be82015-01-08 15:22:32 -070051#define MAX_BINDING 0xFFFFFFFF
Tobin Ehlisc145be82015-01-08 15:22:32 -070052
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050053map<XGL_CMD_BUFFER, MT_CB_INFO*> cbMap;
54map<XGL_GPU_MEMORY, MT_MEM_OBJ_INFO*> memObjMap;
55map<XGL_OBJECT, MT_OBJ_INFO*> objectMap;
56map<uint64_t, MT_FENCE_INFO*> fenceMap; // Map fenceId to fence node
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050057
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050058// TODO : Add support for per-queue and per-device fence completion
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050059static uint64_t g_currentFenceId = 1;
60static uint64_t g_lastRetiredId = 0;
61static XGL_DEVICE globalDevice = NULL;
Mark Lobodzinskic52b7752015-02-18 16:38:17 -060062
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050063// Add new CB node for this cb to map container
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050064static void insertCBInfo(const XGL_CMD_BUFFER cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -070065{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050066 MT_CB_INFO* pInfo = new MT_CB_INFO;
67 memset(pInfo, 0, (sizeof(MT_CB_INFO) - sizeof(list<XGL_GPU_MEMORY>)));
68 pInfo->cmdBuffer = cb;
69 cbMap[cb] = pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -070070}
71
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050072// Return ptr to node in CB map, or NULL if not found
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050073static MT_CB_INFO* getCBInfo(const XGL_CMD_BUFFER cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -070074{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050075 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050076 if (cbMap.find(cb) != cbMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050077 pCBInfo = cbMap[cb];
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060078 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050079 return pCBInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -070080}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060081
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050082// Add a fence, creating one if necessary to our list of fences/fenceIds
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050083static uint64_t addFenceInfo(XGL_FENCE fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050084{
85 // Create fence node
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050086 MT_FENCE_INFO* pFenceInfo = new MT_FENCE_INFO;
87 memset(pFenceInfo, 0, sizeof(MT_FENCE_INFO));
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050088 // If no fence, create an internal fence to track the submissions
89 if (fence == NULL) {
90 XGL_FENCE_CREATE_INFO fci;
91 fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
92 fci.pNext = NULL;
93 fci.flags = 0;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050094 nextTable.CreateFence(globalDevice, &fci, &pFenceInfo->fence);
95 pFenceInfo->localFence = XGL_TRUE;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050096 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050097 pFenceInfo->localFence = XGL_FALSE;
98 pFenceInfo->fence = fence;
Tobin Ehlis6663f492014-11-10 12:29:12 -070099 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500100 uint64_t fenceId = g_currentFenceId++;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500101 fenceMap[fenceId] = pFenceInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500102 return fenceId;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500103}
104
105// Remove a node from our list of fences/fenceIds
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500106static void deleteFenceInfo(uint64_t fenceId)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500107{
108 if (fenceId != 0) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500109 if (fenceMap.find(fenceId) != fenceMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500110 MT_FENCE_INFO* pDelInfo = fenceMap[fenceId];
111 if (pDelInfo->localFence == XGL_TRUE) {
112 nextTable.DestroyObject(pDelInfo->fence);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500113 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500114 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500115 fenceMap.erase(fenceId);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500116 }
117 }
118}
119
120// Search through list for this fence, deleting all nodes before it (with lower IDs) and updating lastRetiredId
121static void updateFenceTracking(XGL_FENCE fence)
122{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500123 MT_FENCE_INFO *pCurFenceInfo = NULL;
124 uint64_t fenceId = 0;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500125
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500126 for (map<uint64_t, MT_FENCE_INFO*>::iterator ii=fenceMap.begin(); ii!=fenceMap.end(); ++ii) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500127 if (fence == ((*ii).second)->fence) {
128 g_lastRetiredId = (*ii).first;
129 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500130 deleteFenceInfo((*ii).first);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500131 }
132 }
133}
134
135// Utility function that determines if a fenceId has been retired yet
136static bool32_t fenceRetired(uint64_t fenceId)
137{
138 bool32_t result = XGL_FALSE;
139 if (fenceId <= g_lastRetiredId) {
140 result = XGL_TRUE;
141 }
142 return result;
143}
144
145// Return the fence associated with a fenceId
146static XGL_FENCE getFenceFromId(uint64_t fenceId)
147{
148 XGL_FENCE fence = NULL;
149 if (fenceId != 0) {
150 // Search for a node with this fenceId
151 if (fenceId > g_lastRetiredId) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500152 if (fenceMap.find(fenceId) != fenceMap.end()) {
153 fence = (fenceMap[fenceId])->fence;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500154 }
155 }
156 }
157 return fence;
158}
159
160// Helper routine that updates the fence list to all-retired, as for Queue/DeviceWaitIdle
161static void retireAllFences(void)
162{
163 // In this case, we go throught the whole list, retiring each node and update the global retired ID until the list is empty
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500164 MT_FENCE_INFO* pDelInfo = NULL;
165 for (map<uint64_t, MT_FENCE_INFO*>::iterator ii=fenceMap.begin(); ii!=fenceMap.end(); ++ii) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500166 g_lastRetiredId = (*ii).first;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500167 deleteFenceInfo((*ii).first);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500168 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700169}
170
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600171static bool32_t validateCBMemRef(const XGL_CMD_BUFFER cb, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700172{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600173 bool32_t result = XGL_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500174 MT_CB_INFO* pInfo = getCBInfo(cb);
175 if (!pInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700176 char str[1024];
177 sprintf(str, "Unable to find node for CB %p in order to check memory references", (void*)cb);
178 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600179 result = XGL_FALSE;
180 } else {
181 // Validate that all actual references are accounted for in pMemRefs
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600182 uint32_t i;
183 uint8_t found = 0;
184 uint64_t foundCount = 0;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500185
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500186 for (list<XGL_GPU_MEMORY>::iterator it = pInfo->pMemObjList.begin(); it != pInfo->pMemObjList.end(); ++it) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600187 for (i = 0; i < memRefCount; i++) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500188 if ((*it) == pMemRefs[i].mem) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600189 char str[1024];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500190 sprintf(str, "Found Mem Obj %p binding to CB %p", (*it), cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600191 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
192 found = 1;
193 foundCount++;
194 break;
195 }
196 }
197 if (!found) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700198 char str[1024];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500199 sprintf(str, "Memory reference list for Command Buffer %p is missing ref to mem obj %p", cb, (*it));
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600200 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
201 result = XGL_FALSE;
202 }
203 found = 0;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600204 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500205
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600206 if (result == XGL_TRUE) {
207 char str[1024];
208 sprintf(str, "Verified all %lu memory dependencies for CB %p are included in pMemRefs list", foundCount, cb);
209 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500210 // TODO : Could report mem refs in pMemRefs that AREN'T in mem list, that would be primarily informational
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600211 // Currently just noting that there is a difference
212 if (foundCount != memRefCount) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500213 sprintf(str, "There are %u mem refs included in pMemRefs list, but only %lu are required", memRefCount, foundCount);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700214 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700215 }
216 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700217 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600218 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700219}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500220// Return ptr to node in map container containing mem, or NULL if not found
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700221// Calls to this function should be wrapped in mutex
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500222static MT_MEM_OBJ_INFO* getMemObjInfo(const XGL_GPU_MEMORY mem)
Tobin Ehlisc145be82015-01-08 15:22:32 -0700223{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500224 MT_MEM_OBJ_INFO* pMemObjInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500225
226 if (memObjMap.find(mem) != memObjMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500227 pMemObjInfo = memObjMap[mem];
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600228 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500229 return pMemObjInfo;
Tobin Ehlisc145be82015-01-08 15:22:32 -0700230}
231
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500232static void insertMemObjInfo(const XGL_GPU_MEMORY mem, const XGL_MEMORY_ALLOC_INFO* pAllocInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700233{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500234 MT_MEM_OBJ_INFO* pInfo = new MT_MEM_OBJ_INFO;
235 pInfo->refCount = 0;
236 memset(&pInfo->allocInfo, 0, sizeof(XGL_MEMORY_ALLOC_INFO));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500237
238 if (pAllocInfo) { // MEM alloc created by xglWsiX11CreatePresentableImage() doesn't have alloc info struct
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500239 memcpy(&pInfo->allocInfo, pAllocInfo, sizeof(XGL_MEMORY_ALLOC_INFO));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500240 // TODO: Update for real hardware, actually process allocation info structures
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500241 pInfo->allocInfo.pNext = NULL;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700242 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500243 pInfo->mem = mem;
244 memObjMap[mem] = pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700245}
246
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500247// Find CB Info and add mem binding to list container
248// Find Mem Obj Info and add CB binding to list container
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600249static bool32_t updateCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700250{
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500251 bool32_t result = XGL_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700252 // First update CB binding in MemObj mini CB list
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500253 MT_MEM_OBJ_INFO* pMemInfo = getMemObjInfo(mem);
254 if (!pMemInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700255 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500256 sprintf(str, "Trying to bind mem obj %p to CB %p but no info for that mem obj.\n Was it correctly allocated? Did it already get freed?", mem, cb);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700257 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600258 result = XGL_FALSE;
259 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500260 // Search for cmd buffer object in memory object's binding list
261 bool32_t found = XGL_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500262 for (list<XGL_CMD_BUFFER>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500263 if ((*it) == cb) {
264 found = XGL_TRUE;
265 break;
266 }
267 }
268 // If not present, add to list
269 if (found == XGL_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500270 pMemInfo->pCmdBufferBindings.push_front(cb);
271 pMemInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500272 }
273
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500274 // Now update CBInfo's Mem binding list
275 MT_CB_INFO* pCBInfo = getCBInfo(cb);
276 if (!pCBInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500277 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500278 sprintf(str, "Trying to bind mem obj %p to CB %p but no info for that CB. Was it CB incorrectly destroyed?", mem, cb);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500279 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
280 result = XGL_FALSE;
281 } else {
282 // Search for memory object in cmd buffer's binding list
283 bool32_t found = XGL_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500284 for (list<XGL_GPU_MEMORY>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500285 if ((*it) == mem) {
286 found = XGL_TRUE;
287 break;
288 }
289 }
290 // If not present, add to list
291 if (found == XGL_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500292 pCBInfo->pMemObjList.push_front(mem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600293 }
294 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700295 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600296 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700297}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600298
Tobin Ehlis6663f492014-11-10 12:29:12 -0700299// Clear the CB Binding for mem
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700300// Calls to this function should be wrapped in mutex
Tobin Ehlis6663f492014-11-10 12:29:12 -0700301static void clearCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
302{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500303 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700304 // TODO : Having this check is not ideal, really if mem node was deleted,
305 // its CB bindings should be cleared and then freeCBBindings wouldn't call
306 // us here with stale mem objs
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500307 if (pInfo) {
308 pInfo->pCmdBufferBindings.remove(cb);
309 pInfo->refCount--;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700310 }
311}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600312
Tobin Ehlis6663f492014-11-10 12:29:12 -0700313// Free bindings related to CB
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600314static bool32_t freeCBBindings(const XGL_CMD_BUFFER cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700315{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600316 bool32_t result = XGL_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500317 MT_CB_INFO* pCBInfo = getCBInfo(cb);
318 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700319 char str[1024];
320 sprintf(str, "Unable to find global CB node %p for deletion", cb);
321 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600322 result = XGL_FALSE;
323 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500324 if (!fenceRetired(pCBInfo->fenceId)) {
325 deleteFenceInfo(pCBInfo->fenceId);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600326 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500327
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500328 for (list<XGL_GPU_MEMORY>::iterator it=pCBInfo->pMemObjList.begin(); it!=pCBInfo->pMemObjList.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500329 clearCBBinding(cb, (*it));
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600330 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500331 pCBInfo->pMemObjList.clear();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700332 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600333 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700334}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600335
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500336// Delete CBInfo from list along with all of it's mini MemObjInfo
337// and also clear mem references to CB
Tobin Ehlis6663f492014-11-10 12:29:12 -0700338// TODO : When should this be called? There's no Destroy of CBs that I see
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500339static bool32_t deleteCBInfo(const XGL_CMD_BUFFER cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700340{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600341 bool32_t result = XGL_TRUE;
342 result = freeCBBindings(cb);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500343 // Delete the CBInfo node
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600344 if (result == XGL_TRUE) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500345 if (cbMap.find(cb) != cbMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500346 MT_CB_INFO* pDelInfo = cbMap[cb];
347 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500348 cbMap.erase(cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600349 }
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700350 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600351 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700352}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600353
Tobin Ehlis6663f492014-11-10 12:29:12 -0700354// Delete the entire CB list
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500355static bool32_t deleteCBInfoList()
Tobin Ehlis6663f492014-11-10 12:29:12 -0700356{
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600357 bool32_t result = XGL_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500358 for (map<XGL_CMD_BUFFER, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500359 freeCBBindings((*ii).first);
360 delete (*ii).second;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700361 }
362 return result;
363}
364
365// For given MemObj node, report Obj & CB bindings
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500366static void reportMemReferences(const MT_MEM_OBJ_INFO* pMemObjInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700367{
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600368 uint32_t refCount = 0; // Count found references
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500369
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500370 for (list<XGL_CMD_BUFFER>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
Tobin Ehlis6663f492014-11-10 12:29:12 -0700371 refCount++;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700372 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500373 sprintf(str, "Command Buffer %p has reference to mem obj %p", (*it), pMemObjInfo->mem);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500374 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700375 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500376 for (list<XGL_OBJECT>::const_iterator it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700377 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500378 sprintf(str, "XGL Object %p has reference to mem obj %p", (*it), pMemObjInfo->mem);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500379 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700380 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500381 if (refCount != pMemObjInfo->refCount) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700382 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500383 sprintf(str, "Refcount of %u for Mem Obj %p does't match reported refs of %u", pMemObjInfo->refCount, pMemObjInfo->mem, refCount);
384 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700385 }
386}
387
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500388static void deleteMemObjInfo(XGL_GPU_MEMORY mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700389{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500390 MT_MEM_OBJ_INFO* pDelInfo = memObjMap[mem];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500391 if (memObjMap.find(mem) != memObjMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500392 MT_MEM_OBJ_INFO* pDelInfo = memObjMap[mem];
393 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500394 memObjMap.erase(mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700395 }
396}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500397
Tobin Ehlis6663f492014-11-10 12:29:12 -0700398// Check if fence for given CB is completed
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600399static bool32_t checkCBCompleted(const XGL_CMD_BUFFER cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700400{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600401 bool32_t result = XGL_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500402 MT_CB_INFO* pCBInfo = getCBInfo(cb);
403 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700404 char str[1024];
405 sprintf(str, "Unable to find global CB node %p to check for completion", cb);
406 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600407 result = XGL_FALSE;
408 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500409 if (!fenceRetired(pCBInfo->fenceId)) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500410 // Explicitly call the internal xglGetFenceStatus routine
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500411 if (XGL_SUCCESS != xglGetFenceStatus(getFenceFromId(pCBInfo->fenceId))) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600412 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500413 sprintf(str, "FenceId %" PRIx64", fence %p for CB %p has not completed", pCBInfo->fenceId, getFenceFromId(pCBInfo->fenceId), cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600414 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
415 result = XGL_FALSE;
416 }
417 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700418 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600419 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700420}
421
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500422static bool32_t freeMemObjInfo(XGL_GPU_MEMORY mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700423{
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600424 bool32_t result = XGL_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700425 // Parse global list to find node w/ mem
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500426 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
427 if (!pInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700428 char str[1024];
429 sprintf(str, "Couldn't find mem node object for %p\n Was %p never allocated or previously freed?", (void*)mem, (void*)mem);
430 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600431 result = XGL_FALSE;
432 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500433 if (pInfo->allocInfo.allocationSize == 0) {
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600434 char str[1024];
435 sprintf(str, "Attempting to free memory associated with a Presentable Image, %p, this should not be explicitly freed\n", (void*)mem);
Mark Lobodzinski78a21972015-03-05 12:39:33 -0600436 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700437 result = XGL_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600438 } else {
439 // Clear any CB bindings for completed CBs
440 // TODO : Is there a better place to do this?
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500441
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500442 list<XGL_CMD_BUFFER>::iterator it = pInfo->pCmdBufferBindings.begin();
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500443 list<XGL_CMD_BUFFER>::iterator temp;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500444 while (it != pInfo->pCmdBufferBindings.end()) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500445 if (XGL_TRUE == checkCBCompleted(*it)) {
446 temp = it;
447 ++temp;
448 freeCBBindings(*it);
449 it = temp;
450 } else {
451 ++it;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600452 }
453 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500454
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600455 // Now verify that no references to this mem obj remain
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500456 if (0 != pInfo->refCount) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500457 // If references remain, report the error and can search CB list to find references
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600458 char str[1024];
459 sprintf(str, "Freeing mem obj %p while it still has references", (void*)mem);
460 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500461 reportMemReferences(pInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600462 result = XGL_FALSE;
463 }
464 // Delete global node
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500465 deleteMemObjInfo(mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700466 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700467 }
468 return result;
469}
470
471// Return object node for 'object' or return NULL if no node exists
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500472static MT_OBJ_INFO* getObjectInfo(const XGL_OBJECT object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700473{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500474 MT_OBJ_INFO* pObjInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500475
476 if (objectMap.find(object) != objectMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500477 pObjInfo = objectMap[object];
Tobin Ehlis6663f492014-11-10 12:29:12 -0700478 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500479 return pObjInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500480}
481
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500482static MT_OBJ_INFO* insertObjectInfo(XGL_OBJECT object, XGL_STRUCTURE_TYPE sType, const void *pCreateInfo, const int struct_size, const char *name_prefix)
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500483{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500484 MT_OBJ_INFO* pInfo = new MT_OBJ_INFO;
485 memset(pInfo, 0, sizeof(MT_OBJ_INFO));
486 memcpy(&pInfo->create_info, pCreateInfo, struct_size);
487 sprintf(pInfo->object_name, "%s_%p", name_prefix, object);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500488
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500489 pInfo->object = object;
490 pInfo->ref_count = 1;
491 pInfo->sType = sType;
492 objectMap[object] = pInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500493
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500494 return pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700495}
496
Tobin Ehlis6663f492014-11-10 12:29:12 -0700497// Remove object binding performs 3 tasks:
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500498// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
499// 2. Decrement refCount for MemObjInfo
500// 3. Clear MemObjInfo ptr from ObjectInfo
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600501static bool32_t clearObjectBinding(XGL_OBJECT object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700502{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600503 bool32_t result = XGL_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500504 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
505 if (!pObjInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700506 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -0600507 sprintf(str, "Attempting to clear mem binding for object %p: devices, queues, command buffers, shaders and memory objects do not have external memory requirements and it is unneccessary to call bind/unbindObjectMemory on them.", object);
508 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600509 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500510 if (!pObjInfo->pMemObjInfo) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600511 char str[1024];
512 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
513 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
514 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500515 for (list<XGL_OBJECT>::iterator it = pObjInfo->pMemObjInfo->pObjBindings.begin(); it != pObjInfo->pMemObjInfo->pObjBindings.end(); ++it) {
516 pObjInfo->pMemObjInfo->refCount--;
517 pObjInfo->pMemObjInfo = NULL;
518 it = pObjInfo->pMemObjInfo->pObjBindings.erase(it);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500519 result = XGL_TRUE;
520 break;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600521 }
522 if (result == XGL_FALSE) {
523 char str[1024];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500524 sprintf(str, "While trying to clear mem binding for object %p, unable to find that object referenced by mem obj %p",
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500525 object, pObjInfo->pMemObjInfo->mem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600526 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
527 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700528 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700529 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600530 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700531}
532
533// For NULL mem case, clear any previous binding Else...
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500534// Make sure given object is in global object map
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700535// IF a previous binding existed, clear it
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500536// Add reference from global object node to global memory node
537// Add reference off of global obj node
Tobin Ehlis6663f492014-11-10 12:29:12 -0700538// Return XGL_TRUE if addition is successful, XGL_FALSE otherwise
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600539static bool32_t updateObjectBinding(XGL_OBJECT object, XGL_GPU_MEMORY mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700540{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600541 bool32_t result = XGL_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700542 // Handle NULL case separately, just clear previous binding & decrement reference
543 if (mem == XGL_NULL_HANDLE) {
544 clearObjectBinding(object);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600545 result = XGL_TRUE;
546 } else {
547 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500548 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
549 if (!pObjInfo) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600550 sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object);
551 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
552 return XGL_FALSE;
553 }
554 // non-null case so should have real mem obj
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500555 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
556 if (!pInfo) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600557 sprintf(str, "While trying to bind mem for obj %p, couldn't find node for mem obj %p", (void*)object, (void*)mem);
558 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
559 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500560 // Search for object in memory object's binding list
561 bool32_t found = XGL_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500562 for (list<XGL_OBJECT>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500563 if ((*it) == object) {
564 found = XGL_TRUE;
565 break;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600566 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600567 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500568 // If not present, add to list
569 if (found == XGL_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500570 pInfo->pObjBindings.push_front(object);
571 pInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500572 }
573
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500574 if (pObjInfo->pMemObjInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500575 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500576 sprintf(str, "Updating memory binding for object %p from mem obj %p to %p", object, pObjInfo->pMemObjInfo->mem, mem);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500577 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
578 }
579 // For image objects, make sure default memory state is correctly set
580 // TODO : What's the best/correct way to handle this?
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500581 if (XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pObjInfo->sType) {
582 if (pObjInfo->create_info.image_create_info.usage & (XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500583 // TODO:: More memory state transition stuff.
584 }
585 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500586 pObjInfo->pMemObjInfo = pInfo;
Tobin Ehlis8be20fd2015-01-07 17:49:29 -0700587 }
588 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700589 return XGL_TRUE;
590}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600591
Tobin Ehlis6663f492014-11-10 12:29:12 -0700592// Print details of global Obj tracking list
593static void printObjList()
594{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500595 MT_OBJ_INFO* pInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500596 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500597 sprintf(str, "Details of Object list of size %lu elements", objectMap.size());
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500598 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500599 for (map<XGL_OBJECT, MT_OBJ_INFO*>::iterator ii=objectMap.begin(); ii!=objectMap.end(); ++ii) {
600 pInfo = (*ii).second;
601 sprintf(str, " ObjInfo %p has object %p, pMemObjInfo %p", pInfo, pInfo->object, pInfo->pMemObjInfo);
602 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pInfo->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700603 }
604}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600605
Tobin Ehlis6663f492014-11-10 12:29:12 -0700606// For given Object, get 'mem' obj that it's bound to or NULL if no binding
607static XGL_GPU_MEMORY getMemBindingFromObject(const XGL_OBJECT object)
608{
609 XGL_GPU_MEMORY mem = NULL;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500610 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
611 if (pObjInfo) {
612 if (pObjInfo->pMemObjInfo) {
613 mem = pObjInfo->pMemObjInfo->mem;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700614 }
615 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700616 char str[1024];
617 sprintf(str, "Trying to get mem binding for object %p but object has no mem binding", (void*)object);
618 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700619 printObjList();
620 }
621 }
622 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700623 char str[1024];
624 sprintf(str, "Trying to get mem binding for object %p but no such object in global list", (void*)object);
625 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700626 printObjList();
627 }
628 return mem;
629}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500630
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500631// Print details of MemObjInfo list
Tobin Ehlis6663f492014-11-10 12:29:12 -0700632static void printMemList()
633{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500634 MT_MEM_OBJ_INFO* pInfo = NULL;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700635 // Just printing each msg individually for now, may want to package these into single large print
636 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500637 sprintf(str, "MEM INFO : Details of Memory Object list of size %lu elements", memObjMap.size());
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500638 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
639
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500640 for (map<XGL_GPU_MEMORY, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
641 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500642
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500643 sprintf(str, " ===MemObjInfo at %p===", (void*)pInfo);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700644 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500645 sprintf(str, " Mem object: %p", (void*)pInfo->mem);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700646 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500647 sprintf(str, " Ref Count: %u", pInfo->refCount);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500648 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500649 if (0 != pInfo->allocInfo.allocationSize) {
650 string pAllocInfoMsg = xgl_print_xgl_memory_alloc_info(&pInfo->allocInfo, "{MEM}INFO : ");
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500651 sprintf(str, " Mem Alloc info:\n%s", pAllocInfoMsg.c_str());
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700652 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500653 } else {
654 sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())");
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700655 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500656 }
657
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500658 sprintf(str, " XGL OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500659 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500660 for (list<XGL_OBJECT>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500661 sprintf(str, " XGL OBJECT %p", (*it));
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700662 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500663 }
664
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500665 sprintf(str, " XGL Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500666 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500667 for (list<XGL_CMD_BUFFER>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500668 sprintf(str, " XGL CB %p", (*it));
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700669 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700670 }
671 }
672}
673
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500674static void printCBList()
Tobin Ehlis6663f492014-11-10 12:29:12 -0700675{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700676 char str[1024] = {0};
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500677 MT_CB_INFO* pCBInfo = NULL;
678 sprintf(str, "Details of CB list of size %lu elements", cbMap.size());
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500679 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
680
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500681 for (map<XGL_CMD_BUFFER, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
682 pCBInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500683
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500684 sprintf(str, " CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %p",
685 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
686 (void*)getFenceFromId(pCBInfo->fenceId));
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700687 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500688
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500689 for (list<XGL_GPU_MEMORY>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500690 sprintf(str, " Mem obj %p", (*it));
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700691 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700692 }
693 }
694}
695
Mark Lobodzinskic52b7752015-02-18 16:38:17 -0600696static void initMemTracker(void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700697{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700698 const char *strOpt;
699 // initialize MemTracker options
Ian Elliotte7826712015-03-06 13:50:05 -0700700 getLayerOptionEnum("MemTrackerReportLevel", (uint32_t *) &g_reportingLevel);
701 g_actionIsDefault = getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &g_debugAction);
Tobin Ehlisee702232015-01-08 14:26:53 -0700702
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700703 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
704 {
705 strOpt = getLayerOption("MemTrackerLogFilename");
706 if (strOpt)
707 {
708 g_logFile = fopen(strOpt, "w");
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700709 }
710 if (g_logFile == NULL)
711 g_logFile = stdout;
712 }
713
714 // initialize Layer dispatch table
715 // TODO handle multiple GPUs
Mark Lobodzinski391bb6d2015-01-09 15:12:03 -0600716 xglGetProcAddrType fpNextGPA;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700717 fpNextGPA = pCurObj->pGPA;
718 assert(fpNextGPA);
719
Chia-I Wuaa4121f2015-01-04 23:11:43 +0800720 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
721
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500722 xglGetProcAddrType fpGetProcAddr = (xglGetProcAddrType)fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis6663f492014-11-10 12:29:12 -0700723 nextTable.GetProcAddr = fpGetProcAddr;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600724
725 if (!globalLockInitialized)
726 {
727 // TODO/TBD: Need to delete this mutex sometime. How??? One
728 // suggestion is to call this during xglCreateInstance(), and then we
729 // can clean it up during xglDestroyInstance(). However, that requires
730 // that the layer have per-instance locks. We need to come back and
731 // address this soon.
732 loader_platform_thread_create_mutex(&globalLock);
733 globalLockInitialized = 1;
734 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700735}
736
Tobin Ehlis6663f492014-11-10 12:29:12 -0700737XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
738{
739 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
740 pCurObj = gpuw;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700741 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700742 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
743 // Save off device in case we need it to create Fences
744 globalDevice = *pDevice;
745 return result;
746}
747
748XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
749{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700750 char str[1024];
751 sprintf(str, "Printing List details prior to xglDestroyDevice()");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600752 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700753 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700754 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500755 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700756 printObjList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500757 if (XGL_FALSE == deleteCBInfoList()) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700758 sprintf(str, "Issue deleting global CB list in xglDestroyDevice()");
759 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
760 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700761 // Report any memory leaks
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500762 MT_MEM_OBJ_INFO* pInfo = NULL;
763 for (map<XGL_GPU_MEMORY, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
764 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500765
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500766 if (pInfo->allocInfo.allocationSize != 0) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500767 sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling xglFreeMemory(%p) prior to xglDestroyDevice().",
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500768 pInfo->mem, pInfo->mem);
769 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600770 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700771 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600772 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700773 XGL_RESULT result = nextTable.DestroyDevice(device);
774 return result;
775}
776
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500777XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, size_t maxLayerCount,
778 size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700779{
Jon Ashburnf7a08742014-11-25 11:08:42 -0700780 if (gpu != NULL)
781 {
782 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
783 pCurObj = gpuw;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700784 loader_platform_thread_once(&g_initOnce, initMemTracker);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500785 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount,
786 maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburnf7a08742014-11-25 11:08:42 -0700787 return result;
788 } else
789 {
790 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
791 return XGL_ERROR_INVALID_POINTER;
792 // This layer compatible with all GPUs
793 *pOutLayerCount = 1;
Chia-I Wu1da4b9f2014-12-16 10:47:33 +0800794 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Jon Ashburnf7a08742014-11-25 11:08:42 -0700795 return XGL_SUCCESS;
796 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700797}
798
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500799XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, uint32_t queueIndex, XGL_QUEUE* pQueue)
800{
801 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
802 return result;
803}
804
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500805XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers,
806 uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700807{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600808 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700809 // TODO : Need to track fence and clear mem references when fence clears
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500810 MT_CB_INFO* pCBInfo = NULL;
811 uint64_t fenceId = addFenceInfo(fence);
812 char str[1024];
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700813 sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
814 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700815 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500816 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700817 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500818 pCBInfo = getCBInfo(pCmdBuffers[i]);
819 pCBInfo->fenceId = fenceId;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700820 sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
821 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700822 if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700823 sprintf(str, "Unable to verify memory references for CB %p", (void*)pCmdBuffers[i]);
824 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700825 }
826 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500827 printCBList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600828 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500829 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, getFenceFromId(fenceId));
Tobin Ehlis6663f492014-11-10 12:29:12 -0700830 return result;
831}
832
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600833XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700834{
835 // TODO : Use global mem references as part of list checked on QueueSubmit above
836 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
837 return result;
838}
839
Tobin Ehlis6663f492014-11-10 12:29:12 -0700840XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
841{
842 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
843 // TODO : Track allocations and overall size here
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600844 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500845 insertMemObjInfo(*pMem, pAllocInfo);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700846 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600847 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700848 return result;
849}
850
851XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
852{
Tobin Ehlisc0418f92014-11-25 14:47:20 -0700853 /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
854 * freeing a memory object, an application must ensure the memory object is unbound from
855 * all API objects referencing it and that it is not referenced by any queued command buffers
856 */
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600857 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500858 if (XGL_FALSE == freeMemObjInfo(mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700859 char str[1024];
860 sprintf(str, "Issue while freeing mem obj %p", (void*)mem);
861 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str);
862 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700863 printMemList();
864 printObjList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500865 printCBList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600866 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700867 XGL_RESULT result = nextTable.FreeMemory(mem);
868 return result;
869}
870
871XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
872{
873 // TODO : Update tracking for this alloc
874 // Make sure memory is not pinned, which can't have priority set
875 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
876 return result;
877}
878
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600879XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700880{
881 // TODO : Track when memory is mapped
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600882 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500883 MT_MEM_OBJ_INFO *pMemObj = getMemObjInfo(mem);
Mark Lobodzinski95152dc2015-02-25 12:16:04 -0600884 if ((pMemObj->allocInfo.memProps & XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT) == 0) {
885 char str[1024];
886 sprintf(str, "Mapping Memory (%p) without XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT set", (void*)mem);
887 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
888 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600889 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700890 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
891 return result;
892}
893
894XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
895{
896 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
897 // Make sure that memory was ever mapped to begin with
898 XGL_RESULT result = nextTable.UnmapMemory(mem);
899 return result;
900}
901
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600902XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const void* pSysMem, size_t memSize, XGL_GPU_MEMORY* pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700903{
904 // TODO : Track this
905 // Verify that memory is actually pinnable
906 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
907 return result;
908}
909
Tobin Ehlis6663f492014-11-10 12:29:12 -0700910XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
911{
912 // TODO : Track this
913 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
914 return result;
915}
916
Tobin Ehlis6663f492014-11-10 12:29:12 -0700917XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
918{
919 // TODO : Track this
920 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
921 return result;
922}
923
924XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
925{
926 // TODO : Track this
927 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
928 return result;
929}
930
931XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
932{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600933 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500934
Tobin Ehlisa98df732014-11-27 07:52:04 -0700935 // First check if this is a CmdBuffer
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500936 if (NULL != getCBInfo((XGL_CMD_BUFFER)object)) {
937 deleteCBInfo((XGL_CMD_BUFFER)object);
Tobin Ehlisa98df732014-11-27 07:52:04 -0700938 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500939
940 if (objectMap.find(object) != objectMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500941 MT_OBJ_INFO* pDelInfo = objectMap[object];
942 if (pDelInfo->pMemObjInfo) {
Tobin Ehlisa98df732014-11-27 07:52:04 -0700943 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500944 if (0 == pDelInfo->pMemObjInfo->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
945 XGL_GPU_MEMORY memToFree = pDelInfo->pMemObjInfo->mem;
Tobin Ehlisa98df732014-11-27 07:52:04 -0700946 clearObjectBinding(object);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500947 freeMemObjInfo(memToFree);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500948 } else {
Tobin Ehlisa98df732014-11-27 07:52:04 -0700949 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500950 sprintf(str, "Destroying obj %p that is still bound to memory object %p\nYou should first clear binding by calling xglBindObjectMemory(%p, 0, XGL_NULL_HANDLE, 0)", object, (void*)pDelInfo->pMemObjInfo->mem, object);
Tobin Ehlisa98df732014-11-27 07:52:04 -0700951 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
952 // From the spec : If an object has previous memory binding, it is required to unbind memory from an API object before it is destroyed.
953 clearObjectBinding(object);
954 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700955 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500956 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500957 objectMap.erase(object);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700958 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500959
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600960 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700961 XGL_RESULT result = nextTable.DestroyObject(object);
962 return result;
963}
964
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600965XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700966{
967 // TODO : What to track here?
968 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700969 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues, command buffers, shaders and memory objects.
Tobin Ehlis6663f492014-11-10 12:29:12 -0700970 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
971 return result;
972}
973
Mark Lobodzinski17caf572015-01-29 08:55:56 -0600974XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700975{
Jon Ashburn9b6eae52015-01-15 10:39:19 -0700976 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600977 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700978 // Track objects tied to memory
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700979 if (XGL_FALSE == updateObjectBinding(object, mem)) {
980 char str[1024];
981 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
982 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
983 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700984 printObjList();
985 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600986 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700987 return result;
988}
989
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700990XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
991{
992 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
993 if (XGL_SUCCESS == result) {
994 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500995 insertObjectInfo(*pFence, pCreateInfo->sType, pCreateInfo, sizeof(XGL_FENCE_CREATE_INFO), "fence");
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700996 loader_platform_thread_unlock_mutex(&globalLock);
997 }
998 return result;
999}
1000
1001XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1002{
1003 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1004 if (XGL_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001005 loader_platform_thread_lock_mutex(&globalLock);
1006 updateFenceTracking(fence);
1007 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001008 }
1009 return result;
1010}
1011
1012XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
1013{
1014 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001015 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001016 if (XGL_SUCCESS == result) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001017 if (waitAll) { // Clear all the fences
1018 for(uint32_t i = 0; i < fenceCount; i++) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001019 updateFenceTracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001020 }
1021 }
1022 else { // Clear only completed fences
1023 for(uint32_t i = 0; i < fenceCount; i++) {
1024 if (XGL_SUCCESS == nextTable.GetFenceStatus(pFences[i])) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001025 updateFenceTracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001026 }
1027 }
1028 }
1029 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001030 loader_platform_thread_unlock_mutex(&globalLock);
1031 return result;
1032}
1033
1034XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1035{
1036 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1037 if (XGL_SUCCESS == result) {
1038 loader_platform_thread_lock_mutex(&globalLock);
1039 retireAllFences();
1040 loader_platform_thread_unlock_mutex(&globalLock);
1041 }
1042 return result;
1043}
1044
1045XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1046{
1047 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1048 if (XGL_SUCCESS == result) {
1049 loader_platform_thread_lock_mutex(&globalLock);
1050 retireAllFences();
1051 loader_platform_thread_unlock_mutex(&globalLock);
1052 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001053 return result;
1054}
1055
Tobin Ehlis6663f492014-11-10 12:29:12 -07001056XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1057{
1058 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001059 if (XGL_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001060 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001061 insertObjectInfo(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(XGL_EVENT_CREATE_INFO), "event");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001062 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001063 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001064 return result;
1065}
1066
Tobin Ehlis6663f492014-11-10 12:29:12 -07001067XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1068{
1069 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001070 if (XGL_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001071 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001072 insertObjectInfo(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(XGL_QUERY_POOL_CREATE_INFO), "query_pool");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001073 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001074 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001075 return result;
1076}
1077
Tobin Ehlis7265e832015-01-19 08:42:29 -07001078XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1079{
1080 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001081 if (XGL_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001082 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001083 insertObjectInfo(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO), "buffer");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001084 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001085 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001086 return result;
1087}
1088
1089XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1090{
1091 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001092 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001093 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001094 insertObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO), "buffer_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001095 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001096 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001097 return result;
1098}
1099
Tobin Ehlis6663f492014-11-10 12:29:12 -07001100XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1101{
1102 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001103 if (XGL_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001104 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001105 insertObjectInfo(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_CREATE_INFO), "image");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001106 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001107 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001108 return result;
1109}
1110
Tobin Ehlis6663f492014-11-10 12:29:12 -07001111XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1112{
1113 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001114 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001115 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001116 insertObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO), "image_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001117 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001118 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001119 return result;
1120}
1121
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001122XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo,
1123 XGL_COLOR_ATTACHMENT_VIEW* pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001124{
1125 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001126 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001127 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001128 insertObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO), "color_attachment_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001129 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001130 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001131 return result;
1132}
1133
1134XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1135{
1136 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001137 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001138 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001139 insertObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO), "ds_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001140 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001141 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001142 return result;
1143}
1144
1145XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1146{
1147 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1148 return result;
1149}
1150
1151XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1152{
1153 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001154 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001155 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001156 insertObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO), "graphics_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001157 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001158 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001159 return result;
1160}
1161
1162XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1163{
1164 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001165 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001166 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001167 insertObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO), "compute_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001168 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001169 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001170 return result;
1171}
1172
Tobin Ehlis6663f492014-11-10 12:29:12 -07001173XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1174{
1175 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001176 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001177 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001178 insertObjectInfo(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO), "sampler");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001179 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001180 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001181 return result;
1182}
1183
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001184XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicViewportState(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo,
1185 XGL_DYNAMIC_VP_STATE_OBJECT* pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001186{
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001187 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001188 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001189 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001190 insertObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO), "viewport_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001191 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001192 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001193 return result;
1194}
1195
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001196XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicRasterState(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo,
1197 XGL_DYNAMIC_RS_STATE_OBJECT* pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001198{
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001199 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001200 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001201 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001202 insertObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO), "raster_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001203 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001204 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001205 return result;
1206}
1207
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001208XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicColorBlendState(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo,
1209 XGL_DYNAMIC_CB_STATE_OBJECT* pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001210{
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001211 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001212 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001213 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001214 insertObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO), "cb_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001215 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001216 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001217 return result;
1218}
1219
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001220XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicDepthStencilState(XGL_DEVICE device, const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pCreateInfo,
1221 XGL_DYNAMIC_DS_STATE_OBJECT* pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001222{
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001223 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001224 if (result == XGL_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001225 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001226 insertObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO), "ds_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001227 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001228 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001229 return result;
1230}
1231
1232XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1233{
1234 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1235 // At time of cmd buffer creation, create global cmd buffer node for the returned cmd buffer
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001236 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001237 if (*pCmdBuffer)
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001238 insertCBInfo(*pCmdBuffer);
1239 printCBList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001240 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001241 return result;
1242}
1243
Jon Ashburn86522372014-12-31 17:11:49 -07001244XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001245{
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001246 // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001247 MT_CB_INFO* pCBInfo = getCBInfo(cmdBuffer);
1248 if (pCBInfo && (!fenceRetired(pCBInfo->fenceId))) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001249 bool32_t cbDone = checkCBCompleted(cmdBuffer);
1250 if (XGL_FALSE == cbDone) {
1251 char str[1024];
1252 sprintf(str, "Calling xglBeginCommandBuffer() on active CB %p before it has completed. You must check CB flag before this call.", cmdBuffer);
1253 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", str);
1254 }
1255 }
Jon Ashburn86522372014-12-31 17:11:49 -07001256 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001257 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001258 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001259 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001260 return result;
1261}
1262
1263XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1264{
1265 // TODO : Anything to do here?
1266 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1267 return result;
1268}
1269
1270XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1271{
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001272 // Verify that CB is complete (not in-flight)
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001273 MT_CB_INFO* pCBInfo = getCBInfo(cmdBuffer);
1274 if (pCBInfo && (!fenceRetired(pCBInfo->fenceId))) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001275 bool32_t cbDone = checkCBCompleted(cmdBuffer);
1276 if (XGL_FALSE == cbDone) {
1277 char str[1024];
1278 sprintf(str, "Resetting CB %p before it has completed. You must check CB flag before calling xglResetCommandBuffer().", cmdBuffer);
1279 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", str);
1280 }
1281 }
1282 // Clear memory references as this point.
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001283 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001284 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001285 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001286 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1287 return result;
1288}
1289// TODO : For any xglCmdBind* calls that include an object which has mem bound to it,
1290// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001291XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001292{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001293#if 0
1294 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1295 if (getPipeline(pipeline)) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001296 MT_CB_INFO *pCBInfo = getCBInfo(cmdBuffer);
1297 if (pCBInfo) {
1298 pCBInfo->pipelines[pipelineBindPoint] = pipeline;
Tobin Ehlisc145be82015-01-08 15:22:32 -07001299 } else {
1300 char str[1024];
1301 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001302 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001303 }
1304 }
1305 else {
1306 char str[1024];
1307 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001308 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001309 }
1310#endif
Tobin Ehlis6663f492014-11-10 12:29:12 -07001311 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1312}
1313
Tobin Ehlis7265e832015-01-19 08:42:29 -07001314XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001315{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001316 MT_OBJ_INFO *pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001317 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001318 MT_CB_INFO *pCmdBuf = getCBInfo(cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001319 if (!pCmdBuf) {
1320 char str[1024];
1321 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
1322 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
1323 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001324 pObjInfo = getObjectInfo(state);
1325 if (!pObjInfo) {
Tobin Ehlisc145be82015-01-08 15:22:32 -07001326 char str[1024];
1327 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1328 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
1329 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001330 pCmdBuf->pDynamicState[stateBindPoint] = pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001331 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001332 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001333}
1334
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001335XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint,
1336 XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001337{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001338 // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state
Tobin Ehlis7265e832015-01-19 08:42:29 -07001339 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001340}
1341
Tobin Ehlis7265e832015-01-19 08:42:29 -07001342XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001343{
Tobin Ehlis7265e832015-01-19 08:42:29 -07001344 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Chia-I Wu19156822015-01-05 13:42:56 +08001345}
1346
Tobin Ehlis7265e832015-01-19 08:42:29 -07001347XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001348{
Tobin Ehlis7265e832015-01-19 08:42:29 -07001349 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001350}
1351
Tobin Ehlis7265e832015-01-19 08:42:29 -07001352XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001353{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001354 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001355 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1356 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001357 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001358 sprintf(str, "In xglCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001359 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1360 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001361 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001362 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001363}
1364
Tobin Ehlis7265e832015-01-19 08:42:29 -07001365XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001366{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001367 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001368 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1369 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001370 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001371 sprintf(str, "In xglCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001372 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1373 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001374 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001375 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001376}
1377
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001378XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001379{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001380 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001381 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001382 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1383 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001384 sprintf(str, "In xglCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001385 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1386 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001387 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001388 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001389}
1390
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001391XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_BUFFER destBuffer,
1392 uint32_t regionCount, const XGL_BUFFER_COPY* pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001393{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001394 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001395 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcBuffer);
1396 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001397 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001398 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001399 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1400 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001401 mem = getMemBindingFromObject(destBuffer);
1402 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001403 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001404 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001405 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1406 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001407 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001408 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001409}
1410
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001411XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage,
1412 uint32_t regionCount, const XGL_IMAGE_COPY* pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001413{
1414 // TODO : Each image will have mem mapping so track them
1415 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1416}
1417
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001418XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_IMAGE destImage,
1419 uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001420{
1421 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001422 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001423 XGL_GPU_MEMORY mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001424 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1425 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001426 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001427 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1428 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001429
1430 mem = getMemBindingFromObject(srcBuffer);
1431 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001432 char str[1024];
Tobin Ehlis7265e832015-01-19 08:42:29 -07001433 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001434 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1435 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001436 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001437 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001438}
1439
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001440XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_BUFFER destBuffer,
1441 uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001442{
1443 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001444 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001445 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001446 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1447 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001448 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001449 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1450 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001451 mem = getMemBindingFromObject(destBuffer);
1452 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001453 char str[1024];
Tobin Ehlis7265e832015-01-19 08:42:29 -07001454 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001455 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1456 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001457 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001458 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001459}
1460
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001461XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout,
1462 XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001463{
1464 // TODO : Each image will have mem mapping so track them
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001465 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001466 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001467 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1468 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001469 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001470 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1471 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001472 mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001473 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1474 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001475 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001476 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1477 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001478 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanfb80d5f2014-12-04 11:08:39 +00001479 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001480}
1481
Tobin Ehlis7265e832015-01-19 08:42:29 -07001482XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001483{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001484 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001485 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1486 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001487 char str[1024];
Tobin Ehlis7265e832015-01-19 08:42:29 -07001488 sprintf(str, "In xglCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001489 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1490 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001491 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001492 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001493}
1494
Tobin Ehlis7265e832015-01-19 08:42:29 -07001495XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001496{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001497 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001498 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1499 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001500 char str[1024];
Tobin Ehlis7265e832015-01-19 08:42:29 -07001501 sprintf(str, "In xglCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001502 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1503 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001504 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001505 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001506}
1507
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001508XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const float color[4],
1509 uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001510{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001511 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001512 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001513 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001514 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1515 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001516 sprintf(str, "In xglCmdClearColorImage() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001517 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1518 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001519 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001520 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1521}
1522
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001523XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const uint32_t color[4],
1524 uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001525{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001526 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001527 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001528 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001529 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1530 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001531 sprintf(str, "In xglCmdClearColorImageRaw() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001532 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1533 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001534 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001535 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1536}
1537
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001538XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, float depth,
1539 uint32_t stencil, uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001540{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001541 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001542 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001543 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001544 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1545 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001546 sprintf(str, "In xglCmdClearDepthStencil() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001547 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1548 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001549 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001550 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1551}
1552
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001553XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage,
1554 uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001555{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001556 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001557 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001558 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1559 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001560 sprintf(str, "In xglCmdResolveImage() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001561 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1562 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001563 mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001564 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1565 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001566 sprintf(str, "In xglCmdResolveImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001567 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1568 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001569 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001570 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1571}
1572
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001573XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001574{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001575 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001576 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001577 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1578 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001579 sprintf(str, "In xglCmdBeginQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001580 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1581 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001582 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001583 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1584}
1585
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001586XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001587{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001588 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001589 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001590 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1591 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001592 sprintf(str, "In xglCmdEndQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001593 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1594 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001595 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001596 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1597}
1598
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001599XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001600{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001601 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001602 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001603 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1604 char str[1024];
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001605 sprintf(str, "In xglCmdResetQueryPool() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001606 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1607 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001608 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001609 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1610}
1611
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001612XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001613{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001614 // This layer intercepts callbacks
1615 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1616 if (!pNewDbgFuncNode)
1617 return XGL_ERROR_OUT_OF_MEMORY;
1618 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1619 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001620 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1621 g_pDbgFunctionHead = pNewDbgFuncNode;
Jon Ashburna8aa8372015-03-03 15:07:15 -07001622 // force callbacks if DebugAction hasn't been set already other than initial value
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07001623 if (g_actionIsDefault) {
Jon Ashburna8aa8372015-03-03 15:07:15 -07001624 g_debugAction = XGL_DBG_LAYER_ACTION_CALLBACK;
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07001625 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001626 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1627 return result;
1628}
1629
1630XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1631{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001632 XGL_LAYER_DBG_FUNCTION_NODE *pInfo = g_pDbgFunctionHead;
1633 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pInfo;
1634 while (pInfo) {
1635 if (pInfo->pfnMsgCallback == pfnMsgCallback) {
1636 pPrev->pNext = pInfo->pNext;
1637 if (g_pDbgFunctionHead == pInfo)
1638 g_pDbgFunctionHead = pInfo->pNext;
1639 free(pInfo);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001640 break;
1641 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001642 pPrev = pInfo;
1643 pInfo = pInfo->pNext;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001644 }
Jon Ashburna8aa8372015-03-03 15:07:15 -07001645 if (g_pDbgFunctionHead == NULL)
1646 {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001647 if (g_actionIsDefault) {
Jon Ashburna8aa8372015-03-03 15:07:15 -07001648 g_debugAction = XGL_DBG_LAYER_ACTION_LOG_MSG;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001649 } else {
1650 g_debugAction = (XGL_LAYER_DBG_ACTION)(g_debugAction & ~((uint32_t)XGL_DBG_LAYER_ACTION_CALLBACK));
1651 }
Jon Ashburna8aa8372015-03-03 15:07:15 -07001652 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001653 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1654 return result;
1655}
1656
Jon Ashburn71c2b152015-03-02 16:51:38 -07001657#if !defined(WIN32)
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001658XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11CreatePresentableImage(XGL_DEVICE device, const XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO* pCreateInfo,
1659 XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001660{
1661 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001662 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001663 if (XGL_SUCCESS == result) {
1664 // Add image object, then insert the new Mem Object and then bind it to created image
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001665 insertObjectInfo(*pImage, _XGL_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, sizeof(XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO), "wsi_x11_image");
1666 insertMemObjInfo(*pMem, NULL);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001667 if (XGL_FALSE == updateObjectBinding(*pImage, *pMem)) {
1668 char str[1024];
1669 sprintf(str, "In xglWsiX11CreatePresentableImage(), unable to set image %p binding to mem obj %p", (void*)*pImage, (void*)*pMem);
1670 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pImage, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1671 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001672 }
1673 printObjList();
1674 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001675 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001676 return result;
1677}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001678
1679XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
1680{
1681 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001682 addFenceInfo(fence);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001683 char str[1024];
1684 sprintf(str, "In xglWsiX11QueuePresent(), checking queue %p for fence %p", queue, fence);
1685 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
1686 loader_platform_thread_unlock_mutex(&globalLock);
1687 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
1688 return result;
1689}
Ian Elliott2d4ab1e2015-01-13 17:52:38 -07001690#endif // WIN32
Tobin Ehlis6663f492014-11-10 12:29:12 -07001691
Mark Lobodzinski17caf572015-01-29 08:55:56 -06001692XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001693{
1694 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu4d11dcc2015-01-05 13:18:57 +08001695
Tobin Ehlis6663f492014-11-10 12:29:12 -07001696 if (gpu == NULL)
1697 return NULL;
1698 pCurObj = gpuw;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -07001699 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001700
Jon Ashburn71c2b152015-03-02 16:51:38 -07001701 if (!strcmp(funcName, "xglGetProcAddr"))
1702 return (void *) xglGetProcAddr;
1703 if (!strcmp(funcName, "xglCreateDevice"))
1704 return (void*) xglCreateDevice;
1705 if (!strcmp(funcName, "xglDestroyDevice"))
1706 return (void*) xglDestroyDevice;
1707 if (!strcmp(funcName, "xglEnumerateLayers"))
1708 return (void*) xglEnumerateLayers;
1709 if (!strcmp(funcName, "xglQueueSubmit"))
1710 return (void*) xglQueueSubmit;
1711 if (!strcmp(funcName, "xglQueueSetGlobalMemReferences"))
1712 return (void*) xglQueueSetGlobalMemReferences;
1713 if (!strcmp(funcName, "xglAllocMemory"))
1714 return (void*) xglAllocMemory;
1715 if (!strcmp(funcName, "xglFreeMemory"))
1716 return (void*) xglFreeMemory;
1717 if (!strcmp(funcName, "xglSetMemoryPriority"))
1718 return (void*) xglSetMemoryPriority;
1719 if (!strcmp(funcName, "xglMapMemory"))
1720 return (void*) xglMapMemory;
1721 if (!strcmp(funcName, "xglUnmapMemory"))
1722 return (void*) xglUnmapMemory;
1723 if (!strcmp(funcName, "xglPinSystemMemory"))
1724 return (void*) xglPinSystemMemory;
1725 if (!strcmp(funcName, "xglOpenSharedMemory"))
1726 return (void*) xglOpenSharedMemory;
1727 if (!strcmp(funcName, "xglOpenPeerMemory"))
1728 return (void*) xglOpenPeerMemory;
1729 if (!strcmp(funcName, "xglOpenPeerImage"))
1730 return (void*) xglOpenPeerImage;
1731 if (!strcmp(funcName, "xglDestroyObject"))
1732 return (void*) xglDestroyObject;
1733 if (!strcmp(funcName, "xglGetObjectInfo"))
1734 return (void*) xglGetObjectInfo;
1735 if (!strcmp(funcName, "xglBindObjectMemory"))
1736 return (void*) xglBindObjectMemory;
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001737 if (!strcmp(funcName, "xglCreateFence"))
1738 return (void*) xglCreateFence;
1739 if (!strcmp(funcName, "xglGetFenceStatus"))
1740 return (void*) xglGetFenceStatus;
1741 if (!strcmp(funcName, "xglWaitForFences"))
1742 return (void*) xglWaitForFences;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001743 if (!strcmp(funcName, "xglQueueWaitIdle"))
1744 return (void*) xglQueueWaitIdle;
1745 if (!strcmp(funcName, "xglDeviceWaitIdle"))
1746 return (void*) xglDeviceWaitIdle;
Jon Ashburn71c2b152015-03-02 16:51:38 -07001747 if (!strcmp(funcName, "xglCreateEvent"))
1748 return (void*) xglCreateEvent;
1749 if (!strcmp(funcName, "xglCreateQueryPool"))
1750 return (void*) xglCreateQueryPool;
1751 if (!strcmp(funcName, "xglCreateBuffer"))
1752 return (void*) xglCreateBuffer;
1753 if (!strcmp(funcName, "xglCreateBufferView"))
1754 return (void*) xglCreateBufferView;
1755 if (!strcmp(funcName, "xglCreateImage"))
1756 return (void*) xglCreateImage;
1757 if (!strcmp(funcName, "xglCreateImageView"))
1758 return (void*) xglCreateImageView;
1759 if (!strcmp(funcName, "xglCreateColorAttachmentView"))
1760 return (void*) xglCreateColorAttachmentView;
1761 if (!strcmp(funcName, "xglCreateDepthStencilView"))
1762 return (void*) xglCreateDepthStencilView;
1763 if (!strcmp(funcName, "xglCreateShader"))
1764 return (void*) xglCreateShader;
1765 if (!strcmp(funcName, "xglCreateGraphicsPipeline"))
1766 return (void*) xglCreateGraphicsPipeline;
1767 if (!strcmp(funcName, "xglCreateComputePipeline"))
1768 return (void*) xglCreateComputePipeline;
1769 if (!strcmp(funcName, "xglCreateSampler"))
1770 return (void*) xglCreateSampler;
1771 if (!strcmp(funcName, "xglCreateDynamicViewportState"))
1772 return (void*) xglCreateDynamicViewportState;
1773 if (!strcmp(funcName, "xglCreateDynamicRasterState"))
1774 return (void*) xglCreateDynamicRasterState;
1775 if (!strcmp(funcName, "xglCreateDynamicColorBlendState"))
1776 return (void*) xglCreateDynamicColorBlendState;
1777 if (!strcmp(funcName, "xglCreateDynamicDepthStencilState"))
1778 return (void*) xglCreateDynamicDepthStencilState;
1779 if (!strcmp(funcName, "xglCreateCommandBuffer"))
1780 return (void*) xglCreateCommandBuffer;
1781 if (!strcmp(funcName, "xglBeginCommandBuffer"))
1782 return (void*) xglBeginCommandBuffer;
1783 if (!strcmp(funcName, "xglEndCommandBuffer"))
1784 return (void*) xglEndCommandBuffer;
1785 if (!strcmp(funcName, "xglResetCommandBuffer"))
1786 return (void*) xglResetCommandBuffer;
1787 if (!strcmp(funcName, "xglCmdBindPipeline"))
1788 return (void*) xglCmdBindPipeline;
1789 if (!strcmp(funcName, "xglCmdBindDynamicStateObject"))
1790 return (void*) xglCmdBindDynamicStateObject;
1791 if (!strcmp(funcName, "xglCmdBindDescriptorSet"))
1792 return (void*) xglCmdBindDescriptorSet;
1793 if (!strcmp(funcName, "xglCmdBindVertexBuffer"))
1794 return (void*) xglCmdBindVertexBuffer;
1795 if (!strcmp(funcName, "xglCmdBindIndexBuffer"))
1796 return (void*) xglCmdBindIndexBuffer;
1797 if (!strcmp(funcName, "xglCmdDrawIndirect"))
1798 return (void*) xglCmdDrawIndirect;
1799 if (!strcmp(funcName, "xglCmdDrawIndexedIndirect"))
1800 return (void*) xglCmdDrawIndexedIndirect;
1801 if (!strcmp(funcName, "xglCmdDispatchIndirect"))
1802 return (void*) xglCmdDispatchIndirect;
1803 if (!strcmp(funcName, "xglCmdCopyBuffer"))
1804 return (void*) xglCmdCopyBuffer;
1805 if (!strcmp(funcName, "xglCmdCopyImage"))
1806 return (void*) xglCmdCopyImage;
1807 if (!strcmp(funcName, "xglCmdCopyBufferToImage"))
1808 return (void*) xglCmdCopyBufferToImage;
1809 if (!strcmp(funcName, "xglCmdCopyImageToBuffer"))
1810 return (void*) xglCmdCopyImageToBuffer;
1811 if (!strcmp(funcName, "xglCmdCloneImageData"))
1812 return (void*) xglCmdCloneImageData;
1813 if (!strcmp(funcName, "xglCmdUpdateBuffer"))
1814 return (void*) xglCmdUpdateBuffer;
1815 if (!strcmp(funcName, "xglCmdFillBuffer"))
1816 return (void*) xglCmdFillBuffer;
1817 if (!strcmp(funcName, "xglCmdClearColorImage"))
1818 return (void*) xglCmdClearColorImage;
1819 if (!strcmp(funcName, "xglCmdClearColorImageRaw"))
1820 return (void*) xglCmdClearColorImageRaw;
1821 if (!strcmp(funcName, "xglCmdClearDepthStencil"))
1822 return (void*) xglCmdClearDepthStencil;
1823 if (!strcmp(funcName, "xglCmdResolveImage"))
1824 return (void*) xglCmdResolveImage;
1825 if (!strcmp(funcName, "xglCmdBeginQuery"))
1826 return (void*) xglCmdBeginQuery;
1827 if (!strcmp(funcName, "xglCmdEndQuery"))
1828 return (void*) xglCmdEndQuery;
1829 if (!strcmp(funcName, "xglCmdResetQueryPool"))
1830 return (void*) xglCmdResetQueryPool;
1831 if (!strcmp(funcName, "xglDbgRegisterMsgCallback"))
1832 return (void*) xglDbgRegisterMsgCallback;
1833 if (!strcmp(funcName, "xglDbgUnregisterMsgCallback"))
1834 return (void*) xglDbgUnregisterMsgCallback;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001835 if (!strcmp(funcName, "xglGetDeviceQueue"))
1836 return (void*) xglGetDeviceQueue;
Jon Ashburn71c2b152015-03-02 16:51:38 -07001837#if !defined(WIN32)
1838 if (!strcmp(funcName, "xglWsiX11CreatePresentableImage"))
1839 return (void*) xglWsiX11CreatePresentableImage;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001840 if (!strcmp(funcName, "xglWsiX11QueuePresent"))
1841 return (void*) xglWsiX11QueuePresent;
Jon Ashburn71c2b152015-03-02 16:51:38 -07001842#endif
Tobin Ehlis6663f492014-11-10 12:29:12 -07001843 else {
Tobin Ehlis6663f492014-11-10 12:29:12 -07001844 if (gpuw->pGPA == NULL)
1845 return NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001846 return gpuw->pGPA((XGL_PHYSICAL_GPU)gpuw->nextObject, funcName);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001847 }
1848}