diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 421dc5d6b..bc2913ff7 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -315,26 +315,17 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin const GLHookSet &gl = m_pDriver->GetHookset(); - gl.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]); - HistogramCBufferData *cdata = (HistogramCBufferData *)gl.glMapBufferRange(eGL_UNIFORM_BUFFER, 0, sizeof(HistogramCBufferData), - GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - - cdata->HistogramTextureResolution.x = (float)RDCMAX(details.width>>mip, 1U); - cdata->HistogramTextureResolution.y = (float)RDCMAX(details.height>>mip, 1U); - cdata->HistogramTextureResolution.z = (float)RDCMAX(details.depth>>mip, 1U); - cdata->HistogramSlice = (float)sliceFace; - cdata->HistogramMip = (int)mip; - cdata->HistogramSample = (int)RDCCLAMP(sample, 0U, details.msSamp-1); - if(sample == ~0U) cdata->HistogramSample = -int(details.msSamp); - cdata->HistogramMin = 0.0f; - cdata->HistogramMax = 1.0f; - cdata->HistogramChannels = 0xf; - int texSlot = 0; int intIdx = 0; + + bool renderbuffer = false; switch (texDetails.curType) { + case eGL_RENDERBUFFER: + texSlot = RESTYPE_TEX2D; + renderbuffer = true; + break; case eGL_TEXTURE_1D: texSlot = RESTYPE_TEX1D; break; @@ -343,6 +334,9 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin case eGL_TEXTURE_2D: texSlot = RESTYPE_TEX2D; break; + case eGL_TEXTURE_RECTANGLE: + texSlot = RESTYPE_TEXRECT; + break; case eGL_TEXTURE_3D: texSlot = RESTYPE_TEX3D; break; @@ -360,6 +354,52 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin break; } + GLenum target = texDetails.curType; + GLuint texname = texDetails.resource.name; + + // do blit from renderbuffer to texture, then sample from texture + if(renderbuffer) + { + // need replay context active to do blit (as FBOs aren't shared) + MakeCurrentReplayContext(&m_ReplayCtx); + + GLuint curDrawFBO = 0; + GLuint curReadFBO = 0; + gl.glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, (GLint*)&curDrawFBO); + gl.glGetIntegerv(eGL_READ_FRAMEBUFFER_BINDING, (GLint*)&curReadFBO); + + gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, texDetails.renderbufferFBOs[1]); + gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, texDetails.renderbufferFBOs[0]); + + gl.glBlitFramebuffer(0, 0, texDetails.width, texDetails.height, + 0, 0, texDetails.width, texDetails.height, + GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT, + eGL_NEAREST); + + gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, curDrawFBO); + gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, curReadFBO); + + texname = texDetails.renderbufferReadTex; + target = eGL_TEXTURE_2D; + } + + MakeCurrentReplayContext(m_DebugCtx); + + gl.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]); + HistogramCBufferData *cdata = (HistogramCBufferData *)gl.glMapBufferRange(eGL_UNIFORM_BUFFER, 0, sizeof(HistogramCBufferData), + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + + cdata->HistogramTextureResolution.x = (float)RDCMAX(details.width>>mip, 1U); + cdata->HistogramTextureResolution.y = (float)RDCMAX(details.height>>mip, 1U); + cdata->HistogramTextureResolution.z = (float)RDCMAX(details.depth>>mip, 1U); + cdata->HistogramSlice = (float)sliceFace; + cdata->HistogramMip = (int)mip; + cdata->HistogramSample = (int)RDCCLAMP(sample, 0U, details.msSamp-1); + if(sample == ~0U) cdata->HistogramSample = -int(details.msSamp); + cdata->HistogramMin = 0.0f; + cdata->HistogramMax = 1.0f; + cdata->HistogramChannels = 0xf; + if(details.format.compType == eCompType_UInt) { texSlot |= TEXDISPLAY_UINT_TEX; @@ -380,7 +420,7 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin gl.glUnmapBuffer(eGL_UNIFORM_BUFFER); gl.glActiveTexture((RDCGLenum)(eGL_TEXTURE0 + texSlot)); - gl.glBindTexture(texDetails.curType, texDetails.resource.name); + gl.glBindTexture(target, texname); gl.glBindSampler(texSlot, DebugData.pointSampler); gl.glBindBufferBase(eGL_SHADER_STORAGE_BUFFER, 0, DebugData.minmaxTileResult); @@ -428,6 +468,76 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, const GLHookSet &gl = m_pDriver->GetHookset(); + int texSlot = 0; + int intIdx = 0; + + bool renderbuffer = false; + + switch (texDetails.curType) + { + case eGL_RENDERBUFFER: + texSlot = RESTYPE_TEX2D; + renderbuffer = true; + break; + case eGL_TEXTURE_1D: + texSlot = RESTYPE_TEX1D; + break; + default: + RDCWARN("Unexpected texture type"); + case eGL_TEXTURE_2D: + texSlot = RESTYPE_TEX2D; + break; + case eGL_TEXTURE_RECTANGLE: + texSlot = RESTYPE_TEXRECT; + break; + case eGL_TEXTURE_3D: + texSlot = RESTYPE_TEX3D; + break; + case eGL_TEXTURE_CUBE_MAP: + texSlot = RESTYPE_TEXCUBE; + break; + case eGL_TEXTURE_1D_ARRAY: + texSlot = RESTYPE_TEX1DARRAY; + break; + case eGL_TEXTURE_2D_ARRAY: + texSlot = RESTYPE_TEX2DARRAY; + break; + case eGL_TEXTURE_CUBE_MAP_ARRAY: + texSlot = RESTYPE_TEXCUBEARRAY; + break; + } + + GLenum target = texDetails.curType; + GLuint texname = texDetails.resource.name; + + // do blit from renderbuffer to texture, then sample from texture + if(renderbuffer) + { + // need replay context active to do blit (as FBOs aren't shared) + MakeCurrentReplayContext(&m_ReplayCtx); + + GLuint curDrawFBO = 0; + GLuint curReadFBO = 0; + gl.glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, (GLint*)&curDrawFBO); + gl.glGetIntegerv(eGL_READ_FRAMEBUFFER_BINDING, (GLint*)&curReadFBO); + + gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, texDetails.renderbufferFBOs[1]); + gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, texDetails.renderbufferFBOs[0]); + + gl.glBlitFramebuffer(0, 0, texDetails.width, texDetails.height, + 0, 0, texDetails.width, texDetails.height, + GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT, + eGL_NEAREST); + + gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, curDrawFBO); + gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, curReadFBO); + + texname = texDetails.renderbufferReadTex; + target = eGL_TEXTURE_2D; + } + + MakeCurrentReplayContext(m_DebugCtx); + gl.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]); HistogramCBufferData *cdata = (HistogramCBufferData *)gl.glMapBufferRange(eGL_UNIFORM_BUFFER, 0, sizeof(HistogramCBufferData), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); @@ -448,36 +558,6 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, if(channels[3]) cdata->HistogramChannels |= 0x8; cdata->HistogramFlags = 0; - int texSlot = 0; - int intIdx = 0; - - switch (texDetails.curType) - { - case eGL_TEXTURE_1D: - texSlot = RESTYPE_TEX1D; - break; - default: - RDCWARN("Unexpected texture type"); - case eGL_TEXTURE_2D: - texSlot = RESTYPE_TEX2D; - break; - case eGL_TEXTURE_3D: - texSlot = RESTYPE_TEX3D; - break; - case eGL_TEXTURE_CUBE_MAP: - texSlot = RESTYPE_TEXCUBE; - break; - case eGL_TEXTURE_1D_ARRAY: - texSlot = RESTYPE_TEX1DARRAY; - break; - case eGL_TEXTURE_2D_ARRAY: - texSlot = RESTYPE_TEX2DARRAY; - break; - case eGL_TEXTURE_CUBE_MAP_ARRAY: - texSlot = RESTYPE_TEXCUBEARRAY; - break; - } - if(details.format.compType == eCompType_UInt) { texSlot |= TEXDISPLAY_UINT_TEX; @@ -498,7 +578,7 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, gl.glUnmapBuffer(eGL_UNIFORM_BUFFER); gl.glActiveTexture((RDCGLenum)(eGL_TEXTURE0 + texSlot)); - gl.glBindTexture(texDetails.curType, texDetails.resource.name); + gl.glBindTexture(target, texname); gl.glBindSampler(texSlot, DebugData.pointSampler); gl.glBindBufferBase(eGL_SHADER_STORAGE_BUFFER, 0, DebugData.histogramBuf);