summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPiers Daniell <pdaniell@nvidia.com>2015-03-01 07:50:14 -0700
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2015-03-02 17:21:11 -0700
commit90a465f7e898ba62609b5374d7542082611d5314 (patch)
treed5bcd001a326aa7bbc93d8db7096f46e31862182 /libs
parentce0db6a4aae09ced84479d273c4711318cc7e2f9 (diff)
Improve compatibility of XCB_nvidia and Source2
Diffstat (limited to 'libs')
-rw-r--r--libs/xcb_nvidia/xcb_nvidia.cpp34
1 files changed, 15 insertions, 19 deletions
diff --git a/libs/xcb_nvidia/xcb_nvidia.cpp b/libs/xcb_nvidia/xcb_nvidia.cpp
index 17cb8d1c..c8289090 100644
--- a/libs/xcb_nvidia/xcb_nvidia.cpp
+++ b/libs/xcb_nvidia/xcb_nvidia.cpp
@@ -1,13 +1,10 @@
#include <xcb/xcb.h>
-#include <Windows.h>
#include <string>
-#include <deque>
#include <xgl.h>
-#include "../loader/loader_platform.h"
-
+typedef HWND (*xcbConnectType)();
typedef void (*xcbCreateWindowType)(uint16_t width, uint16_t height);
typedef void (*xcbDestroyWindowType)();
typedef int (*xcbGetMessageType)(MSG * msg);
@@ -18,27 +15,22 @@ struct xcb_connection_t {
xcb_setup_t setup;
HMODULE xcbNvidia;
+ xcbConnectType xcbConnect;
xcbCreateWindowType xcbCreateWindow;
xcbDestroyWindowType xcbDestroyWindow;
xcbGetMessageType xcbGetMessage;
xcbPeekMessageType xcbPeekMessage;
-};
-// XCB id database.
-// FIXME: This is not thread safe.
-uint32_t g_xcbId = 0;
-struct XcbId {
- xcb_connection_t * connection;
+ HWND hwnd;
};
-std::deque<XcbId> g_xcbIds;
xcb_connection_t * xcb_connect(const char *displayname, int *screenp)
{
- std::string xglNvidia = (getenv(DRIVER_PATH_ENV) == NULL) ? "" : getenv(DRIVER_PATH_ENV);
- xglNvidia += "\\xgl_nvidia.dll";
+ std::string xglNvidia = (getenv("XGL_DRIVERS_PATH") == NULL) ? "" : getenv("XGL_DRIVERS_PATH");
+ xglNvidia += "\\XGL_nvidia.dll";
HMODULE module = LoadLibrary(xglNvidia.c_str());
if (!module) {
- std::string xglNulldrv = (getenv("XGL_DRIVERS_PATH") == NULL) ? "" : getenv("LIBXGL_DRIVERS_PATH");
+ std::string xglNulldrv = (getenv("LIBXGL_DRIVERS_PATH") == NULL) ? "" : getenv("LIBXGL_DRIVERS_PATH");
xglNulldrv += "\\xgl_nulldrv.dll";
module = LoadLibrary(xglNulldrv.c_str());
}
@@ -70,11 +62,17 @@ xcb_connection_t * xcb_connect(const char *displayname, int *screenp)
xcb_connection_t * connection = (xcb_connection_t *)calloc(1, sizeof(xcb_connection_t));
connection->xcbNvidia = module;
+ connection->xcbConnect = (xcbConnectType)GetProcAddress(module, "xcbConnect");
connection->xcbCreateWindow = (xcbCreateWindowType)GetProcAddress(module, "xcbCreateWindow");
connection->xcbDestroyWindow = (xcbDestroyWindowType)GetProcAddress(module, "xcbDestroyWindow");
connection->xcbGetMessage = (xcbGetMessageType)GetProcAddress(module, "xcbGetMessage");
connection->xcbPeekMessage = (xcbPeekMessageType)GetProcAddress(module, "xcbPeekMessage");
+ if (!connection->xcbConnect) {
+ return 0;
+ }
+ connection->hwnd = connection->xcbConnect();
+
*screenp = 0;
return static_cast<xcb_connection_t *>(connection);
}
@@ -172,11 +170,9 @@ xcb_generic_event_t *xcb_poll_for_event(xcb_connection_t *c)
uint32_t xcb_generate_id(xcb_connection_t *c)
{
- // FIXME: THIS IS NOT THREAD SAFE.
- uint32_t id = (uint32_t)g_xcbIds.size();
- XcbId xcbId = { static_cast<xcb_connection_t *>(c) };
- g_xcbIds.push_back(xcbId);
- return id;
+ // This is a MONSTER hack to make XGL_nvidia compatible with both
+ // the LunarG apps and Dota2.
+ return (uint32_t)c->hwnd;
}
xcb_void_cookie_t