From 517251caee002215aba42e12b5d9504e2a2972e9 Mon Sep 17 00:00:00 2001 From: Jimmy Lee Date: Mon, 24 Jul 2017 19:10:37 -0700 Subject: [PATCH] fixed vrapi swapchain mip level inaccuracy --- renderdoc/driver/gl/gl_driver.cpp | 32 ++++++++++++++++++-------- renderdoc/driver/gl/gl_driver.h | 2 +- renderdoc/driver/gl/gl_hooks_vrapi.cpp | 6 +++-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index c2361df0e..ff3519c51 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -2538,8 +2538,8 @@ void WrappedOpenGL::SwapBuffers(void *windowHandle) } } -void WrappedOpenGL::CreateVRAPITextureSwapChain(GLuint tex, GLenum textureType, - GLenum internalformat, GLsizei width, GLsizei height) +void WrappedOpenGL::CreateVRAPITextureSwapChain(GLuint tex, GLenum textureType, GLenum internalformat, + GLsizei width, GLsizei height, GLint levels) { GLResource res = TextureRes(GetCtx(), tex); ResourceId id = GetResourceManager()->RegisterResource(res); @@ -2559,21 +2559,33 @@ void WrappedOpenGL::CreateVRAPITextureSwapChain(GLuint tex, GLenum textureType, RDCASSERT(record); record->AddChunk(chunk); + + Common_glTextureParameteriEXT(record, textureType, eGL_TEXTURE_MAX_LEVEL, levels); } else { GetResourceManager()->AddLiveResource(id, res); } - if(textureType == eGL_TEXTURE_2D_ARRAY) + for(GLint i = 0; i < levels; ++i) { - Common_glTextureImage3DEXT(id, eGL_TEXTURE_2D_ARRAY, 0, internalformat, width, height, 2, 0, eGL_RGBA, - eGL_UNSIGNED_BYTE, NULL); - } - else - { - Common_glTextureImage2DEXT(id, eGL_TEXTURE_2D, 0, internalformat, width, height, 0, eGL_RGBA, - eGL_UNSIGNED_BYTE, NULL); + if(textureType == eGL_TEXTURE_2D_ARRAY) + { + Common_glTextureImage3DEXT(id, eGL_TEXTURE_2D_ARRAY, i, internalformat, width, height, 2, 0, + eGL_RGBA, eGL_UNSIGNED_BYTE, NULL); + } + else if(textureType == eGL_TEXTURE_2D) + { + Common_glTextureImage2DEXT(id, eGL_TEXTURE_2D, i, internalformat, width, height, 0, eGL_RGBA, + eGL_UNSIGNED_BYTE, NULL); + } + else + { + RDCERR("Unexpected textureType (%u) in CreateVRAPITextureSwapChain", textureType); + } + + width = RDCMAX(1, (width / 2)); + height = RDCMAX(1, (height / 2)); } } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index c6ff95942..986d8bf7a 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -587,7 +587,7 @@ public: void WindowSize(void *windowHandle, uint32_t w, uint32_t h); void SwapBuffers(void *windowHandle); void CreateVRAPITextureSwapChain(GLuint tex, GLenum textureType, GLenum internalformat, - GLsizei width, GLsizei height); + GLsizei width, GLsizei height, GLint levels); void FirstFrame(void *ctx, void *wndHandle); diff --git a/renderdoc/driver/gl/gl_hooks_vrapi.cpp b/renderdoc/driver/gl/gl_hooks_vrapi.cpp index f0598160c..2bf097b22 100644 --- a/renderdoc/driver/gl/gl_hooks_vrapi.cpp +++ b/renderdoc/driver/gl/gl_hooks_vrapi.cpp @@ -204,7 +204,8 @@ __attribute__((visibility("default"))) ovrTextureSwapChain *vrapi_CreateTextureS GLenum internalformat = GetInternalFormat(format); GLenum textureType = GetTextureType(type); - m_GLDriver->CreateVRAPITextureSwapChain(tex, textureType, internalformat, width, height); + m_GLDriver->CreateVRAPITextureSwapChain(tex, textureType, internalformat, width, height, + levels); } } @@ -236,7 +237,8 @@ __attribute__((visibility("default"))) ovrTextureSwapChain *vrapi_CreateTextureS GLenum internalformat = GetInternalFormat(format); GLenum textureType = GetTextureType(type); - m_GLDriver->CreateVRAPITextureSwapChain(tex, textureType, internalformat, width, height); + m_GLDriver->CreateVRAPITextureSwapChain(tex, textureType, internalformat, width, height, + levels); } }