mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-25 09:08:22 -05:00
Fixed BC4/BC5 LockRect memory corruption.
This commit is contained in:
parent
cc69b20e14
commit
8a499e69c0
1 changed files with 24 additions and 1 deletions
|
@ -1440,10 +1440,26 @@ namespace bgfx
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// For BC4 and B5 in DX9 LockRect returns wrong number of
|
||||||
|
// bytes. If actual mip size is used it causes memory corruption.
|
||||||
|
// http://www.aras-p.info/texts/D3D9GPUHacks.html#3dc
|
||||||
|
bool useMipSize = true
|
||||||
|
&& dds.m_type != TextureFormat::BC4
|
||||||
|
&& dds.m_type != TextureFormat::BC5
|
||||||
|
;
|
||||||
|
|
||||||
for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side)
|
for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side)
|
||||||
{
|
{
|
||||||
|
uint32_t width = dds.m_width;
|
||||||
|
uint32_t height = dds.m_height;
|
||||||
|
uint32_t depth = dds.m_depth;
|
||||||
|
|
||||||
for (uint32_t lod = 0, num = dds.m_numMips; lod < num; ++lod)
|
for (uint32_t lod = 0, num = dds.m_numMips; lod < num; ++lod)
|
||||||
{
|
{
|
||||||
|
width = uint32_max(1, width);
|
||||||
|
height = uint32_max(1, height);
|
||||||
|
depth = uint32_max(1, depth);
|
||||||
|
|
||||||
Mip mip;
|
Mip mip;
|
||||||
if (getRawImageData(dds, 0, lod, _mem, mip) )
|
if (getRawImageData(dds, 0, lod, _mem, mip) )
|
||||||
{
|
{
|
||||||
|
@ -1451,10 +1467,16 @@ namespace bgfx
|
||||||
uint32_t slicePitch;
|
uint32_t slicePitch;
|
||||||
uint8_t* dst = lock(side, lod, pitch, slicePitch);
|
uint8_t* dst = lock(side, lod, pitch, slicePitch);
|
||||||
|
|
||||||
memcpy(dst, mip.m_data, mip.m_size);
|
uint32_t size = useMipSize ? mip.m_size : width*height*depth*bpp/8;
|
||||||
|
|
||||||
|
memcpy(dst, mip.m_data, size);
|
||||||
|
|
||||||
unlock(side, lod);
|
unlock(side, lod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
width >>= 1;
|
||||||
|
height >>= 1;
|
||||||
|
depth >>= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1827,6 +1849,7 @@ namespace bgfx
|
||||||
VertexBuffer& vb = s_renderCtx.m_vertexBuffers[m_vb->handle.idx];
|
VertexBuffer& vb = s_renderCtx.m_vertexBuffers[m_vb->handle.idx];
|
||||||
VertexDeclaration& vertexDecl = s_renderCtx.m_vertexDecls[m_vb->decl.idx];
|
VertexDeclaration& vertexDecl = s_renderCtx.m_vertexDecls[m_vb->decl.idx];
|
||||||
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
|
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
|
||||||
|
DX_CHECK_REFCOUNT(vertexDecl.m_ptr, 1);
|
||||||
DX_CHECK(device->SetVertexDeclaration(vertexDecl.m_ptr) );
|
DX_CHECK(device->SetVertexDeclaration(vertexDecl.m_ptr) );
|
||||||
|
|
||||||
IndexBuffer& ib = s_renderCtx.m_indexBuffers[m_ib->handle.idx];
|
IndexBuffer& ib = s_renderCtx.m_indexBuffers[m_ib->handle.idx];
|
||||||
|
|
Loading…
Reference in a new issue