From a8b07fbff288f968f1497d3c0651904e443d833d Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 28 Feb 2016 13:42:05 +0100 Subject: [PATCH] Change histogram result array to uvec4 instead of uint * This complies with the packing rules needed for storage buffers --- renderdoc/data/glsl/histogram.comp | 4 ++-- renderdoc/data/spv/histogram.comp | 4 ++-- renderdoc/driver/gl/gl_debug.cpp | 12 +++++++++--- renderdoc/driver/vulkan/vk_debug.cpp | 4 ++-- renderdoc/driver/vulkan/vk_replay.cpp | 4 +++- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/renderdoc/data/glsl/histogram.comp b/renderdoc/data/glsl/histogram.comp index c12681fd1..6a3e069b0 100644 --- a/renderdoc/data/glsl/histogram.comp +++ b/renderdoc/data/glsl/histogram.comp @@ -243,7 +243,7 @@ void main() layout(binding=0) writeonly buffer minmaxresultdest { - uint result[HGRAM_NUM_BUCKETS]; + uvec4 result[HGRAM_NUM_BUCKETS]; } dest; layout (local_size_x = HGRAM_TILES_PER_BLOCK, local_size_y = HGRAM_TILES_PER_BLOCK) in; @@ -392,7 +392,7 @@ void main() #endif if(bucketIdx >= 0 && bucketIdx < HGRAM_NUM_BUCKETS) - atomicAdd(dest.result[bucketIdx], 1U); + atomicAdd(dest.result[bucketIdx].x, 1U); } } } diff --git a/renderdoc/data/spv/histogram.comp b/renderdoc/data/spv/histogram.comp index 2381a53f7..7c610c1be 100644 --- a/renderdoc/data/spv/histogram.comp +++ b/renderdoc/data/spv/histogram.comp @@ -24,7 +24,7 @@ layout(binding=0, std140) writeonly buffer minmaxresultdest { - uint result[HGRAM_NUM_BUCKETS]; + uvec4 result[HGRAM_NUM_BUCKETS]; } dest; layout (local_size_x = HGRAM_TILES_PER_BLOCK, local_size_y = HGRAM_TILES_PER_BLOCK) in; @@ -182,7 +182,7 @@ void main() #endif if(bucketIdx >= 0 && bucketIdx < HGRAM_NUM_BUCKETS) - atomicAdd(dest.result[bucketIdx], 1U); + atomicAdd(dest.result[bucketIdx].x, 1U); } } } diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 79b8c9d5c..b9ddbbb69 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -417,7 +417,7 @@ void GLReplay::InitDebugData() gl.glNamedBufferStorageEXT(DebugData.minmaxTileResult, byteSize, NULL, 0); gl.glNamedBufferStorageEXT(DebugData.minmaxResult, sizeof(Vec4f)*2, NULL, GL_MAP_READ_BIT); - gl.glNamedBufferStorageEXT(DebugData.histogramBuf, sizeof(uint32_t)*HGRAM_NUM_BUCKETS, NULL, GL_MAP_READ_BIT); + gl.glNamedBufferStorageEXT(DebugData.histogramBuf, sizeof(uint32_t)*4*HGRAM_NUM_BUCKETS, NULL, GL_MAP_READ_BIT); } { @@ -989,10 +989,16 @@ bool GLReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t mip, gl.glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); histogram.clear(); - histogram.resize(HGRAM_NUM_BUCKETS); + histogram.resize(HGRAM_NUM_BUCKETS*4); gl.glBindBuffer(eGL_COPY_READ_BUFFER, DebugData.histogramBuf); - gl.glGetBufferSubData(eGL_COPY_READ_BUFFER, 0, sizeof(uint32_t)*HGRAM_NUM_BUCKETS, &histogram[0]); + gl.glGetBufferSubData(eGL_COPY_READ_BUFFER, 0, sizeof(uint32_t)*4*HGRAM_NUM_BUCKETS, &histogram[0]); + + // compress down from uvec4, then resize down + for(size_t i=1; i < HGRAM_NUM_BUCKETS; i++) + histogram[i] = histogram[i*4]; + + histogram.resize(HGRAM_NUM_BUCKETS); if(maxlevel >= 0) gl.glTextureParameterivEXT(texname, target, eGL_TEXTURE_MAX_LEVEL, (GLint *)&maxlevel); diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index cfb47727c..7674dd1d1 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -1468,8 +1468,8 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) m_MinMaxTileResult.Create(driver, dev, byteSize, 1, GPUBuffer::eGPUBufferSSBO); m_MinMaxResult.Create(driver, dev, sizeof(Vec4f)*2, 1, GPUBuffer::eGPUBufferSSBO); m_MinMaxReadback.Create(driver, dev, sizeof(Vec4f)*2, 1, GPUBuffer::eGPUBufferReadback); - m_HistogramBuf.Create(driver, dev, sizeof(uint32_t)*HGRAM_NUM_BUCKETS, 1, GPUBuffer::eGPUBufferSSBO); - m_HistogramReadback.Create(driver, dev, sizeof(uint32_t)*HGRAM_NUM_BUCKETS, 1, GPUBuffer::eGPUBufferReadback); + m_HistogramBuf.Create(driver, dev, sizeof(uint32_t)*4*HGRAM_NUM_BUCKETS, 1, GPUBuffer::eGPUBufferSSBO); + m_HistogramReadback.Create(driver, dev, sizeof(uint32_t)*4*HGRAM_NUM_BUCKETS, 1, GPUBuffer::eGPUBufferReadback); // don't need to ring this, as we hard-sync for readback anyway m_HistogramUBO.Create(driver, dev, sizeof(HistogramUBOData), 1, 0); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 1769e0a1b..ab7952230 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3892,7 +3892,9 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m uint32_t *buckets = (uint32_t *)GetDebugManager()->m_HistogramReadback.Map(vt, dev, NULL); - histogram.assign(buckets, buckets+HGRAM_NUM_BUCKETS); + histogram.resize(HGRAM_NUM_BUCKETS); + for(size_t i=0; i < HGRAM_NUM_BUCKETS; i++) + histogram[i] = buckets[i*4]; GetDebugManager()->m_HistogramReadback.Unmap(vt, dev);