From dcc5362dc143b0b24a2348dddb3baa92761ab8b3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 23 Jul 2015 20:28:03 +0200 Subject: [PATCH] On replay check that expected func ptrs for 4.3 + EXT_dsa are present * Also log out which function pointers are actually available --- renderdoc/driver/gl/gl_replay_win32.cpp | 307 +++++++++++++++++++++++- 1 file changed, 306 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_replay_win32.cpp b/renderdoc/driver/gl/gl_replay_win32.cpp index c0dc03132..c8e8ddc5e 100644 --- a/renderdoc/driver/gl/gl_replay_win32.cpp +++ b/renderdoc/driver/gl/gl_replay_win32.cpp @@ -458,7 +458,312 @@ ReplayCreateStatus GL_CreateReplayDevice(const char *logfile, IReplayDriver **dr } } - WrappedOpenGL *gl = new WrappedOpenGL(logfile, GetRealFunctions()); + const GLHookSet &real = GetRealFunctions(); + + PFNGLGETSTRINGPROC *ptrs = (PFNGLGETSTRINGPROC *)ℜ + size_t num = sizeof(real)/sizeof(PFNGLGETSTRINGPROC); + + RDCLOG("Function pointers available:"); + for(size_t i=0; i < num; ) + { + uint64_t ptrmask = 0; + + for(size_t j=0; j < 64; j++) + if(i + j < num && ptrs[i+j]) + ptrmask |= 1ULL<<(63-j); + + i += 64; + + RDCLOG("%64llb", ptrmask); + } + +// check for the presence of GL functions we will call unconditionally as part of the replay process. +// Other functions that are only called to deserialise are checked for presence separately + +#define CHECK_PRESENT(func) \ + if(!real.func) \ + { \ + RDCERR("Missing function %s, required for replay. RenderDoc requires a 4.3 context and EXT_direct_state_access", #func); \ + wglMakeCurrentProc(NULL, NULL); \ + wglDeleteRC(rc); \ + ReleaseDC(w, dc); \ + GLReplay::PostContextShutdownCounters(); \ + return eReplayCreate_APIHardwareUnsupported; \ + } + +// these functions should all be present as part of a 4.3 context, but let's just be extra-careful +CHECK_PRESENT(glActiveTexture) +CHECK_PRESENT(glAttachShader) +CHECK_PRESENT(glBeginQuery) +CHECK_PRESENT(glBeginTransformFeedback) +CHECK_PRESENT(glBindAttribLocation) +CHECK_PRESENT(glBindBuffer) +CHECK_PRESENT(glBindBufferBase) +CHECK_PRESENT(glBindBufferRange) +CHECK_PRESENT(glBindFragDataLocation) +CHECK_PRESENT(glBindFramebuffer) +CHECK_PRESENT(glBindImageTexture) +CHECK_PRESENT(glBindProgramPipeline) +CHECK_PRESENT(glBindSampler) +CHECK_PRESENT(glBindTexture) +CHECK_PRESENT(glBindTransformFeedback) +CHECK_PRESENT(glBindVertexArray) +CHECK_PRESENT(glBindVertexBuffer) +CHECK_PRESENT(glBlendColor) +CHECK_PRESENT(glBlendEquationSeparate) +CHECK_PRESENT(glBlendEquationSeparatei) +CHECK_PRESENT(glBlendFunc) +CHECK_PRESENT(glBlendFuncSeparate) +CHECK_PRESENT(glBlendFuncSeparatei) +CHECK_PRESENT(glBlitFramebuffer) +CHECK_PRESENT(glBufferData) +CHECK_PRESENT(glBufferSubData) +CHECK_PRESENT(glClearBufferData) +CHECK_PRESENT(glClearBufferfi) +CHECK_PRESENT(glClearBufferfv) +CHECK_PRESENT(glClearBufferiv) +CHECK_PRESENT(glClearBufferuiv) +CHECK_PRESENT(glClearColor) +CHECK_PRESENT(glClearDepth) +CHECK_PRESENT(glColorMaski) +CHECK_PRESENT(glCompileShader) +CHECK_PRESENT(glCopyImageSubData) +CHECK_PRESENT(glCreateProgram) +CHECK_PRESENT(glCreateShader) +CHECK_PRESENT(glCreateShaderProgramv) +CHECK_PRESENT(glCullFace) +CHECK_PRESENT(glDebugMessageCallback) +CHECK_PRESENT(glDeleteBuffers) +CHECK_PRESENT(glDeleteFramebuffers) +CHECK_PRESENT(glDeleteProgram) +CHECK_PRESENT(glDeleteProgramPipelines) +CHECK_PRESENT(glDeleteQueries) +CHECK_PRESENT(glDeleteSamplers) +CHECK_PRESENT(glDeleteShader) +CHECK_PRESENT(glDeleteTextures) +CHECK_PRESENT(glDeleteTransformFeedbacks) +CHECK_PRESENT(glDeleteVertexArrays) +CHECK_PRESENT(glDepthFunc) +CHECK_PRESENT(glDepthMask) +CHECK_PRESENT(glDepthRangeArrayv) +CHECK_PRESENT(glDetachShader) +CHECK_PRESENT(glDisable) +CHECK_PRESENT(glDisablei) +CHECK_PRESENT(glDisableVertexAttribArray) +CHECK_PRESENT(glDispatchCompute) +CHECK_PRESENT(glDrawArrays) +CHECK_PRESENT(glDrawArraysInstanced) +CHECK_PRESENT(glDrawArraysInstancedBaseInstance) +CHECK_PRESENT(glDrawBuffers) +CHECK_PRESENT(glDrawElements) +CHECK_PRESENT(glDrawElementsBaseVertex) +CHECK_PRESENT(glDrawElementsInstancedBaseVertexBaseInstance) +CHECK_PRESENT(glEnable) +CHECK_PRESENT(glEnablei) +CHECK_PRESENT(glEnableVertexAttribArray) +CHECK_PRESENT(glEndConditionalRender) +CHECK_PRESENT(glEndQuery) +CHECK_PRESENT(glEndQueryIndexed) +CHECK_PRESENT(glEndTransformFeedback) +CHECK_PRESENT(glFramebufferTexture) +CHECK_PRESENT(glFramebufferTexture2D) +CHECK_PRESENT(glFramebufferTexture3D) +CHECK_PRESENT(glFramebufferTextureLayer) +CHECK_PRESENT(glFrontFace) +CHECK_PRESENT(glGenBuffers) +CHECK_PRESENT(glGenFramebuffers) +CHECK_PRESENT(glGenProgramPipelines) +CHECK_PRESENT(glGenQueries) +CHECK_PRESENT(glGenSamplers) +CHECK_PRESENT(glGenTextures) +CHECK_PRESENT(glGenTransformFeedbacks) +CHECK_PRESENT(glGenVertexArrays) +CHECK_PRESENT(glGetActiveAtomicCounterBufferiv) +CHECK_PRESENT(glGetActiveUniformBlockiv) +CHECK_PRESENT(glGetAttribLocation) +CHECK_PRESENT(glGetBooleani_v) +CHECK_PRESENT(glGetBooleanv) +CHECK_PRESENT(glGetBufferParameteriv) +CHECK_PRESENT(glGetBufferSubData) +CHECK_PRESENT(glGetCompressedTexImage) +CHECK_PRESENT(glGetDoublei_v) +CHECK_PRESENT(glGetDoublev) +CHECK_PRESENT(glGetError) +CHECK_PRESENT(glGetFloati_v) +CHECK_PRESENT(glGetFloatv) +CHECK_PRESENT(glGetFragDataLocation) +CHECK_PRESENT(glGetFramebufferAttachmentParameteriv) +CHECK_PRESENT(glGetInteger64i_v) +CHECK_PRESENT(glGetIntegeri_v) +CHECK_PRESENT(glGetIntegerv) +CHECK_PRESENT(glGetInternalformativ) +CHECK_PRESENT(glGetObjectLabel) +CHECK_PRESENT(glGetProgramInfoLog) +CHECK_PRESENT(glGetProgramInterfaceiv) +CHECK_PRESENT(glGetProgramiv) +CHECK_PRESENT(glGetProgramPipelineiv) +CHECK_PRESENT(glGetProgramResourceIndex) +CHECK_PRESENT(glGetProgramResourceiv) +CHECK_PRESENT(glGetProgramResourceName) +CHECK_PRESENT(glGetProgramStageiv) +CHECK_PRESENT(glGetQueryObjectuiv) +CHECK_PRESENT(glGetSamplerParameterfv) +CHECK_PRESENT(glGetSamplerParameteriv) +CHECK_PRESENT(glGetShaderInfoLog) +CHECK_PRESENT(glGetShaderiv) +CHECK_PRESENT(glGetString) +CHECK_PRESENT(glGetStringi) +CHECK_PRESENT(glGetTexImage) +CHECK_PRESENT(glGetTexLevelParameteriv) +CHECK_PRESENT(glGetTexParameterfv) +CHECK_PRESENT(glGetTexParameteriv) +CHECK_PRESENT(glGetUniformBlockIndex) +CHECK_PRESENT(glGetUniformdv) +CHECK_PRESENT(glGetUniformfv) +CHECK_PRESENT(glGetUniformiv) +CHECK_PRESENT(glGetUniformLocation) +CHECK_PRESENT(glGetUniformSubroutineuiv) +CHECK_PRESENT(glGetUniformuiv) +CHECK_PRESENT(glGetVertexAttribfv) +CHECK_PRESENT(glGetVertexAttribiv) +CHECK_PRESENT(glHint) +CHECK_PRESENT(glIsEnabled) +CHECK_PRESENT(glIsEnabledi) +CHECK_PRESENT(glLineWidth) +CHECK_PRESENT(glLinkProgram) +CHECK_PRESENT(glLogicOp) +CHECK_PRESENT(glMapBufferRange) +CHECK_PRESENT(glMinSampleShading) +CHECK_PRESENT(glObjectLabel) +CHECK_PRESENT(glPatchParameterfv) +CHECK_PRESENT(glPatchParameteri) +CHECK_PRESENT(glPixelStorei) +CHECK_PRESENT(glPointParameterf) +CHECK_PRESENT(glPointParameteri) +CHECK_PRESENT(glPointSize) +CHECK_PRESENT(glPolygonMode) +CHECK_PRESENT(glPolygonOffset) +CHECK_PRESENT(glPrimitiveRestartIndex) +CHECK_PRESENT(glProgramParameteri) +CHECK_PRESENT(glProgramUniform1dv) +CHECK_PRESENT(glProgramUniform1fv) +CHECK_PRESENT(glProgramUniform1iv) +CHECK_PRESENT(glProgramUniform1ui) +CHECK_PRESENT(glProgramUniform1uiv) +CHECK_PRESENT(glProgramUniform2dv) +CHECK_PRESENT(glProgramUniform2fv) +CHECK_PRESENT(glProgramUniform2iv) +CHECK_PRESENT(glProgramUniform2uiv) +CHECK_PRESENT(glProgramUniform3dv) +CHECK_PRESENT(glProgramUniform3fv) +CHECK_PRESENT(glProgramUniform3iv) +CHECK_PRESENT(glProgramUniform3uiv) +CHECK_PRESENT(glProgramUniform4dv) +CHECK_PRESENT(glProgramUniform4fv) +CHECK_PRESENT(glProgramUniform4iv) +CHECK_PRESENT(glProgramUniform4ui) +CHECK_PRESENT(glProgramUniform4uiv) +CHECK_PRESENT(glProgramUniformMatrix2dv) +CHECK_PRESENT(glProgramUniformMatrix2fv) +CHECK_PRESENT(glProgramUniformMatrix2x3dv) +CHECK_PRESENT(glProgramUniformMatrix2x3fv) +CHECK_PRESENT(glProgramUniformMatrix2x4dv) +CHECK_PRESENT(glProgramUniformMatrix2x4fv) +CHECK_PRESENT(glProgramUniformMatrix3dv) +CHECK_PRESENT(glProgramUniformMatrix3fv) +CHECK_PRESENT(glProgramUniformMatrix3x2dv) +CHECK_PRESENT(glProgramUniformMatrix3x2fv) +CHECK_PRESENT(glProgramUniformMatrix3x4dv) +CHECK_PRESENT(glProgramUniformMatrix3x4fv) +CHECK_PRESENT(glProgramUniformMatrix4dv) +CHECK_PRESENT(glProgramUniformMatrix4fv) +CHECK_PRESENT(glProgramUniformMatrix4x2dv) +CHECK_PRESENT(glProgramUniformMatrix4x2fv) +CHECK_PRESENT(glProgramUniformMatrix4x3dv) +CHECK_PRESENT(glProgramUniformMatrix4x3fv) +CHECK_PRESENT(glProvokingVertex) +CHECK_PRESENT(glReadBuffer) +CHECK_PRESENT(glReadPixels) +CHECK_PRESENT(glSampleCoverage) +CHECK_PRESENT(glSampleMaski) +CHECK_PRESENT(glSamplerParameteri) +CHECK_PRESENT(glScissorIndexedv) +CHECK_PRESENT(glShaderSource) +CHECK_PRESENT(glShaderStorageBlockBinding) +CHECK_PRESENT(glStencilFuncSeparate) +CHECK_PRESENT(glStencilMask) +CHECK_PRESENT(glStencilMaskSeparate) +CHECK_PRESENT(glStencilOpSeparate) +CHECK_PRESENT(glTexImage2D) +CHECK_PRESENT(glTexParameteri) +CHECK_PRESENT(glTexStorage2D) +CHECK_PRESENT(glTextureView) +CHECK_PRESENT(glTransformFeedbackVaryings) +CHECK_PRESENT(glUniform1i) +CHECK_PRESENT(glUniform1ui) +CHECK_PRESENT(glUniform2f) +CHECK_PRESENT(glUniform2fv) +CHECK_PRESENT(glUniform4fv) +CHECK_PRESENT(glUniformBlockBinding) +CHECK_PRESENT(glUniformMatrix4fv) +CHECK_PRESENT(glUniformSubroutinesuiv) +CHECK_PRESENT(glUnmapBuffer) +CHECK_PRESENT(glUseProgram) +CHECK_PRESENT(glUseProgramStages) +CHECK_PRESENT(glVertexAttrib4fv) +CHECK_PRESENT(glVertexAttribBinding) +CHECK_PRESENT(glVertexAttribFormat) +CHECK_PRESENT(glVertexAttribIFormat) +CHECK_PRESENT(glVertexAttribLFormat) +CHECK_PRESENT(glVertexAttribPointer) +CHECK_PRESENT(glVertexBindingDivisor) +CHECK_PRESENT(glViewport) +CHECK_PRESENT(glViewportArrayv) +CHECK_PRESENT(glViewportIndexedf) + +// these functions should be present as part of EXT_direct_state_access, let's verify +CHECK_PRESENT(glCompressedTextureImage1DEXT) +CHECK_PRESENT(glCompressedTextureImage2DEXT) +CHECK_PRESENT(glCompressedTextureImage3DEXT) +CHECK_PRESENT(glCompressedTextureSubImage1DEXT) +CHECK_PRESENT(glCompressedTextureSubImage2DEXT) +CHECK_PRESENT(glCompressedTextureSubImage3DEXT) +CHECK_PRESENT(glGetCompressedTextureImageEXT) +CHECK_PRESENT(glGetNamedBufferParameterivEXT) +CHECK_PRESENT(glGetNamedBufferSubDataEXT) +CHECK_PRESENT(glGetNamedFramebufferAttachmentParameterivEXT) +CHECK_PRESENT(glGetTextureLevelParameterivEXT) +CHECK_PRESENT(glGetTextureParameterfvEXT) +CHECK_PRESENT(glGetTextureParameterivEXT) +CHECK_PRESENT(glMapNamedBufferEXT) +CHECK_PRESENT(glNamedBufferDataEXT) +CHECK_PRESENT(glNamedBufferStorageEXT) +CHECK_PRESENT(glNamedBufferSubDataEXT) +CHECK_PRESENT(glNamedFramebufferRenderbufferEXT) +CHECK_PRESENT(glNamedFramebufferTextureEXT) +CHECK_PRESENT(glNamedFramebufferTextureLayerEXT) +CHECK_PRESENT(glTextureBufferRangeEXT) +CHECK_PRESENT(glTextureImage1DEXT) +CHECK_PRESENT(glTextureImage2DEXT) +CHECK_PRESENT(glTextureImage3DEXT) +CHECK_PRESENT(glTextureParameterfvEXT) +CHECK_PRESENT(glTextureParameterivEXT) +CHECK_PRESENT(glTextureStorage1DEXT) +CHECK_PRESENT(glTextureStorage2DEXT) +CHECK_PRESENT(glTextureStorage2DMultisampleEXT) +CHECK_PRESENT(glTextureStorage3DEXT) +CHECK_PRESENT(glTextureStorage3DMultisampleEXT) +CHECK_PRESENT(glTextureSubImage1DEXT) +CHECK_PRESENT(glTextureSubImage2DEXT) +CHECK_PRESENT(glTextureSubImage3DEXT) +CHECK_PRESENT(glUnmapNamedBufferEXT) + +// other functions are either checked for presence explicitly (like +// depth bounds or polygon offset clamp EXT functions), or they are +// only called when such a call is serialised from the logfile, and +// so they are checked for validity separately. + + WrappedOpenGL *gl = new WrappedOpenGL(logfile, real); gl->Initialise(initParams); RDCLOG("Created device.");