From 87a587cc988fb995586195d1bfde08d799b04f99 Mon Sep 17 00:00:00 2001 From: michaelrgb Date: Mon, 9 Oct 2017 14:54:14 +0100 Subject: [PATCH] Fix ES attrib client pointers being interpreted as buffer offsets. --- renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 323dbd7ec..ba6c20e97 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -2959,6 +2959,12 @@ bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, G GLenum SizeEnum = Size == 1 ? eGL_RED : Size == 2 ? eGL_RG : Size == 3 ? eGL_RGB : eGL_RGBA; Stride = (uint32_t)GetByteSize(1, 1, 1, SizeEnum, Type); } + if(!buffer) + { + // ES allows client-memory pointers, which we override with temp buffers during capture. + // For replay, discard these pointers to prevent driver complaining about "negative offsets". + Offset = 0; + } m_Real.glVertexArrayBindVertexBufferEXT(vaobj, Index, buffer, (GLintptr)Offset, Stride); m_Real.glBindVertexArray(prevVAO); @@ -3071,6 +3077,10 @@ bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLenum SizeEnum = Size == 1 ? eGL_RED : Size == 2 ? eGL_RG : Size == 3 ? eGL_RGB : eGL_RGBA; Stride = (uint32_t)GetByteSize(1, 1, 1, SizeEnum, Type); } + if(!buffer) + { + Offset = 0; + } m_Real.glVertexArrayBindVertexBufferEXT(vaobj, Index, buffer, (GLintptr)Offset, Stride); } @@ -3180,6 +3190,10 @@ bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLenum SizeEnum = Size == 1 ? eGL_RED : Size == 2 ? eGL_RG : Size == 3 ? eGL_RGB : eGL_RGBA; Stride = (uint32_t)GetByteSize(1, 1, 1, SizeEnum, Type); } + if(!buffer) + { + Offset = 0; + } m_Real.glVertexArrayBindVertexBufferEXT(vaobj, Index, buffer, (GLintptr)Offset, Stride); }