mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-08 08:40:55 +00:00
Add experimental support for WGL_NV_dx_interop, using DX textures in GL
This commit is contained in:
@@ -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] */
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
+4972
-5975
File diff suppressed because it is too large
Load Diff
@@ -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";
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user