diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 215932636..1ff03cb46 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -1796,7 +1796,7 @@ bool D3D11DebugManager::GetHistogram(ResourceId texid, uint32_t sliceFace, uint3 } if(details.texType == eTexType_3D) - cdata.HistogramSlice = float(sliceFace) / float(details.texDepth); + cdata.HistogramSlice = float(sliceFace) / float(details.texDepth) + 0.001f; ID3D11Buffer *cbuf = MakeCBuffer(&cdata, sizeof(cdata)); @@ -1897,7 +1897,7 @@ bool D3D11DebugManager::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t } if(details.texType == eTexType_3D) - cdata.HistogramSlice = float(sliceFace) / float(details.texDepth); + cdata.HistogramSlice = float(sliceFace) / float(details.texDepth) + 0.001f; ID3D11Buffer *cbuf = MakeCBuffer(&cdata, sizeof(cdata)); diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index d6aba8186..a38dea27a 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -671,7 +671,7 @@ void GLReplay::DeleteDebugData() bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, FormatComponentType typeHint, float *minval, float *maxval) { - if(m_pDriver->m_Textures.find(texid) == m_pDriver->m_Textures.end()) + if(texid == ResourceId() || m_pDriver->m_Textures.find(texid) == m_pDriver->m_Textures.end()) return false; auto &texDetails = m_pDriver->m_Textures[texid]; @@ -744,7 +744,10 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin 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; + if(texDetails.curType != eGL_TEXTURE_3D) + cdata->HistogramSlice = (float)sliceFace + 0.001f; + else + cdata->HistogramSlice = (float)(sliceFace >> mip); cdata->HistogramMip = (int)mip; cdata->HistogramNumSamples = texDetails.samples; cdata->HistogramSample = (int)RDCCLAMP(sample, 0U, details.msSamp - 1); @@ -767,9 +770,6 @@ bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uin intIdx = 2; } - if(details.dimension == 3) - cdata->HistogramSlice = float(sliceFace) / float(details.depth); - int blocksX = (int)ceil(cdata->HistogramTextureResolution.x / float(HGRAM_PIXELS_PER_TILE * HGRAM_TILES_PER_BLOCK)); int blocksY = (int)ceil(cdata->HistogramTextureResolution.y / @@ -839,7 +839,7 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, FormatComponentType typeHint, float minval, float maxval, bool channels[4], vector &histogram) { - if(minval >= maxval) + if(minval >= maxval || texid == ResourceId()) return false; if(m_pDriver->m_Textures.find(texid) == m_pDriver->m_Textures.end()) @@ -915,7 +915,10 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, 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; + if(texDetails.curType != eGL_TEXTURE_3D) + cdata->HistogramSlice = (float)sliceFace + 0.001f; + else + cdata->HistogramSlice = (float)(sliceFace >> mip); cdata->HistogramMip = mip; cdata->HistogramNumSamples = texDetails.samples; cdata->HistogramSample = (int)RDCCLAMP(sample, 0U, details.msSamp - 1); @@ -952,9 +955,6 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, intIdx = 2; } - if(details.dimension == 3) - cdata->HistogramSlice = float(sliceFace) / float(details.depth); - int blocksX = (int)ceil(cdata->HistogramTextureResolution.x / float(HGRAM_PIXELS_PER_TILE * HGRAM_TILES_PER_BLOCK)); int blocksY = (int)ceil(cdata->HistogramTextureResolution.y / diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2330253f2..f9cbf2897 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4136,7 +4136,10 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, data->HistogramTextureResolution.x = (float)RDCMAX(uint32_t(iminfo.extent.width) >> mip, 1U); data->HistogramTextureResolution.y = (float)RDCMAX(uint32_t(iminfo.extent.height) >> mip, 1U); data->HistogramTextureResolution.z = (float)RDCMAX(uint32_t(iminfo.arrayLayers) >> mip, 1U); - data->HistogramSlice = (float)sliceFace; + if(iminfo.type != VK_IMAGE_TYPE_3D) + data->HistogramSlice = (float)sliceFace + 0.001f; + else + data->HistogramSlice = (float)(sliceFace >> mip); data->HistogramMip = (int)mip; data->HistogramNumSamples = iminfo.samples; data->HistogramSample = (int)RDCCLAMP(sample, 0U, uint32_t(iminfo.samples) - 1); @@ -4146,9 +4149,6 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, data->HistogramMax = 1.0f; data->HistogramChannels = 0xf; - if(iminfo.type == VK_IMAGE_TYPE_3D) - data->HistogramSlice = float(sliceFace) / float(iminfo.extent.depth); - GetDebugManager()->m_HistogramUBO.Unmap(); VkImageMemoryBarrier srcimBarrier = { @@ -4381,7 +4381,10 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m data->HistogramTextureResolution.x = (float)RDCMAX(uint32_t(iminfo.extent.width) >> mip, 1U); data->HistogramTextureResolution.y = (float)RDCMAX(uint32_t(iminfo.extent.height) >> mip, 1U); data->HistogramTextureResolution.z = (float)RDCMAX(uint32_t(iminfo.arrayLayers) >> mip, 1U); - data->HistogramSlice = (float)sliceFace; + if(iminfo.type != VK_IMAGE_TYPE_3D) + data->HistogramSlice = (float)sliceFace + 0.001f; + else + data->HistogramSlice = (float)(sliceFace >> mip); data->HistogramMip = (int)mip; data->HistogramNumSamples = iminfo.samples; data->HistogramSample = (int)RDCCLAMP(sample, 0U, uint32_t(iminfo.samples) - 1); @@ -4407,9 +4410,6 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m data->HistogramChannels = chans; data->HistogramFlags = 0; - if(iminfo.type == VK_IMAGE_TYPE_3D) - data->HistogramSlice = float(sliceFace) / float(iminfo.extent.depth); - GetDebugManager()->m_HistogramUBO.Unmap(); VkImageMemoryBarrier srcimBarrier = {