Add experimental support for WGL_NV_dx_interop, using DX textures in GL

This commit is contained in:
baldurk
2016-10-17 16:56:40 +02:00
parent 4cd31908b4
commit 02667db2dc
11 changed files with 5754 additions and 6130 deletions
+109
View File
@@ -428,6 +428,115 @@ ResourceType IdentifyTypeByPtr(IUnknown *ptr)
return Resource_Unknown;
}
void *UnwrapDXDevice(void *dxDevice)
{
if(WrappedID3D11Device::IsAlloc(dxDevice))
return ((WrappedID3D11Device *)(ID3D11Device *)dxDevice)->GetReal();
return NULL;
}
ID3D11Resource *UnwrapDXResource(void *dxObject)
{
if(WrappedID3D11Buffer::IsAlloc(dxObject))
{
WrappedID3D11Buffer *w = (WrappedID3D11Buffer *)(ID3D11Buffer *)dxObject;
return w->GetReal();
}
else if(WrappedID3D11Texture1D::IsAlloc(dxObject))
{
WrappedID3D11Texture1D *w = (WrappedID3D11Texture1D *)(ID3D11Texture1D *)dxObject;
return w->GetReal();
}
else if(WrappedID3D11Texture2D1::IsAlloc(dxObject))
{
WrappedID3D11Texture2D1 *w = (WrappedID3D11Texture2D1 *)(ID3D11Texture2D1 *)dxObject;
return w->GetReal();
}
else if(WrappedID3D11Texture3D1::IsAlloc(dxObject))
{
WrappedID3D11Texture3D1 *w = (WrappedID3D11Texture3D1 *)(ID3D11Texture3D1 *)dxObject;
return w->GetReal();
}
return NULL;
}
void GetDXTextureProperties(void *dxObject, ResourceFormat &fmt, uint32_t &width, uint32_t &height,
uint32_t &depth, uint32_t &mips, uint32_t &layers, uint32_t &samples)
{
if(WrappedID3D11Buffer::IsAlloc(dxObject))
{
WrappedID3D11Buffer *w = (WrappedID3D11Buffer *)(ID3D11Buffer *)dxObject;
D3D11_BUFFER_DESC desc;
w->GetDesc(&desc);
fmt = ResourceFormat();
width = desc.ByteWidth;
height = 1;
depth = 1;
mips = 1;
layers = 1;
samples = 1;
return;
}
else if(WrappedID3D11Texture1D::IsAlloc(dxObject))
{
WrappedID3D11Texture1D *w = (WrappedID3D11Texture1D *)(ID3D11Texture1D *)dxObject;
D3D11_TEXTURE1D_DESC desc;
w->GetDesc(&desc);
fmt = MakeResourceFormat(desc.Format);
width = desc.Width;
height = 1;
depth = 1;
mips = desc.MipLevels ? desc.MipLevels : CalcNumMips(desc.Width, 1, 1);
layers = desc.ArraySize;
samples = 1;
return;
}
else if(WrappedID3D11Texture2D1::IsAlloc(dxObject))
{
WrappedID3D11Texture2D1 *w = (WrappedID3D11Texture2D1 *)(ID3D11Texture2D1 *)dxObject;
D3D11_TEXTURE2D_DESC desc;
w->GetDesc(&desc);
fmt = MakeResourceFormat(desc.Format);
width = desc.Width;
height = desc.Height;
depth = 1;
mips = desc.MipLevels ? desc.MipLevels : CalcNumMips(desc.Width, desc.Height, 1);
layers = desc.ArraySize;
samples = desc.SampleDesc.Count;
return;
}
else if(WrappedID3D11Texture3D1::IsAlloc(dxObject))
{
WrappedID3D11Texture3D1 *w = (WrappedID3D11Texture3D1 *)(ID3D11Texture3D1 *)dxObject;
D3D11_TEXTURE3D_DESC desc;
w->GetDesc(&desc);
fmt = MakeResourceFormat(desc.Format);
width = desc.Width;
height = desc.Height;
depth = desc.Depth;
mips = desc.MipLevels ? desc.MipLevels : CalcNumMips(desc.Width, desc.Height, desc.Depth);
layers = 1;
samples = 1;
return;
}
RDCERR("Getting DX texture properties for unknown/unhandled objects %p", dxObject);
}
HRESULT STDMETHODCALLTYPE RefCounter::QueryInterface(
/* [in] */ REFIID riid,
/* [annotation][iid_is][out] */
+19
View File
@@ -112,6 +112,22 @@ struct GLWindowingData
#error "Unknown platform"
#endif
// define stubs so other platforms can define these functions, but empty
#if !defined(RENDERDOC_PLATFORM_WIN32)
typedef void *HANDLE;
typedef long BOOL;
typedef BOOL(APIENTRYP *PFNWGLDXSETRESOURCESHAREHANDLENVPROC)(void *dxObject, HANDLE shareHandle);
typedef HANDLE(APIENTRYP *PFNWGLDXOPENDEVICENVPROC)(void *dxDevice);
typedef BOOL(APIENTRYP *PFNWGLDXCLOSEDEVICENVPROC)(HANDLE hDevice);
typedef HANDLE(APIENTRYP *PFNWGLDXREGISTEROBJECTNVPROC)(HANDLE hDevice, void *dxObject, GLuint name,
GLenum type, GLenum access);
typedef BOOL(APIENTRYP *PFNWGLDXUNREGISTEROBJECTNVPROC)(HANDLE hDevice, HANDLE hObject);
typedef BOOL(APIENTRYP *PFNWGLDXOBJECTACCESSNVPROC)(HANDLE hObject, GLenum access);
typedef BOOL(APIENTRYP *PFNWGLDXLOCKOBJECTSNVPROC)(HANDLE hDevice, GLint count, HANDLE *hObjects);
typedef BOOL(APIENTRYP *PFNWGLDXUNLOCKOBJECTSNVPROC)(HANDLE hDevice, GLint count, HANDLE *hObjects);
#endif
#include "api/replay/renderdoc_replay.h"
// similar to RDCUNIMPLEMENTED but for things that are hit often so we don't want to fire the
@@ -504,5 +520,8 @@ enum GLChunkType
CONTEXT_CAPTURE_HEADER,
CONTEXT_CAPTURE_FOOTER,
INTEROP_INIT,
INTEROP_DATA,
NUM_OPENGL_CHUNKS,
};
+8
View File
@@ -316,6 +316,9 @@ const char *GLChunkNames[] = {
"Capture",
"BeginCapture",
"EndCapture",
"wglDXRegisterObjectNV",
"wglDXLockObjectsNV",
};
GLInitParams::GLInitParams()
@@ -339,6 +342,7 @@ const uint32_t GLInitParams::GL_OLD_VERSIONS[GLInitParams::GL_NUM_SUPPORTED_OLD_
0x000011, // We added initial contents for buffers in this version, we don't have to do
// anything special to support older logs, just make sure we don't open new logs
// in an older version.
0x000012, // Added support for GL-DX interop
};
ReplayCreateStatus GLInitParams::Serialise()
@@ -3543,6 +3547,10 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context)
}
}
break;
case INTEROP_INIT:
Serialise_wglDXRegisterObjectNV(GLResource(MakeNullResource), eGL_NONE, NULL);
break;
case INTEROP_DATA: Serialise_wglDXLockObjectsNV(GLResource(MakeNullResource)); break;
default:
// ignore system chunks
if((int)context == (int)INITIAL_CONTENTS)
+17 -3
View File
@@ -53,10 +53,10 @@ struct GLInitParams : public RDCInitParams
uint32_t width;
uint32_t height;
static const uint32_t GL_SERIALISE_VERSION = 0x0000012;
static const uint32_t GL_SERIALISE_VERSION = 0x0000013;
// backwards compatibility for old logs described at the declaration of this array
static const uint32_t GL_NUM_SUPPORTED_OLD_VERSIONS = 2;
static const uint32_t GL_NUM_SUPPORTED_OLD_VERSIONS = 3;
static const uint32_t GL_OLD_VERSIONS[GL_NUM_SUPPORTED_OLD_VERSIONS];
// version number internal to opengl stream
@@ -244,6 +244,7 @@ private:
height(0),
depth(0),
samples(0),
mips(1),
creationFlags(0),
internalFormat(eGL_NONE),
renderbufferReadTex(0)
@@ -254,7 +255,7 @@ private:
GLenum curType;
GLint dimension;
bool emulated, view;
GLint width, height, depth, samples;
GLint width, height, depth, samples, mips;
uint32_t creationFlags;
GLenum internalFormat;
@@ -2367,6 +2368,19 @@ public:
GLsizei count, const GLuint *buffers,
const GLintptr *offsets,
const GLsizei *strides));
bool Serialise_wglDXRegisterObjectNV(GLResource res, GLenum type, void *dxObject);
bool Serialise_wglDXLockObjectsNV(GLResource res);
BOOL wglDXSetResourceShareHandleNV(void *dxObject, HANDLE shareHandle);
HANDLE wglDXOpenDeviceNV(void *dxDevice);
BOOL wglDXCloseDeviceNV(HANDLE hDevice);
HANDLE wglDXRegisterObjectNV(HANDLE hDevice, void *dxObject, GLuint name, GLenum type,
GLenum access);
BOOL wglDXUnregisterObjectNV(HANDLE hDevice, HANDLE hObject);
BOOL wglDXObjectAccessNV(HANDLE hObject, GLenum access);
BOOL wglDXLockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects);
BOOL wglDXUnlockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects);
};
class ScopedDebugContext
+5 -6
View File
@@ -811,16 +811,15 @@ private:
glhooks.wglGetPixelFormatAttribivARB_realfunc = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)realFunc;
return (PROC)&wglGetPixelFormatAttribivARB_hooked;
}
if(!strncmp(func, "wgl", 3)) // assume wgl functions are safe to just pass straight through
{
return realFunc;
}
HookCheckGLExtensions();
// assume wgl functions are safe to just pass straight through
if(!strncmp(func, "wgl", 3))
return realFunc;
// at the moment the unsupported functions are all lowercase (as their name is generated from
// the
// typedef name).
// the typedef name).
string lowername = strlower(string(func));
CheckUnsupported();
+77 -131
View File
@@ -27,6 +27,8 @@
#include "gl_common.h"
// We need to disable clang-format since this struct is programmatically parsed
// clang-format off
struct GLHookSet
{
// first we list all the core functions. 1.1 functions are separate under 'dllexport' for
@@ -119,12 +121,9 @@ struct GLHookSet
PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D; // aliases glCompressedTexImage1DARB
PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; // aliases glCompressedTexImage2DARB
PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; // aliases glCompressedTexImage3DARB
PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC
glCompressedTexSubImage1D; // aliases glCompressedTexSubImage1DARB
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC
glCompressedTexSubImage2D; // aliases glCompressedTexSubImage2DARB
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC
glCompressedTexSubImage3D; // aliases glCompressedTexSubImage3DARB
PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D; // aliases glCompressedTexSubImage1DARB
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D; // aliases glCompressedTexSubImage2DARB
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; // aliases glCompressedTexSubImage3DARB
PFNGLTEXBUFFERRANGEPROC glTexBufferRange;
PFNGLTEXTUREVIEWPROC glTextureView;
PFNGLTEXPARAMETERIIVPROC glTexParameterIiv; // aliases glTexParameterIivEXT
@@ -163,17 +162,14 @@ struct GLHookSet
PFNGLGETPROGRAMRESOURCELOCATIONPROC glGetProgramResourceLocation;
PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glGetProgramResourceLocationIndex;
PFNGLGETPROGRAMSTAGEIVPROC glGetProgramStageiv;
PFNGLGETGRAPHICSRESETSTATUSPROC
glGetGraphicsResetStatus; // aliases glGetGraphicsResetStatusARB
PFNGLGETGRAPHICSRESETSTATUSPROC glGetGraphicsResetStatus; // aliases glGetGraphicsResetStatusARB
PFNGLGETOBJECTLABELPROC glGetObjectLabel;
PFNGLGETOBJECTLABELEXTPROC glGetObjectLabelEXT;
PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel;
PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog; // aliases glGetDebugMessageLogARB
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC
glGetFramebufferAttachmentParameteriv; // aliases glGetFramebufferAttachmentParameterivEXT
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; // aliases glGetFramebufferAttachmentParameterivEXT
PFNGLGETFRAMEBUFFERPARAMETERIVPROC glGetFramebufferParameteriv;
PFNGLGETRENDERBUFFERPARAMETERIVPROC
glGetRenderbufferParameteriv; // aliases glGetRenderbufferParameterivEXT
PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; // aliases glGetRenderbufferParameterivEXT
PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
PFNGLGETQUERYINDEXEDIVPROC glGetQueryIndexediv;
PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; // aliases glGetQueryObjectui64vEXT
@@ -186,8 +182,7 @@ struct GLHookSet
PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv;
PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv;
PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; // aliases glGetCompressedTexImageARB
PFNGLGETNCOMPRESSEDTEXIMAGEPROC
glGetnCompressedTexImage; // aliases glGetnCompressedTexImageARB
PFNGLGETNCOMPRESSEDTEXIMAGEPROC glGetnCompressedTexImage; // aliases glGetnCompressedTexImageARB
PFNGLGETNTEXIMAGEPROC glGetnTexImage; // aliases glGetnTexImageARB
PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv; // aliases glGetTexParameterIivEXT
PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv; // aliases glGetTexParameterIuivEXT
@@ -197,8 +192,7 @@ struct GLHookSet
PFNGLGETSAMPLERPARAMETERIUIVPROC glGetSamplerParameterIuiv;
PFNGLGETSAMPLERPARAMETERFVPROC glGetSamplerParameterfv;
PFNGLGETSAMPLERPARAMETERIVPROC glGetSamplerParameteriv;
PFNGLGETTRANSFORMFEEDBACKVARYINGPROC
glGetTransformFeedbackVarying; // aliases glGetTransformFeedbackVaryingEXT
PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying; // aliases glGetTransformFeedbackVaryingEXT
PFNGLGETSUBROUTINEINDEXPROC glGetSubroutineIndex;
PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glGetSubroutineUniformLocation;
PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glGetActiveAtomicCounterBufferiv;
@@ -229,18 +223,15 @@ struct GLHookSet
PFNGLGETVERTEXATTRIBLDVPROC glGetVertexAttribLdv; // aliases glGetVertexAttribLdvEXT
PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv;
PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv;
PFNGLCHECKFRAMEBUFFERSTATUSPROC
glCheckFramebufferStatus; // aliases glCheckFramebufferStatusEXT
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; // aliases glCheckFramebufferStatusEXT
PFNGLBLENDCOLORPROC glBlendColor; // aliases glBlendColorEXT
PFNGLBLENDFUNCIPROC glBlendFunci; // aliases glBlendFunciARB
PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; // aliases glBlendFuncSeparateARB
PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei; // aliases glBlendFuncSeparateiARB
PFNGLBLENDEQUATIONPROC glBlendEquation; // aliases glBlendEquationEXT
PFNGLBLENDEQUATIONIPROC glBlendEquationi; // aliases glBlendEquationiARB
PFNGLBLENDEQUATIONSEPARATEPROC
glBlendEquationSeparate; // aliases glBlendEquationSeparateARB, glBlendEquationSeparateEXT
PFNGLBLENDEQUATIONSEPARATEIPROC
glBlendEquationSeparatei; // aliases glBlendEquationSeparateiARB
PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate; // aliases glBlendEquationSeparateARB, glBlendEquationSeparateEXT
PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei; // aliases glBlendEquationSeparateiARB
PFNGLBLENDBARRIERKHRPROC glBlendBarrierKHR;
PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate;
PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate;
@@ -308,17 +299,13 @@ struct GLHookSet
PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; // aliases glFramebufferTexture1DEXT
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; // aliases glFramebufferTexture2DEXT
PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; // aliases glFramebufferTexture3DEXT
PFNGLFRAMEBUFFERRENDERBUFFERPROC
glFramebufferRenderbuffer; // aliases glFramebufferRenderbufferEXT
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; // aliases
// glFramebufferTextureLayerARB,
// glFramebufferTextureLayerEXT
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; // aliases glFramebufferRenderbufferEXT
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; // aliases glFramebufferTextureLayerARB, glFramebufferTextureLayerEXT
PFNGLFRAMEBUFFERPARAMETERIPROC glFramebufferParameteri;
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; // aliases glDeleteFramebuffersEXT
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; // aliases glGenRenderbuffersEXT
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; // aliases glRenderbufferStorageEXT
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC
glRenderbufferStorageMultisample; // aliases glRenderbufferStorageMultisampleEXT
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; // aliases glRenderbufferStorageMultisampleEXT
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; // aliases glDeleteRenderbuffersEXT
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; // aliases glBindRenderbufferEXT
PFNGLFENCESYNCPROC glFenceSync;
@@ -346,13 +333,11 @@ struct GLHookSet
PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
PFNGLUNMAPBUFFERPROC glUnmapBuffer; // aliases glUnmapBufferARB
PFNGLTRANSFORMFEEDBACKVARYINGSPROC
glTransformFeedbackVaryings; // aliases glTransformFeedbackVaryingsEXT
PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; // aliases glTransformFeedbackVaryingsEXT
PFNGLGENTRANSFORMFEEDBACKSPROC glGenTransformFeedbacks;
PFNGLDELETETRANSFORMFEEDBACKSPROC glDeleteTransformFeedbacks;
PFNGLBINDTRANSFORMFEEDBACKPROC glBindTransformFeedback;
PFNGLBEGINTRANSFORMFEEDBACKPROC
glBeginTransformFeedback; // aliases glBeginTransformFeedbackEXT
PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; // aliases glBeginTransformFeedbackEXT
PFNGLPAUSETRANSFORMFEEDBACKPROC glPauseTransformFeedback;
PFNGLRESUMETRANSFORMFEEDBACKPROC glResumeTransformFeedback;
PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; // aliases glEndTransformFeedbackEXT
@@ -447,10 +432,8 @@ struct GLHookSet
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation; // aliases glBindFragDataLocationEXT
PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glBindFragDataLocationIndexed;
PFNGLENABLEVERTEXATTRIBARRAYPROC
glEnableVertexAttribArray; // aliases glEnableVertexAttribArrayARB
PFNGLDISABLEVERTEXATTRIBARRAYPROC
glDisableVertexAttribArray; // aliases glDisableVertexAttribArrayARB
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; // aliases glEnableVertexAttribArrayARB
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; // aliases glDisableVertexAttribArrayARB
PFNGLBINDVERTEXBUFFERPROC glBindVertexBuffer;
PFNGLBINDVERTEXBUFFERSPROC glBindVertexBuffers;
PFNGLVERTEXBINDINGDIVISORPROC glVertexBindingDivisor;
@@ -469,10 +452,8 @@ struct GLHookSet
PFNGLSAMPLERPARAMETERIUIVPROC glSamplerParameterIuiv;
PFNGLPATCHPARAMETERIPROC glPatchParameteri;
PFNGLPATCHPARAMETERFVPROC glPatchParameterfv;
PFNGLPOINTPARAMETERFPROC
glPointParameterf; // aliases glPointParameterfARB, aliases glPointParameterfEXT
PFNGLPOINTPARAMETERFVPROC
glPointParameterfv; // aliases glPointParameterfvARB, aliases glPointParameterfvEXT
PFNGLPOINTPARAMETERFPROC glPointParameterf; // aliases glPointParameterfARB, aliases glPointParameterfEXT
PFNGLPOINTPARAMETERFVPROC glPointParameterfv; // aliases glPointParameterfvARB, aliases glPointParameterfvEXT
PFNGLPOINTPARAMETERIPROC glPointParameteri;
PFNGLPOINTPARAMETERIVPROC glPointParameteriv;
PFNGLDISPATCHCOMPUTEPROC glDispatchCompute;
@@ -586,49 +567,29 @@ struct GLHookSet
PFNGLPROGRAMUNIFORM4IVPROC glProgramUniform4iv; // aliases glProgramUniform4ivEXT
PFNGLPROGRAMUNIFORM4UIVPROC glProgramUniform4uiv; // aliases glProgramUniform4uivEXT
PFNGLPROGRAMUNIFORM4DVPROC glProgramUniform4dv; // aliases glProgramUniform4dvEXT
PFNGLPROGRAMUNIFORMMATRIX2FVPROC
glProgramUniformMatrix2fv; // aliases glProgramUniformMatrix2fvEXT
PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC
glProgramUniformMatrix2x3fv; // aliases glProgramUniformMatrix2x3fvEXT
PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC
glProgramUniformMatrix2x4fv; // aliases glProgramUniformMatrix2x4fvEXT
PFNGLPROGRAMUNIFORMMATRIX3FVPROC
glProgramUniformMatrix3fv; // aliases glProgramUniformMatrix3fvEXT
PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC
glProgramUniformMatrix3x2fv; // aliases glProgramUniformMatrix3x2fvEXT
PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC
glProgramUniformMatrix3x4fv; // aliases glProgramUniformMatrix3x4fvEXT
PFNGLPROGRAMUNIFORMMATRIX4FVPROC
glProgramUniformMatrix4fv; // aliases glProgramUniformMatrix4fvEXT
PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC
glProgramUniformMatrix4x2fv; // aliases glProgramUniformMatrix4x2fvEXT
PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC
glProgramUniformMatrix4x3fv; // aliases glProgramUniformMatrix4x3fvEXT
PFNGLPROGRAMUNIFORMMATRIX2DVPROC
glProgramUniformMatrix2dv; // aliases glProgramUniformMatrix2dvEXT
PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC
glProgramUniformMatrix2x3dv; // aliases glProgramUniformMatrix2x3dvEXT
PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC
glProgramUniformMatrix2x4dv; // aliases glProgramUniformMatrix2x4dvEXT
PFNGLPROGRAMUNIFORMMATRIX3DVPROC
glProgramUniformMatrix3dv; // aliases glProgramUniformMatrix3dvEXT
PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC
glProgramUniformMatrix3x2dv; // aliases glProgramUniformMatrix3x2dvEXT
PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC
glProgramUniformMatrix3x4dv; // aliases glProgramUniformMatrix3x4dvEXT
PFNGLPROGRAMUNIFORMMATRIX4DVPROC
glProgramUniformMatrix4dv; // aliases glProgramUniformMatrix4dvEXT
PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC
glProgramUniformMatrix4x2dv; // aliases glProgramUniformMatrix4x2dvEXT
PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC
glProgramUniformMatrix4x3dv; // aliases glProgramUniformMatrix4x3dvEXT
PFNGLPROGRAMUNIFORMMATRIX2FVPROC glProgramUniformMatrix2fv; // aliases glProgramUniformMatrix2fvEXT
PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glProgramUniformMatrix2x3fv; // aliases glProgramUniformMatrix2x3fvEXT
PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glProgramUniformMatrix2x4fv; // aliases glProgramUniformMatrix2x4fvEXT
PFNGLPROGRAMUNIFORMMATRIX3FVPROC glProgramUniformMatrix3fv; // aliases glProgramUniformMatrix3fvEXT
PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glProgramUniformMatrix3x2fv; // aliases glProgramUniformMatrix3x2fvEXT
PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glProgramUniformMatrix3x4fv; // aliases glProgramUniformMatrix3x4fvEXT
PFNGLPROGRAMUNIFORMMATRIX4FVPROC glProgramUniformMatrix4fv; // aliases glProgramUniformMatrix4fvEXT
PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glProgramUniformMatrix4x2fv; // aliases glProgramUniformMatrix4x2fvEXT
PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glProgramUniformMatrix4x3fv; // aliases glProgramUniformMatrix4x3fvEXT
PFNGLPROGRAMUNIFORMMATRIX2DVPROC glProgramUniformMatrix2dv; // aliases glProgramUniformMatrix2dvEXT
PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glProgramUniformMatrix2x3dv; // aliases glProgramUniformMatrix2x3dvEXT
PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glProgramUniformMatrix2x4dv; // aliases glProgramUniformMatrix2x4dvEXT
PFNGLPROGRAMUNIFORMMATRIX3DVPROC glProgramUniformMatrix3dv; // aliases glProgramUniformMatrix3dvEXT
PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glProgramUniformMatrix3x2dv; // aliases glProgramUniformMatrix3x2dvEXT
PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glProgramUniformMatrix3x4dv; // aliases glProgramUniformMatrix3x4dvEXT
PFNGLPROGRAMUNIFORMMATRIX4DVPROC glProgramUniformMatrix4dv; // aliases glProgramUniformMatrix4dvEXT
PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glProgramUniformMatrix4x2dv; // aliases glProgramUniformMatrix4x2dvEXT
PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glProgramUniformMatrix4x3dv; // aliases glProgramUniformMatrix4x3dvEXT
PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; // aliases glDrawRangeElementsEXT
PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glDrawRangeElementsBaseVertex;
PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstance;
PFNGLDRAWARRAYSINSTANCEDPROC
glDrawArraysInstanced; // aliases glDrawArraysInstancedARB, glDrawArraysInstancedEXT
PFNGLDRAWELEMENTSINSTANCEDPROC
glDrawElementsInstanced; // aliases glDrawElementsInstancedARB, glDrawElementsInstancedEXT
PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; // aliases glDrawArraysInstancedARB, glDrawArraysInstancedEXT
PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; // aliases glDrawElementsInstancedARB, glDrawElementsInstancedEXT
PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glDrawElementsInstancedBaseInstance;
PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex;
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex;
@@ -723,22 +684,14 @@ struct GLHookSet
PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glGetMultiTexLevelParameterfvEXT;
PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glGetMultiTexLevelParameterivEXT;
PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glGetCompressedMultiTexImageEXT;
PFNGLGETNAMEDBUFFERPOINTERVEXTPROC
glGetNamedBufferPointervEXT; // aliases glGetNamedBufferPointerv
PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glGetNamedBufferPointervEXT; // aliases glGetNamedBufferPointerv
PFNGLGETNAMEDPROGRAMIVEXTPROC glGetNamedProgramivEXT;
PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC
glGetNamedFramebufferAttachmentParameterivEXT; // aliases
// glGetNamedFramebufferAttachmentParameteriv
PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC
glGetNamedBufferParameterivEXT; // aliases glGetNamedBufferParameteriv
PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC
glCheckNamedFramebufferStatusEXT; // aliases glCheckNamedFramebufferStatus
PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetNamedFramebufferAttachmentParameterivEXT; // aliases glGetNamedFramebufferAttachmentParameteriv
PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glGetNamedBufferParameterivEXT; // aliases glGetNamedBufferParameteriv
PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC glCheckNamedFramebufferStatusEXT; // aliases glCheckNamedFramebufferStatus
PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glGetNamedBufferSubDataEXT;
PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glGetNamedFramebufferParameterivEXT; // aliases
// glGetFramebufferParameterivEXT,
// glGetNamedFramebufferParameteriv
PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC
glGetNamedRenderbufferParameterivEXT; // aliases glGetNamedRenderbufferParameteriv
PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glGetNamedFramebufferParameterivEXT; // aliases glGetFramebufferParameterivEXT, glGetNamedFramebufferParameteriv
PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glGetNamedRenderbufferParameterivEXT; // aliases glGetNamedRenderbufferParameteriv
PFNGLGETVERTEXARRAYINTEGERVEXTPROC glGetVertexArrayIntegervEXT;
PFNGLGETVERTEXARRAYPOINTERVEXTPROC glGetVertexArrayPointervEXT;
PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glGetVertexArrayIntegeri_vEXT;
@@ -762,27 +715,18 @@ struct GLHookSet
PFNGLNAMEDBUFFERSTORAGEEXTPROC glNamedBufferStorageEXT;
PFNGLNAMEDBUFFERSUBDATAEXTPROC glNamedBufferSubDataEXT;
PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glNamedCopyBufferSubDataEXT;
PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC
glNamedFramebufferTextureEXT; // aliases glNamedFramebufferTexture
PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glNamedFramebufferTextureEXT; // aliases glNamedFramebufferTexture
PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glNamedFramebufferTexture1DEXT;
PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glNamedFramebufferTexture2DEXT;
PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glNamedFramebufferTexture3DEXT;
PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC
glNamedFramebufferRenderbufferEXT; // aliases glNamedFramebufferRenderbuffer
PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC
glNamedFramebufferTextureLayerEXT; // aliases glNamedFramebufferTextureLayer
PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC
glNamedFramebufferParameteriEXT; // aliases glNamedFramebufferParameteri
PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC
glNamedRenderbufferStorageEXT; // aliases glNamedRenderbufferStorage
PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC
glNamedRenderbufferStorageMultisampleEXT; // aliases glNamedRenderbufferStorageMultisample
PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC
glFramebufferDrawBufferEXT; // aliases glNamedFramebufferDrawBuffer
PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC
glFramebufferDrawBuffersEXT; // aliases glNamedFramebufferDrawBuffers
PFNGLFRAMEBUFFERREADBUFFEREXTPROC
glFramebufferReadBufferEXT; // aliases glNamedFramebufferReadBuffer
PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glNamedFramebufferRenderbufferEXT; // aliases glNamedFramebufferRenderbuffer
PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glNamedFramebufferTextureLayerEXT; // aliases glNamedFramebufferTextureLayer
PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glNamedFramebufferParameteriEXT; // aliases glNamedFramebufferParameteri
PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glNamedRenderbufferStorageEXT; // aliases glNamedRenderbufferStorage
PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glNamedRenderbufferStorageMultisampleEXT; // aliases glNamedRenderbufferStorageMultisample
PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glFramebufferDrawBufferEXT; // aliases glNamedFramebufferDrawBuffer
PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glFramebufferDrawBuffersEXT; // aliases glNamedFramebufferDrawBuffers
PFNGLFRAMEBUFFERREADBUFFEREXTPROC glFramebufferReadBufferEXT; // aliases glNamedFramebufferReadBuffer
PFNGLTEXTUREBUFFEREXTPROC glTextureBufferEXT;
PFNGLTEXTUREBUFFERRANGEEXTPROC glTextureBufferRangeEXT;
PFNGLTEXTUREIMAGE1DEXTPROC glTextureImage1DEXT;
@@ -834,27 +778,18 @@ struct GLHookSet
PFNGLGENERATEMULTITEXMIPMAPEXTPROC glGenerateMultiTexMipmapEXT;
PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glVertexArrayVertexAttribOffsetEXT;
PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glVertexArrayVertexAttribIOffsetEXT;
PFNGLENABLEVERTEXARRAYATTRIBEXTPROC
glEnableVertexArrayAttribEXT; // aliases glEnableVertexArrayAttrib
PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC
glDisableVertexArrayAttribEXT; // aliases glDisableVertexArrayAttrib
PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC
glVertexArrayBindVertexBufferEXT; // aliases glVertexArrayVertexBuffer
PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC
glVertexArrayVertexAttribFormatEXT; // aliases glVertexArrayAttribFormat
PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC
glVertexArrayVertexAttribIFormatEXT; // aliases glVertexArrayAttribIFormat
PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC
glVertexArrayVertexAttribLFormatEXT; // aliases glVertexArrayAttribLFormat
PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC
glVertexArrayVertexAttribBindingEXT; // aliases glVertexArrayAttribBinding
PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC
glVertexArrayVertexBindingDivisorEXT; // aliases glVertexArrayBindingDivisor
PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glEnableVertexArrayAttribEXT; // aliases glEnableVertexArrayAttrib
PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glDisableVertexArrayAttribEXT; // aliases glDisableVertexArrayAttrib
PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glVertexArrayBindVertexBufferEXT; // aliases glVertexArrayVertexBuffer
PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glVertexArrayVertexAttribFormatEXT; // aliases glVertexArrayAttribFormat
PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glVertexArrayVertexAttribIFormatEXT; // aliases glVertexArrayAttribIFormat
PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glVertexArrayVertexAttribLFormatEXT; // aliases glVertexArrayAttribLFormat
PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glVertexArrayVertexAttribBindingEXT; // aliases glVertexArrayAttribBinding
PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glVertexArrayVertexBindingDivisorEXT; // aliases glVertexArrayBindingDivisor
PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glVertexArrayVertexAttribLOffsetEXT;
PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glVertexArrayVertexAttribDivisorEXT;
// ARB_direct_state_access unique functions (others will be listed as aliases of EXT_dsa, see
// above).
// ARB_direct_state_access unique functions (others will be listed as aliases of EXT_dsa, see above).
PFNGLCREATETRANSFORMFEEDBACKSPROC glCreateTransformFeedbacks;
PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glTransformFeedbackBufferBase;
@@ -935,6 +870,17 @@ struct GLHookSet
PFNGLGETQUERYBUFFEROBJECTIVPROC glGetQueryBufferObjectiv;
PFNGLGETQUERYBUFFEROBJECTUI64VPROC glGetQueryBufferObjectui64v;
PFNGLGETQUERYBUFFEROBJECTUIVPROC glGetQueryBufferObjectuiv;
// stubbed on all non-windows platforms
PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV;
PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV;
PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV;
PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV;
PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV;
PFNWGLDXOBJECTACCESSNVPROC wglDXObjectAccessNV;
PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV;
PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV;
// --
};
// clang-format on
File diff suppressed because it is too large Load Diff
+19 -14
View File
@@ -35,6 +35,7 @@ open(HOOKSET, "<gl_hookset.h") || die "Couldn't open gl_hookset.h - run in drive
my @unsupported = ();
my @dllexport = ();
my @glext = ();
my @dropped = ();
my $current = \@unsupported;
@@ -63,7 +64,7 @@ while(<HOOKSET>)
}
elsif($current != \@unsupported)
{
if($line =~ /(PFN.*PROC) (.*);( \/\/ aliases )?([a-zA-Z0-9_ ,]*)?/)
if($line =~ /(PFN.*PROC) (.*);(\s*\/\/ aliases )?([a-zA-Z0-9_ ,]*)?/)
{
my $typedef = $1;
my $name = $2;
@@ -95,7 +96,7 @@ my @dllexportfuncs = ();
my @glextfuncs = ();
my @processed = ();
my $typedefs = `grep -Eh PFN[0-9A-Z_-]+PROC official/glcorearb.h official/glext.h`;
my $typedefs = `grep -Eh PFN[0-9A-Z_-]+PROC official/glcorearb.h official/glext.h official/wglext.h`;
foreach my $typedef (split(/\n/, $typedefs))
{
if($typedef =~ /^typedef (.*)\([A-Z *]* (.*)\) \((.*)\);/)
@@ -146,6 +147,10 @@ foreach my $typedef (split(/\n/, $typedefs))
$current = \@glextfuncs;
}
}
elsif($name =~ /^wgl/i)
{
$current = \@dropped;
}
my $funcdefmacro = "HookWrapper$argcount($returnType, $name";
$funcdefmacro .= ", $args" if $args ne "";
@@ -181,19 +186,19 @@ if($printdefs)
print <<ENDOFHEADER;
/******************************************************************************
* The MIT License (MIT)
*
*
* Copyright (c) 2015-2016 Baldur Karlsson
*
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -203,7 +208,6 @@ print <<ENDOFHEADER;
* THE SOFTWARE.
******************************************************************************/
#pragma once
// This file is autogenerated with hookset.pl - any changes will be overwritten
@@ -213,13 +217,15 @@ print <<ENDOFHEADER;
// \$ ./hookset.pl > gl_hookset_defs.h
ENDOFHEADER
print "// We need to disable clang-format since this struct is programmatically generated\n";
print "// clang-format off\n";
print "////////////////////////////////////////////////////\n";
print "\n";
print "// dllexport functions\n";
print "#define DLLExportHooks() \\\n";
foreach my $el (@dllexportfuncs)
{
print " HookInit($el->{name}); \\\n"
print " HookInit($el->{name}); \\\n"
}
print "\n";
print "\n";
@@ -228,15 +234,15 @@ print "// gl extensions\n";
print "#define HookCheckGLExtensions() \\\n";
foreach my $el (@glextfuncs)
{
print " HookExtension($el->{typedef}, $el->{name}); \\\n";
foreach(@{$el->{aliases}})
print " HookExtension($el->{typedef}, $el->{name}); \\\n";
foreach my $alias (@{$el->{aliases}})
{
print " HookExtensionAlias($el->{typedef}, $el->{name}, $_); \\\n";
print " HookExtensionAlias($el->{typedef}, $el->{name}, $alias); \\\n";
}
}
foreach my $el (@dllexportfuncs)
{
print " HookExtension($el->{typedef}, $el->{name}); \\\n"
print " HookExtension($el->{typedef}, $el->{name}); \\\n"
}
print "\n";
print "\n";
@@ -274,7 +280,6 @@ foreach my $el (@unsupported)
print " HandleUnsupported($el->{typedef}, $el->{name}); \\\n"
}
print "\n";
print "\n";
print "\n";
print "// clang-format on\n";
print "\n";
+2 -1
View File
@@ -57,6 +57,7 @@
<ClCompile Include="wrappers\gl_emulated.cpp" />
<ClCompile Include="wrappers\gl_framebuffer_funcs.cpp" />
<ClCompile Include="wrappers\gl_get_funcs.cpp" />
<ClCompile Include="wrappers\gl_interop_funcs.cpp" />
<ClCompile Include="wrappers\gl_query_funcs.cpp" />
<ClCompile Include="wrappers\gl_sampler_funcs.cpp" />
<ClCompile Include="wrappers\gl_shader_funcs.cpp" />
@@ -242,4 +243,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
@@ -149,5 +149,8 @@
<ClCompile Include="gl_replay.cpp">
<Filter>Replay</Filter>
</ClCompile>
<ClCompile Include="wrappers\gl_interop_funcs.cpp">
<Filter>Function Wrappers</Filter>
</ClCompile>
</ItemGroup>
</Project>
@@ -0,0 +1,523 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2016 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#include "../gl_driver.h"
#include "common/common.h"
#include "serialise/string_utils.h"
// define this if you e.g. haven't compiled the D3D modules and want to disable
// interop capture support.
#define RENDERDOC_DX_GL_INTEROP 1
#if defined(RENDERDOC_PLATFORM_WIN32) && RENDERDOC_DX_GL_INTEROP
struct ID3D11Resource;
void *UnwrapDXDevice(void *dxDevice);
ID3D11Resource *UnwrapDXResource(void *dxObject);
void GetDXTextureProperties(void *dxObject, ResourceFormat &fmt, uint32_t &width, uint32_t &height,
uint32_t &depth, uint32_t &mips, uint32_t &layers, uint32_t &samples);
BOOL WrappedOpenGL::wglDXSetResourceShareHandleNV(void *dxObject, HANDLE shareHandle)
{
// no-op
return m_Real.wglDXSetResourceShareHandleNV(dxObject, shareHandle);
}
HANDLE WrappedOpenGL::wglDXOpenDeviceNV(void *dxDevice)
{
void *unwrapped = UnwrapDXDevice(dxDevice);
if(unwrapped)
{
HANDLE ret = (HANDLE)m_Real.wglDXOpenDeviceNV(unwrapped);
SetLastError(S_OK);
return ret;
}
SetLastError(ERROR_NOT_SUPPORTED);
return 0;
}
BOOL WrappedOpenGL::wglDXCloseDeviceNV(HANDLE hDevice)
{
return m_Real.wglDXCloseDeviceNV(hDevice);
}
struct WrappedHANDLE
{
HANDLE real;
GLResource res;
};
HANDLE Unwrap(HANDLE h)
{
return ((WrappedHANDLE *)h)->real;
}
bool WrappedOpenGL::Serialise_wglDXRegisterObjectNV(GLResource res, GLenum type, void *dxObject)
{
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(res));
GLenum internalFormat = eGL_NONE;
uint32_t width = 0, height = 0, depth = 0, mips = 0, layers = 0, samples = 0;
if(m_State >= WRITING)
{
ResourceFormat format;
GetDXTextureProperties(dxObject, format, width, height, depth, mips, layers, samples);
internalFormat = MakeGLFormat(*this, format);
}
m_pSerialiser->Serialise("type", type);
m_pSerialiser->Serialise("internalFormat", internalFormat);
m_pSerialiser->Serialise("width", width);
m_pSerialiser->Serialise("height", height);
m_pSerialiser->Serialise("depth", depth);
m_pSerialiser->Serialise("mips", mips);
m_pSerialiser->Serialise("layers", layers);
m_pSerialiser->Serialise("samples", samples);
if(m_State < WRITING)
{
GLuint name = GetResourceManager()->GetLiveResource(id).name;
switch(type)
{
case eGL_NONE:
case eGL_TEXTURE_BUFFER:
{
GLuint buf = 0;
m_Real.glGenBuffers(1, &buf);
m_Real.glBindBuffer(eGL_TEXTURE_BUFFER, buf);
m_Real.glNamedBufferStorageEXT(name, width, NULL, GL_DYNAMIC_STORAGE_BIT);
m_Real.glTextureBufferEXT(name, type, internalFormat, buf);
break;
}
case eGL_TEXTURE_1D:
m_Real.glTextureStorage1DEXT(name, type, mips, internalFormat, width);
break;
case eGL_TEXTURE_1D_ARRAY:
m_Real.glTextureStorage2DEXT(name, type, mips, internalFormat, width, layers);
break;
// treat renderbuffers and texture rects as tex2D just to make things easier
case eGL_RENDERBUFFER:
case eGL_TEXTURE_RECTANGLE:
case eGL_TEXTURE_2D:
case eGL_TEXTURE_CUBE_MAP:
m_Real.glTextureStorage2DEXT(name, type, mips, internalFormat, width, height);
break;
case eGL_TEXTURE_2D_ARRAY:
case eGL_TEXTURE_CUBE_MAP_ARRAY:
m_Real.glTextureStorage3DEXT(name, type, mips, internalFormat, width, height, layers);
break;
case eGL_TEXTURE_2D_MULTISAMPLE:
m_Real.glTextureStorage2DMultisampleEXT(name, type, samples, internalFormat, width, height,
GL_TRUE);
break;
case eGL_TEXTURE_2D_MULTISAMPLE_ARRAY:
m_Real.glTextureStorage3DMultisampleEXT(name, type, samples, internalFormat, width, height,
layers, GL_TRUE);
break;
case eGL_TEXTURE_3D:
m_Real.glTextureStorage3DEXT(name, type, mips, internalFormat, width, height, depth);
break;
default: RDCERR("Unexpected type of interop texture: %s", ToStr::Get(type).c_str()); break;
}
ResourceId liveId = GetResourceManager()->GetLiveID(id);
m_Textures[liveId].curType = type;
m_Textures[liveId].width = width;
m_Textures[liveId].height = height;
m_Textures[liveId].depth = RDCMAX(depth, samples);
m_Textures[liveId].samples = samples;
m_Textures[liveId].mips = mips;
m_Textures[liveId].dimension = 2;
if(type == eGL_TEXTURE_1D || type == eGL_TEXTURE_1D_ARRAY)
m_Textures[liveId].dimension = 1;
else if(type == eGL_TEXTURE_3D)
m_Textures[liveId].dimension = 3;
if(type == eGL_NONE)
{
m_Textures[liveId].curType = eGL_TEXTURE_BUFFER;
m_Textures[liveId].dimension = 1;
}
m_Textures[liveId].internalFormat = internalFormat;
}
return true;
}
HANDLE WrappedOpenGL::wglDXRegisterObjectNV(HANDLE hDevice, void *dxObject, GLuint name,
GLenum type, GLenum access)
{
RDCASSERT(m_State >= WRITING);
ID3D11Resource *real = UnwrapDXResource(dxObject);
if(real == NULL)
{
SetLastError(ERROR_OPEN_FAILED);
return 0;
}
WrappedHANDLE *wrapped = new WrappedHANDLE();
wrapped->res =
type == eGL_RENDERBUFFER ? RenderbufferRes(GetCtx(), name) : TextureRes(GetCtx(), name);
wrapped->real = m_Real.wglDXRegisterObjectNV(hDevice, real, name, type, access);
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(wrapped->res);
{
RDCASSERT(record);
SCOPED_SERIALISE_CONTEXT(INTEROP_INIT);
Serialise_wglDXRegisterObjectNV(wrapped->res, type, dxObject);
record->AddChunk(scope.Get());
}
{
ResourceFormat fmt;
uint32_t width = 0, height = 0, depth = 0, mips = 0, layers = 0, samples = 0;
GetDXTextureProperties(dxObject, fmt, width, height, depth, mips, layers, samples);
ResourceId texId = record->GetResourceID();
m_Textures[texId].resource = wrapped->res;
m_Textures[texId].curType = type;
m_Textures[texId].width = width;
m_Textures[texId].height = height;
m_Textures[texId].depth = RDCMAX(depth, samples);
m_Textures[texId].samples = samples;
m_Textures[texId].mips = mips;
m_Textures[texId].dimension = 2;
if(type == eGL_TEXTURE_1D || type == eGL_TEXTURE_1D_ARRAY)
m_Textures[texId].dimension = 1;
else if(type == eGL_TEXTURE_3D)
m_Textures[texId].dimension = 3;
if(type == eGL_NONE)
{
m_Textures[texId].curType = eGL_TEXTURE_BUFFER;
m_Textures[texId].dimension = 1;
}
m_Textures[texId].internalFormat = MakeGLFormat(*this, fmt);
}
return wrapped;
}
BOOL WrappedOpenGL::wglDXUnregisterObjectNV(HANDLE hDevice, HANDLE hObject)
{
// don't need to intercept this, as the DX and GL textures will be deleted independently
BOOL ret = m_Real.wglDXUnregisterObjectNV(hDevice, Unwrap(hObject));
delete(WrappedHANDLE *)hObject;
return ret;
}
BOOL WrappedOpenGL::wglDXObjectAccessNV(HANDLE hObject, GLenum access)
{
// we don't need to care about access
return m_Real.wglDXObjectAccessNV(Unwrap(hObject), access);
}
bool WrappedOpenGL::Serialise_wglDXLockObjectsNV(GLResource res)
{
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(res));
SERIALISE_ELEMENT(GLenum, textype, m_Textures[id].curType);
const GLHookSet &gl = m_Real;
if(m_State >= WRITING)
{
GLuint ppb = 0;
gl.glGetIntegerv(eGL_PIXEL_PACK_BUFFER_BINDING, (GLint *)&ppb);
gl.glBindBuffer(eGL_PIXEL_PACK_BUFFER, 0);
GLint packParams[8];
gl.glGetIntegerv(eGL_PACK_SWAP_BYTES, &packParams[0]);
gl.glGetIntegerv(eGL_PACK_LSB_FIRST, &packParams[1]);
gl.glGetIntegerv(eGL_PACK_ROW_LENGTH, &packParams[2]);
gl.glGetIntegerv(eGL_PACK_IMAGE_HEIGHT, &packParams[3]);
gl.glGetIntegerv(eGL_PACK_SKIP_PIXELS, &packParams[4]);
gl.glGetIntegerv(eGL_PACK_SKIP_ROWS, &packParams[5]);
gl.glGetIntegerv(eGL_PACK_SKIP_IMAGES, &packParams[6]);
gl.glGetIntegerv(eGL_PACK_ALIGNMENT, &packParams[7]);
gl.glPixelStorei(eGL_PACK_SWAP_BYTES, 0);
gl.glPixelStorei(eGL_PACK_LSB_FIRST, 0);
gl.glPixelStorei(eGL_PACK_ROW_LENGTH, 0);
gl.glPixelStorei(eGL_PACK_IMAGE_HEIGHT, 0);
gl.glPixelStorei(eGL_PACK_SKIP_PIXELS, 0);
gl.glPixelStorei(eGL_PACK_SKIP_ROWS, 0);
gl.glPixelStorei(eGL_PACK_SKIP_IMAGES, 0);
gl.glPixelStorei(eGL_PACK_ALIGNMENT, 1);
{
TextureData &details = m_Textures[id];
GLuint tex = res.name;
GLenum fmt = GetBaseFormat(details.internalFormat);
GLenum type = GetDataType(details.internalFormat);
size_t size = GetByteSize(details.width, details.height, details.depth, fmt, type);
byte *buf = new byte[size];
GLenum binding = TextureBinding(details.curType);
GLuint prevtex = 0;
gl.glGetIntegerv(binding, (GLint *)&prevtex);
gl.glBindTexture(textype, tex);
for(int i = 0; i < details.mips; i++)
{
int w = RDCMAX(details.width >> i, 1);
int h = RDCMAX(details.height >> i, 1);
int d = RDCMAX(details.depth >> i, 1);
if(textype == eGL_TEXTURE_CUBE_MAP_ARRAY || textype == eGL_TEXTURE_1D_ARRAY ||
textype == eGL_TEXTURE_2D_ARRAY)
d = details.depth;
size = GetByteSize(w, h, d, fmt, type);
GLenum targets[] = {
eGL_TEXTURE_CUBE_MAP_POSITIVE_X, eGL_TEXTURE_CUBE_MAP_NEGATIVE_X,
eGL_TEXTURE_CUBE_MAP_POSITIVE_Y, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
eGL_TEXTURE_CUBE_MAP_POSITIVE_Z, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
};
int count = ARRAY_COUNT(targets);
if(textype != eGL_TEXTURE_CUBE_MAP)
{
targets[0] = textype;
count = 1;
}
for(int trg = 0; trg < count; trg++)
{
// we avoid glGetTextureImageEXT as it seems buggy for cubemap faces
gl.glGetTexImage(targets[trg], i, fmt, type, buf);
m_pSerialiser->SerialiseBuffer("image", buf, size);
}
}
gl.glBindTexture(textype, prevtex);
SAFE_DELETE_ARRAY(buf);
}
gl.glBindBuffer(eGL_PIXEL_PACK_BUFFER, ppb);
gl.glPixelStorei(eGL_PACK_SWAP_BYTES, packParams[0]);
gl.glPixelStorei(eGL_PACK_LSB_FIRST, packParams[1]);
gl.glPixelStorei(eGL_PACK_ROW_LENGTH, packParams[2]);
gl.glPixelStorei(eGL_PACK_IMAGE_HEIGHT, packParams[3]);
gl.glPixelStorei(eGL_PACK_SKIP_PIXELS, packParams[4]);
gl.glPixelStorei(eGL_PACK_SKIP_ROWS, packParams[5]);
gl.glPixelStorei(eGL_PACK_SKIP_IMAGES, packParams[6]);
gl.glPixelStorei(eGL_PACK_ALIGNMENT, packParams[7]);
}
else
{
GLuint pub = 0;
gl.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, (GLint *)&pub);
gl.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, 0);
GLint unpackParams[8];
gl.glGetIntegerv(eGL_UNPACK_SWAP_BYTES, &unpackParams[0]);
gl.glGetIntegerv(eGL_UNPACK_LSB_FIRST, &unpackParams[1]);
gl.glGetIntegerv(eGL_UNPACK_ROW_LENGTH, &unpackParams[2]);
gl.glGetIntegerv(eGL_UNPACK_IMAGE_HEIGHT, &unpackParams[3]);
gl.glGetIntegerv(eGL_UNPACK_SKIP_PIXELS, &unpackParams[4]);
gl.glGetIntegerv(eGL_UNPACK_SKIP_ROWS, &unpackParams[5]);
gl.glGetIntegerv(eGL_UNPACK_SKIP_IMAGES, &unpackParams[6]);
gl.glGetIntegerv(eGL_UNPACK_ALIGNMENT, &unpackParams[7]);
gl.glPixelStorei(eGL_UNPACK_SWAP_BYTES, 0);
gl.glPixelStorei(eGL_UNPACK_LSB_FIRST, 0);
gl.glPixelStorei(eGL_UNPACK_ROW_LENGTH, 0);
gl.glPixelStorei(eGL_UNPACK_IMAGE_HEIGHT, 0);
gl.glPixelStorei(eGL_UNPACK_SKIP_PIXELS, 0);
gl.glPixelStorei(eGL_UNPACK_SKIP_ROWS, 0);
gl.glPixelStorei(eGL_UNPACK_SKIP_IMAGES, 0);
gl.glPixelStorei(eGL_UNPACK_ALIGNMENT, 1);
{
TextureData &details = m_Textures[GetResourceManager()->GetLiveID(id)];
GLuint tex = GetResourceManager()->GetLiveResource(id).name;
GLenum fmt = GetBaseFormat(details.internalFormat);
GLenum type = GetDataType(details.internalFormat);
GLint dim = details.dimension;
for(int i = 0; i < details.mips; i++)
{
uint32_t w = RDCMAX(details.width >> i, 1);
uint32_t h = RDCMAX(details.height >> i, 1);
uint32_t d = RDCMAX(details.depth >> i, 1);
if(textype == eGL_TEXTURE_CUBE_MAP_ARRAY || textype == eGL_TEXTURE_1D_ARRAY ||
textype == eGL_TEXTURE_2D_ARRAY)
d = details.depth;
GLenum targets[] = {
eGL_TEXTURE_CUBE_MAP_POSITIVE_X, eGL_TEXTURE_CUBE_MAP_NEGATIVE_X,
eGL_TEXTURE_CUBE_MAP_POSITIVE_Y, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
eGL_TEXTURE_CUBE_MAP_POSITIVE_Z, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
};
int count = ARRAY_COUNT(targets);
if(textype != eGL_TEXTURE_CUBE_MAP)
{
targets[0] = textype;
count = 1;
}
for(int trg = 0; trg < count; trg++)
{
size_t size = 0;
byte *buf = NULL;
m_pSerialiser->SerialiseBuffer("image", buf, size);
if(dim == 1)
gl.glTextureSubImage1DEXT(tex, targets[trg], i, 0, w, fmt, type, buf);
else if(dim == 2)
gl.glTextureSubImage2DEXT(tex, targets[trg], i, 0, 0, w, h, fmt, type, buf);
else if(dim == 3)
gl.glTextureSubImage3DEXT(tex, targets[trg], i, 0, 0, 0, w, h, d, fmt, type, buf);
delete[] buf;
}
}
}
gl.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, pub);
gl.glPixelStorei(eGL_UNPACK_SWAP_BYTES, unpackParams[0]);
gl.glPixelStorei(eGL_UNPACK_LSB_FIRST, unpackParams[1]);
gl.glPixelStorei(eGL_UNPACK_ROW_LENGTH, unpackParams[2]);
gl.glPixelStorei(eGL_UNPACK_IMAGE_HEIGHT, unpackParams[3]);
gl.glPixelStorei(eGL_UNPACK_SKIP_PIXELS, unpackParams[4]);
gl.glPixelStorei(eGL_UNPACK_SKIP_ROWS, unpackParams[5]);
gl.glPixelStorei(eGL_UNPACK_SKIP_IMAGES, unpackParams[6]);
gl.glPixelStorei(eGL_UNPACK_ALIGNMENT, unpackParams[7]);
}
return true;
}
BOOL WrappedOpenGL::wglDXLockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects)
{
HANDLE *unwrapped = new HANDLE[count];
for(GLint i = 0; i < count; i++)
unwrapped[i] = Unwrap(hObjects[i]);
BOOL ret = m_Real.wglDXLockObjectsNV(hDevice, count, unwrapped);
if(m_State == WRITING_CAPFRAME)
{
for(GLint i = 0; i < count; i++)
{
WrappedHANDLE *w = (WrappedHANDLE *)hObjects[i];
SCOPED_SERIALISE_CONTEXT(INTEROP_DATA);
Serialise_wglDXLockObjectsNV(w->res);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(GetResourceManager()->GetID(w->res),
eFrameRef_Read);
}
}
SAFE_DELETE_ARRAY(unwrapped);
return ret;
}
BOOL WrappedOpenGL::wglDXUnlockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects)
{
HANDLE *unwrapped = new HANDLE[count];
for(GLint i = 0; i < count; i++)
unwrapped[i] = Unwrap(hObjects[i]);
BOOL ret = m_Real.wglDXUnlockObjectsNV(hDevice, count, unwrapped);
SAFE_DELETE_ARRAY(unwrapped);
return ret;
}
#else
BOOL WrappedOpenGL::wglDXSetResourceShareHandleNV(void *dxObject, HANDLE shareHandle)
{
return 0;
}
HANDLE WrappedOpenGL::wglDXOpenDeviceNV(void *dxDevice)
{
return 0;
}
BOOL WrappedOpenGL::wglDXCloseDeviceNV(HANDLE hDevice)
{
return 0;
}
HANDLE WrappedOpenGL::wglDXRegisterObjectNV(HANDLE hDevice, void *dxObject, GLuint name,
GLenum type, GLenum access)
{
return 0;
}
BOOL WrappedOpenGL::wglDXUnregisterObjectNV(HANDLE hDevice, HANDLE hObject)
{
return 0;
}
BOOL WrappedOpenGL::wglDXObjectAccessNV(HANDLE hObject, GLenum access)
{
return 0;
}
BOOL WrappedOpenGL::wglDXLockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects)
{
return 0;
}
BOOL WrappedOpenGL::wglDXUnlockObjectsNV(HANDLE hDevice, GLint count, HANDLE *hObjects)
{
return 0;
}
#endif