d3d12: Fix pitch for compressed textures

This commit is contained in:
vlj 2015-06-06 17:58:10 +02:00 committed by Vincent Lejeune
parent 27e56b6199
commit 8474cd8064

View file

@ -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;
} }
} }