Fix histogram slice sampling for 3D textures

* This changed earlier when the mip/slice indexing changed to be more
  sensible.
This commit is contained in:
baldurk
2016-10-06 12:52:54 +02:00
parent 2936756ddf
commit 2c9de11a89
3 changed files with 20 additions and 20 deletions
+2 -2
View File
@@ -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));
+10 -10
View File
@@ -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<uint32_t> &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 /
+8 -8
View File
@@ -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 = {