mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 15:31:26 +12:00
d3d12: Fix pitch for compressed textures
This commit is contained in:
parent
27e56b6199
commit
8474cd8064
1 changed files with 29 additions and 5 deletions
|
@ -169,6 +169,7 @@ ID3D12Resource *uploadSingleTexture(
|
||||||
const u32 texaddr = GetAddress(texture.GetOffset(), texture.GetLocation());
|
const u32 texaddr = GetAddress(texture.GetOffset(), texture.GetLocation());
|
||||||
|
|
||||||
bool is_swizzled = !(texture.GetFormat() & CELL_GCM_TEXTURE_LN);
|
bool is_swizzled = !(texture.GetFormat() & CELL_GCM_TEXTURE_LN);
|
||||||
|
size_t srcPitch;
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
||||||
|
@ -181,103 +182,128 @@ ID3D12Resource *uploadSingleTexture(
|
||||||
case CELL_GCM_TEXTURE_B8:
|
case CELL_GCM_TEXTURE_B8:
|
||||||
blockSizeInByte = 1;
|
blockSizeInByte = 1;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_A1R5G5B5:
|
case CELL_GCM_TEXTURE_A1R5G5B5:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockHeightInPixel = 1, blockWidthInPixel = 1;
|
blockHeightInPixel = 1, blockWidthInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_R5G6B5:
|
case CELL_GCM_TEXTURE_R5G6B5:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
case CELL_GCM_TEXTURE_A8R8G8B8:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
||||||
blockSizeInByte = 8;
|
blockSizeInByte = 8;
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
||||||
blockSizeInByte = 16;
|
blockSizeInByte = 16;
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
||||||
|
srcPitch = w * 8;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
||||||
blockSizeInByte = 16;
|
blockSizeInByte = 16;
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
||||||
|
srcPitch = w * 8;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_G8B8:
|
case CELL_GCM_TEXTURE_G8B8:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_R6G5B5:
|
case CELL_GCM_TEXTURE_R6G5B5:
|
||||||
// Not native
|
// Not native
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_DEPTH16:
|
case CELL_GCM_TEXTURE_DEPTH16:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_X16:
|
case CELL_GCM_TEXTURE_X16:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_Y16_X16:
|
case CELL_GCM_TEXTURE_Y16_X16:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_R5G5B5A1:
|
case CELL_GCM_TEXTURE_R5G5B5A1:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
||||||
blockSizeInByte = 8;
|
blockSizeInByte = 8;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 8;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
||||||
blockSizeInByte = 16;
|
blockSizeInByte = 16;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 16;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_X32_FLOAT:
|
case CELL_GCM_TEXTURE_X32_FLOAT:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_D1R5G5B5:
|
case CELL_GCM_TEXTURE_D1R5G5B5:
|
||||||
blockSizeInByte = 2;
|
blockSizeInByte = 2;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 2;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_D8R8G8B8:
|
case CELL_GCM_TEXTURE_D8R8G8B8:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
blockSizeInByte = 4;
|
blockSizeInByte = 4;
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
||||||
|
srcPitch = w * 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,8 +334,6 @@ ID3D12Resource *uploadSingleTexture(
|
||||||
// Upload with correct rowpitch
|
// Upload with correct rowpitch
|
||||||
for (unsigned row = 0; row < heightInBlocks; row++)
|
for (unsigned row = 0; row < heightInBlocks; row++)
|
||||||
{
|
{
|
||||||
size_t m_texture_pitch = powerOf2Align(w * blockSizeInByte, 4);
|
|
||||||
if (!m_texture_pitch) m_texture_pitch = rowPitch;
|
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
case CELL_GCM_TEXTURE_A8R8G8B8:
|
||||||
|
@ -330,7 +354,7 @@ ID3D12Resource *uploadSingleTexture(
|
||||||
dst[(row * rowPitch / 4) + j] = src[LinearToSwizzleAddress(j, row, 0, log2width, log2height, 0)];
|
dst[(row * rowPitch / 4) + j] = src[LinearToSwizzleAddress(j, row, 0, log2width, log2height, 0)];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
streamBuffer((char*)textureData + row * rowPitch, (char*)pixels + row * m_texture_pitch, m_texture_pitch);
|
streamBuffer((char*)textureData + row * rowPitch, (char*)pixels + row * srcPitch, srcPitch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
|
@ -340,14 +364,14 @@ ID3D12Resource *uploadSingleTexture(
|
||||||
|
|
||||||
for (int j = 0; j < w; j++)
|
for (int j = 0; j < w; j++)
|
||||||
{
|
{
|
||||||
u16 tmp = src[row * m_texture_pitch / 2 + j];
|
u16 tmp = src[row * srcPitch / 2 + j];
|
||||||
dst[row * rowPitch / 2 + j] = (tmp >> 8) | (tmp << 8);
|
dst[row * rowPitch / 2 + j] = (tmp >> 8) | (tmp << 8);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
streamBuffer((char*)textureData + row * rowPitch, (char*)pixels + row * m_texture_pitch, m_texture_pitch);
|
streamBuffer((char*)textureData + row * rowPitch, (char*)pixels + row * srcPitch, srcPitch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue