Change histogram result array to uvec4 instead of uint

* This complies with the packing rules needed for storage buffers
This commit is contained in:
baldurk
2016-02-28 13:42:05 +01:00
parent a91dc78a8c
commit a8b07fbff2
5 changed files with 18 additions and 10 deletions
+2 -2
View File
@@ -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);
}
}
}
+2 -2
View File
@@ -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);
}
}
}
+9 -3
View File
@@ -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);
+2 -2
View File
@@ -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);
+3 -1
View File
@@ -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);