mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-14 18:58:36 +12:00
RSX/common: Clean TextureUtils code.
* Use a_b_c code style * Add noexcept * Use anonymous namespace
This commit is contained in:
parent
9f51bce2aa
commit
42467ba40f
6 changed files with 247 additions and 396 deletions
|
@ -86,7 +86,6 @@
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12GSRender.h" />
|
<ClInclude Include="Emu\RSX\D3D12\D3D12GSRender.h" />
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12PipelineState.h" />
|
<ClInclude Include="Emu\RSX\D3D12\D3D12PipelineState.h" />
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12RenderTargetSets.h" />
|
<ClInclude Include="Emu\RSX\D3D12\D3D12RenderTargetSets.h" />
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12Texture.h" />
|
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12VertexProgramDecompiler.h" />
|
<ClInclude Include="Emu\RSX\D3D12\D3D12VertexProgramDecompiler.h" />
|
||||||
<ClInclude Include="Emu\RSX\D3D12\d3dx12.h" />
|
<ClInclude Include="Emu\RSX\D3D12\d3dx12.h" />
|
||||||
<ClInclude Include="stdafx_d3d12.h" />
|
<ClInclude Include="stdafx_d3d12.h" />
|
||||||
|
|
|
@ -26,9 +26,6 @@
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12RenderTargetSets.h">
|
<ClInclude Include="Emu\RSX\D3D12\D3D12RenderTargetSets.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12Texture.h">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Emu\RSX\D3D12\D3D12VertexProgramDecompiler.h">
|
<ClInclude Include="Emu\RSX\D3D12\D3D12VertexProgramDecompiler.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
|
|
||||||
|
|
||||||
#define MAX2(a, b) ((a) > (b)) ? (a) : (b)
|
#define MAX2(a, b) ((a) > (b)) ? (a) : (b)
|
||||||
|
namespace
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Write data, assume src pixels are packed but not mipmaplevel
|
* Write data, assume src pixels are packed but not mipmaplevel
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
writeTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
writeTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -42,7 +43,7 @@ writeTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heigh
|
||||||
/**
|
/**
|
||||||
* Write data, assume src pixels are swizzled and but not mipmaplevel
|
* Write data, assume src pixels are swizzled and but not mipmaplevel
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
writeTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
writeTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -84,7 +85,7 @@ writeTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t heig
|
||||||
/**
|
/**
|
||||||
* Write data, assume compressed (DXTCn) format
|
* Write data, assume compressed (DXTCn) format
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
writeCompressedTexel(const char *src, char *dst, size_t widthInBlock, size_t blockWidth, size_t heightInBlock, size_t blockHeight, size_t blockSize, size_t mipmapCount)
|
writeCompressedTexel(const char *src, char *dst, size_t widthInBlock, size_t blockWidth, size_t heightInBlock, size_t blockHeight, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -117,7 +118,7 @@ writeCompressedTexel(const char *src, char *dst, size_t widthInBlock, size_t blo
|
||||||
/**
|
/**
|
||||||
* Write 16 bytes pixel textures, assume src pixels are swizzled and but not mipmaplevel
|
* Write 16 bytes pixel textures, assume src pixels are swizzled and but not mipmaplevel
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
write16bTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
write16bTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -158,7 +159,7 @@ write16bTexelsSwizzled(const char *src, char *dst, size_t widthInBlock, size_t h
|
||||||
/**
|
/**
|
||||||
* Write 16 bytes pixel textures, assume src pixels are packed but not mipmaplevel
|
* Write 16 bytes pixel textures, assume src pixels are packed but not mipmaplevel
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
write16bTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
write16bTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -196,7 +197,7 @@ write16bTexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t he
|
||||||
/**
|
/**
|
||||||
* Write 16 bytes pixel textures, assume src pixels are packed but not mipmaplevel
|
* Write 16 bytes pixel textures, assume src pixels are packed but not mipmaplevel
|
||||||
*/
|
*/
|
||||||
inline std::vector<MipmapLevelInfo>
|
std::vector<MipmapLevelInfo>
|
||||||
write16bX4TexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
write16bX4TexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t heightInBlock, size_t blockSize, size_t mipmapCount)
|
||||||
{
|
{
|
||||||
std::vector<MipmapLevelInfo> Result;
|
std::vector<MipmapLevelInfo> Result;
|
||||||
|
@ -231,255 +232,117 @@ write16bX4TexelsGeneric(const char *src, char *dst, size_t widthInBlock, size_t
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
size_t getPlacedTextureStorageSpace(const rsx::texture &texture, size_t rowPitchAlignement)
|
* A texture is stored as an array of blocks, where a block is a pixel for standard texture
|
||||||
|
* but is a structure containing several pixels for compressed format
|
||||||
|
*/
|
||||||
|
size_t get_texture_block_size(u32 format) noexcept
|
||||||
{
|
{
|
||||||
size_t w = texture.width(), h = texture.height();
|
|
||||||
|
|
||||||
size_t blockSizeInByte, blockWidthInPixel, blockHeightInPixel;
|
|
||||||
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
|
||||||
|
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
|
case CELL_GCM_TEXTURE_B8: return 1;
|
||||||
|
case CELL_GCM_TEXTURE_A1R5G5B5:
|
||||||
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
|
case CELL_GCM_TEXTURE_R5G6B5: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_A8R8G8B8: return 4;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT1: return 8;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT23: return 16;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT45: return 16;
|
||||||
|
case CELL_GCM_TEXTURE_G8B8: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_R6G5B5:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT: return 4;
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_X16: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16: return 4;
|
||||||
|
case CELL_GCM_TEXTURE_R5G5B5A1: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: return 8;
|
||||||
|
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT: return 16;
|
||||||
|
case CELL_GCM_TEXTURE_X32_FLOAT: return 4;
|
||||||
|
case CELL_GCM_TEXTURE_D1R5G5B5: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_D8R8G8B8:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8: return 4;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
default:
|
default:
|
||||||
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
||||||
break;
|
return 0;
|
||||||
case CELL_GCM_TEXTURE_B8:
|
|
||||||
blockSizeInByte = 1;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A1R5G5B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockHeightInPixel = 1, blockWidthInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R5G6B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
|
||||||
blockSizeInByte = 8;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_G8B8:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R6G5B5:
|
|
||||||
// Not native
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_X16:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R5G5B5A1:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
|
||||||
blockSizeInByte = 8;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_X32_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_D1R5G5B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_D8R8G8B8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t heightInBlocks = (h + blockHeightInPixel - 1) / blockHeightInPixel;
|
size_t get_texture_block_edge(u32 format) noexcept
|
||||||
size_t widthInBlocks = (w + blockWidthInPixel - 1) / blockWidthInPixel;
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case CELL_GCM_TEXTURE_B8:
|
||||||
|
case CELL_GCM_TEXTURE_A1R5G5B5:
|
||||||
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
|
case CELL_GCM_TEXTURE_R5G6B5:
|
||||||
|
case CELL_GCM_TEXTURE_A8R8G8B8: return 1;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT45: return 4;
|
||||||
|
case CELL_GCM_TEXTURE_G8B8:
|
||||||
|
case CELL_GCM_TEXTURE_R6G5B5:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16:
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_X16:
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16:
|
||||||
|
case CELL_GCM_TEXTURE_R5G5B5A1:
|
||||||
|
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_X32_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_D1R5G5B5:
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
||||||
|
case CELL_GCM_TEXTURE_D8R8G8B8: return 1;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8: return 2;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
||||||
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
|
default:
|
||||||
|
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t get_placed_texture_storage_size(const rsx::texture &texture, size_t rowPitchAlignement) noexcept
|
||||||
|
{
|
||||||
|
size_t w = texture.width(), h = texture.height();
|
||||||
|
|
||||||
|
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
|
size_t blockEdge = get_texture_block_edge(format);
|
||||||
|
size_t blockSizeInByte = get_texture_block_size(format);
|
||||||
|
|
||||||
|
size_t heightInBlocks = (h + blockEdge - 1) / blockEdge;
|
||||||
|
size_t widthInBlocks = (w + blockEdge - 1) / blockEdge;
|
||||||
|
|
||||||
size_t rowPitch = align(blockSizeInByte * widthInBlocks, rowPitchAlignement);
|
size_t rowPitch = align(blockSizeInByte * widthInBlocks, rowPitchAlignement);
|
||||||
|
|
||||||
return rowPitch * heightInBlocks * 2; // * 2 for mipmap levels
|
return rowPitch * heightInBlocks * 2; // * 2 for mipmap levels
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MipmapLevelInfo> uploadPlacedTexture(const rsx::texture &texture, size_t rowPitchAlignement, void* textureData)
|
std::vector<MipmapLevelInfo> upload_placed_texture(const rsx::texture &texture, size_t rowPitchAlignement, void* textureData) noexcept
|
||||||
{
|
{
|
||||||
size_t w = texture.width(), h = texture.height();
|
size_t w = texture.width(), h = texture.height();
|
||||||
|
|
||||||
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
|
|
||||||
size_t blockSizeInByte, blockWidthInPixel, blockHeightInPixel;
|
size_t blockSizeInByte = get_texture_block_size(format);
|
||||||
switch (format)
|
size_t blockEdge = get_texture_block_edge(format);
|
||||||
{
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
|
||||||
default:
|
|
||||||
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_B8:
|
|
||||||
blockSizeInByte = 1;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A1R5G5B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockHeightInPixel = 1, blockWidthInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R5G6B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
|
||||||
blockSizeInByte = 8;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 4, blockHeightInPixel = 4;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_G8B8:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R6G5B5:
|
|
||||||
// Not native
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_X16:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_R5G5B5A1:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
|
||||||
blockSizeInByte = 8;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
|
||||||
blockSizeInByte = 16;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_X32_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_D1R5G5B5:
|
|
||||||
blockSizeInByte = 2;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_D8R8G8B8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 1, blockHeightInPixel = 1;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
|
||||||
break;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
|
||||||
blockSizeInByte = 4;
|
|
||||||
blockWidthInPixel = 2, blockHeightInPixel = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t heightInBlocks = (h + blockHeightInPixel - 1) / blockHeightInPixel;
|
size_t heightInBlocks = (h + blockEdge - 1) / blockEdge;
|
||||||
size_t widthInBlocks = (w + blockWidthInPixel - 1) / blockWidthInPixel;
|
size_t widthInBlocks = (w + blockEdge - 1) / blockEdge;
|
||||||
|
|
||||||
std::vector<MipmapLevelInfo> mipInfos;
|
std::vector<MipmapLevelInfo> mipInfos;
|
||||||
|
|
||||||
|
@ -505,8 +368,76 @@ std::vector<MipmapLevelInfo> uploadPlacedTexture(const rsx::texture &texture, si
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
||||||
return writeCompressedTexel((char*)pixels, (char*)textureData, widthInBlocks, blockWidthInPixel, heightInBlocks, blockHeightInPixel, blockSizeInByte, texture.mipmap());
|
return writeCompressedTexel((char*)pixels, (char*)textureData, widthInBlocks, blockEdge, heightInBlocks, blockEdge, blockSizeInByte, texture.mipmap());
|
||||||
default:
|
default:
|
||||||
return writeTexelsGeneric((char*)pixels, (char*)textureData, w, h, blockSizeInByte, texture.mipmap());
|
return writeTexelsGeneric((char*)pixels, (char*)textureData, w, h, blockSizeInByte, texture.mipmap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t get_texture_size(const rsx::texture &texture) noexcept
|
||||||
|
{
|
||||||
|
size_t w = texture.width(), h = texture.height();
|
||||||
|
|
||||||
|
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
|
// TODO: Take mipmaps into account
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
||||||
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
|
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
|
default:
|
||||||
|
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
||||||
|
return 0;
|
||||||
|
case CELL_GCM_TEXTURE_B8:
|
||||||
|
return w * h;
|
||||||
|
case CELL_GCM_TEXTURE_A1R5G5B5:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_R5G6B5:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_A8R8G8B8:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
||||||
|
return w * h / 6;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
||||||
|
return w * h / 4;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
||||||
|
return w * h / 4;
|
||||||
|
case CELL_GCM_TEXTURE_G8B8:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_R6G5B5:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_X16:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_R5G5B5A1:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
||||||
|
return w * h * 8;
|
||||||
|
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
||||||
|
return w * h * 16;
|
||||||
|
case CELL_GCM_TEXTURE_X32_FLOAT:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_D1R5G5B5:
|
||||||
|
return w * h * 2;
|
||||||
|
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_D8R8G8B8:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
|
return w * h * 4;
|
||||||
|
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
|
return w * h * 4;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,11 +14,16 @@ struct MipmapLevelInfo
|
||||||
* Get size to store texture in a linear fashion.
|
* Get size to store texture in a linear fashion.
|
||||||
* Storage is assumed to use a rowPitchAlignement boundary for every row of texture.
|
* Storage is assumed to use a rowPitchAlignement boundary for every row of texture.
|
||||||
*/
|
*/
|
||||||
size_t getPlacedTextureStorageSpace(const rsx::texture &texture, size_t rowPitchAlignement);
|
size_t get_placed_texture_storage_size(const rsx::texture &texture, size_t rowPitchAlignement) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write texture data to textureData.
|
* Write texture data to textureData.
|
||||||
* Data are not packed, they are stored per rows using rowPitchAlignement.
|
* Data are not packed, they are stored per rows using rowPitchAlignement.
|
||||||
* Similarly, offset for every mipmaplevel is aligned to rowPitchAlignement boundary.
|
* Similarly, offset for every mipmaplevel is aligned to rowPitchAlignement boundary.
|
||||||
*/
|
*/
|
||||||
std::vector<MipmapLevelInfo> uploadPlacedTexture(const rsx::texture &texture, size_t rowPitchAlignement, void* textureData);
|
std::vector<MipmapLevelInfo> upload_placed_texture(const rsx::texture &texture, size_t rowPitchAlignement, void* textureData) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number of bytes occupied by texture in RSX mem
|
||||||
|
*/
|
||||||
|
size_t get_texture_size(const rsx::texture &texture) noexcept;
|
|
@ -6,8 +6,9 @@
|
||||||
// For clarity this code deals with texture but belongs to D3D12GSRender class
|
// For clarity this code deals with texture but belongs to D3D12GSRender class
|
||||||
#include "D3D12Formats.h"
|
#include "D3D12Formats.h"
|
||||||
|
|
||||||
static
|
namespace
|
||||||
D3D12_COMPARISON_FUNC getSamplerCompFunc[] =
|
{
|
||||||
|
D3D12_COMPARISON_FUNC get_sampler_compare_func[] =
|
||||||
{
|
{
|
||||||
D3D12_COMPARISON_FUNC_NEVER,
|
D3D12_COMPARISON_FUNC_NEVER,
|
||||||
D3D12_COMPARISON_FUNC_LESS,
|
D3D12_COMPARISON_FUNC_LESS,
|
||||||
|
@ -19,15 +20,14 @@ D3D12_COMPARISON_FUNC getSamplerCompFunc[] =
|
||||||
D3D12_COMPARISON_FUNC_ALWAYS
|
D3D12_COMPARISON_FUNC_ALWAYS
|
||||||
};
|
};
|
||||||
|
|
||||||
static
|
D3D12_SAMPLER_DESC get_sampler_desc(const rsx::texture &texture) noexcept
|
||||||
D3D12_SAMPLER_DESC getSamplerDesc(const rsx::texture &texture)
|
|
||||||
{
|
{
|
||||||
D3D12_SAMPLER_DESC samplerDesc = {};
|
D3D12_SAMPLER_DESC samplerDesc = {};
|
||||||
samplerDesc.Filter = get_texture_filter(texture.min_filter(), texture.mag_filter());
|
samplerDesc.Filter = get_texture_filter(texture.min_filter(), texture.mag_filter());
|
||||||
samplerDesc.AddressU = get_texture_wrap_mode(texture.wrap_s());
|
samplerDesc.AddressU = get_texture_wrap_mode(texture.wrap_s());
|
||||||
samplerDesc.AddressV = get_texture_wrap_mode(texture.wrap_t());
|
samplerDesc.AddressV = get_texture_wrap_mode(texture.wrap_t());
|
||||||
samplerDesc.AddressW = get_texture_wrap_mode(texture.wrap_r());
|
samplerDesc.AddressW = get_texture_wrap_mode(texture.wrap_r());
|
||||||
samplerDesc.ComparisonFunc = getSamplerCompFunc[texture.zfunc()];
|
samplerDesc.ComparisonFunc = get_sampler_compare_func[texture.zfunc()];
|
||||||
samplerDesc.MaxAnisotropy = get_texture_max_aniso(texture.max_aniso());
|
samplerDesc.MaxAnisotropy = get_texture_max_aniso(texture.max_aniso());
|
||||||
samplerDesc.MipLODBias = texture.bias();
|
samplerDesc.MipLODBias = texture.bias();
|
||||||
samplerDesc.BorderColor[0] = (FLOAT)texture.border_color();
|
samplerDesc.BorderColor[0] = (FLOAT)texture.border_color();
|
||||||
|
@ -44,168 +44,89 @@ D3D12_SAMPLER_DESC getSamplerDesc(const rsx::texture &texture)
|
||||||
* Create a texture residing in default heap and generate uploads commands in commandList,
|
* Create a texture residing in default heap and generate uploads commands in commandList,
|
||||||
* using a temporary texture buffer.
|
* using a temporary texture buffer.
|
||||||
*/
|
*/
|
||||||
static
|
ComPtr<ID3D12Resource> upload_single_texture(
|
||||||
ComPtr<ID3D12Resource> uploadSingleTexture(
|
|
||||||
const rsx::texture &texture,
|
const rsx::texture &texture,
|
||||||
ID3D12Device *device,
|
ID3D12Device *device,
|
||||||
ID3D12GraphicsCommandList *commandList,
|
ID3D12GraphicsCommandList *command_list,
|
||||||
DataHeap<ID3D12Resource, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT> &textureBuffersHeap)
|
DataHeap<ID3D12Resource, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT> &texture_buffer_heap)
|
||||||
{
|
{
|
||||||
ComPtr<ID3D12Resource> vramTexture;
|
|
||||||
size_t w = texture.width(), h = texture.height();
|
size_t w = texture.width(), h = texture.height();
|
||||||
|
|
||||||
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
DXGI_FORMAT dxgiFormat = get_texture_format(format);
|
DXGI_FORMAT dxgi_format = get_texture_format(format);
|
||||||
|
|
||||||
size_t textureSize = getPlacedTextureStorageSpace(texture, 256);
|
size_t buffer_size = get_placed_texture_storage_size(texture, 256);
|
||||||
assert(textureBuffersHeap.canAlloc(textureSize));
|
assert(texture_buffer_heap.canAlloc(buffer_size));
|
||||||
size_t heapOffset = textureBuffersHeap.alloc(textureSize);
|
size_t heap_offset = texture_buffer_heap.alloc(buffer_size);
|
||||||
|
|
||||||
void *buffer;
|
void *buffer;
|
||||||
ThrowIfFailed(textureBuffersHeap.m_heap->Map(0, &CD3DX12_RANGE(heapOffset, heapOffset + textureSize), &buffer));
|
ThrowIfFailed(texture_buffer_heap.m_heap->Map(0, &CD3DX12_RANGE(heap_offset, heap_offset + buffer_size), &buffer));
|
||||||
void *textureData = (char*)buffer + heapOffset;
|
void *mapped_buffer = (char*)buffer + heap_offset;
|
||||||
std::vector<MipmapLevelInfo> mipInfos = uploadPlacedTexture(texture, 256, textureData);
|
std::vector<MipmapLevelInfo> mipInfos = upload_placed_texture(texture, 256, mapped_buffer);
|
||||||
textureBuffersHeap.m_heap->Unmap(0, &CD3DX12_RANGE(heapOffset, heapOffset + textureSize));
|
texture_buffer_heap.m_heap->Unmap(0, &CD3DX12_RANGE(heap_offset, heap_offset + buffer_size));
|
||||||
|
|
||||||
D3D12_RESOURCE_DESC texturedesc = CD3DX12_RESOURCE_DESC::Tex2D(dxgiFormat, (UINT)w, (UINT)h, 1, texture.mipmap());
|
|
||||||
textureSize = device->GetResourceAllocationInfo(0, 1, &texturedesc).SizeInBytes;
|
|
||||||
|
|
||||||
|
ComPtr<ID3D12Resource> result;
|
||||||
ThrowIfFailed(device->CreateCommittedResource(
|
ThrowIfFailed(device->CreateCommittedResource(
|
||||||
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
|
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&texturedesc,
|
&CD3DX12_RESOURCE_DESC::Tex2D(dxgi_format, (UINT)w, (UINT)h, 1, texture.mipmap()),
|
||||||
D3D12_RESOURCE_STATE_COPY_DEST,
|
D3D12_RESOURCE_STATE_COPY_DEST,
|
||||||
nullptr,
|
nullptr,
|
||||||
IID_PPV_ARGS(vramTexture.GetAddressOf())
|
IID_PPV_ARGS(result.GetAddressOf())
|
||||||
));
|
));
|
||||||
|
|
||||||
size_t miplevel = 0;
|
size_t mip_level = 0;
|
||||||
for (const MipmapLevelInfo mli : mipInfos)
|
for (const MipmapLevelInfo mli : mipInfos)
|
||||||
{
|
{
|
||||||
commandList->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(vramTexture.Get(), (UINT)miplevel), 0, 0, 0,
|
command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(result.Get(), (UINT)mip_level), 0, 0, 0,
|
||||||
&CD3DX12_TEXTURE_COPY_LOCATION(textureBuffersHeap.m_heap, { heapOffset + mli.offset, { dxgiFormat, (UINT)mli.width, (UINT)mli.height, 1, (UINT)mli.rowPitch } }), nullptr);
|
&CD3DX12_TEXTURE_COPY_LOCATION(texture_buffer_heap.m_heap, { heap_offset + mli.offset, { dxgi_format, (UINT)mli.width, (UINT)mli.height, 1, (UINT)mli.rowPitch } }), nullptr);
|
||||||
miplevel++;
|
mip_level++;
|
||||||
}
|
}
|
||||||
|
|
||||||
commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(vramTexture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
|
command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(result.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
|
||||||
return vramTexture;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static
|
void update_existing_texture(
|
||||||
void updateExistingTexture(
|
|
||||||
const rsx::texture &texture,
|
const rsx::texture &texture,
|
||||||
ID3D12GraphicsCommandList *commandList,
|
ID3D12GraphicsCommandList *command_list,
|
||||||
DataHeap<ID3D12Resource, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT> &textureBuffersHeap,
|
DataHeap<ID3D12Resource, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT> &texture_buffer_heap,
|
||||||
ID3D12Resource *existingTexture)
|
ID3D12Resource *existing_texture)
|
||||||
{
|
{
|
||||||
size_t w = texture.width(), h = texture.height();
|
size_t w = texture.width(), h = texture.height();
|
||||||
|
|
||||||
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
DXGI_FORMAT dxgiFormat = get_texture_format(format);
|
DXGI_FORMAT dxgi_format = get_texture_format(format);
|
||||||
|
|
||||||
size_t textureSize = getPlacedTextureStorageSpace(texture, 256);
|
size_t buffer_size = get_placed_texture_storage_size(texture, 256);
|
||||||
assert(textureBuffersHeap.canAlloc(textureSize));
|
assert(texture_buffer_heap.canAlloc(buffer_size));
|
||||||
size_t heapOffset = textureBuffersHeap.alloc(textureSize);
|
size_t heap_offset = texture_buffer_heap.alloc(buffer_size);
|
||||||
|
|
||||||
void *buffer;
|
void *buffer;
|
||||||
ThrowIfFailed(textureBuffersHeap.m_heap->Map(0, &CD3DX12_RANGE(heapOffset, heapOffset + textureSize), &buffer));
|
ThrowIfFailed(texture_buffer_heap.m_heap->Map(0, &CD3DX12_RANGE(heap_offset, heap_offset + buffer_size), &buffer));
|
||||||
void *textureData = (char*)buffer + heapOffset;
|
void *mapped_buffer = (char*)buffer + heap_offset;
|
||||||
std::vector<MipmapLevelInfo> mipInfos = uploadPlacedTexture(texture, 256, textureData);
|
std::vector<MipmapLevelInfo> mipInfos = upload_placed_texture(texture, 256, mapped_buffer);
|
||||||
textureBuffersHeap.m_heap->Unmap(0, &CD3DX12_RANGE(heapOffset, heapOffset + textureSize));
|
texture_buffer_heap.m_heap->Unmap(0, &CD3DX12_RANGE(heap_offset, heap_offset + buffer_size));
|
||||||
|
|
||||||
commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(existingTexture, D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST));
|
command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(existing_texture, D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST));
|
||||||
size_t miplevel = 0;
|
size_t miplevel = 0;
|
||||||
for (const MipmapLevelInfo mli : mipInfos)
|
for (const MipmapLevelInfo mli : mipInfos)
|
||||||
{
|
{
|
||||||
commandList->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(existingTexture, (UINT)miplevel), 0, 0, 0,
|
command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(existing_texture, (UINT)miplevel), 0, 0, 0,
|
||||||
&CD3DX12_TEXTURE_COPY_LOCATION(textureBuffersHeap.m_heap, { heapOffset + mli.offset,{ dxgiFormat, (UINT)mli.width, (UINT)mli.height, 1, (UINT)mli.rowPitch } }), nullptr);
|
&CD3DX12_TEXTURE_COPY_LOCATION(texture_buffer_heap.m_heap, { heap_offset + mli.offset,{ dxgi_format, (UINT)mli.width, (UINT)mli.height, 1, (UINT)mli.rowPitch } }), nullptr);
|
||||||
miplevel++;
|
miplevel++;
|
||||||
}
|
}
|
||||||
|
|
||||||
commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(existingTexture, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
|
command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(existing_texture, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t descriptor_index)
|
||||||
/**
|
|
||||||
* Get number of bytes occupied by texture in RSX mem
|
|
||||||
*/
|
|
||||||
static
|
|
||||||
size_t getTextureSize(const rsx::texture &texture)
|
|
||||||
{
|
{
|
||||||
size_t w = texture.width(), h = texture.height();
|
size_t used_texture = 0;
|
||||||
|
|
||||||
int format = texture.format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
|
||||||
// TODO: Take mipmaps into account
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8:
|
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
|
||||||
case ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN) & CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
|
||||||
default:
|
|
||||||
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
|
||||||
return 0;
|
|
||||||
case CELL_GCM_TEXTURE_B8:
|
|
||||||
return w * h;
|
|
||||||
case CELL_GCM_TEXTURE_A1R5G5B5:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_R5G6B5:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT1:
|
|
||||||
return w * h / 6;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT23:
|
|
||||||
return w * h / 4;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_DXT45:
|
|
||||||
return w * h / 4;
|
|
||||||
case CELL_GCM_TEXTURE_G8B8:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_R6G5B5:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_DEPTH16_FLOAT:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_X16:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_R5G5B5A1:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT:
|
|
||||||
return w * h * 8;
|
|
||||||
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
|
||||||
return w * h * 16;
|
|
||||||
case CELL_GCM_TEXTURE_X32_FLOAT:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_D1R5G5B5:
|
|
||||||
return w * h * 2;
|
|
||||||
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_D8R8G8B8:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
|
||||||
return w * h * 4;
|
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
|
||||||
return w * h * 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t descriptorIndex)
|
|
||||||
{
|
|
||||||
size_t usedTexture = 0;
|
|
||||||
|
|
||||||
for (u32 i = 0; i < rsx::limits::textures_count; ++i)
|
for (u32 i = 0; i < rsx::limits::textures_count; ++i)
|
||||||
{
|
{
|
||||||
|
@ -216,40 +137,39 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
const u32 texaddr = rsx::get_address(textures[i].offset(), textures[i].location());
|
const u32 texaddr = rsx::get_address(textures[i].offset(), textures[i].location());
|
||||||
|
|
||||||
int format = textures[i].format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
int format = textures[i].format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN);
|
||||||
DXGI_FORMAT dxgiFormat = get_texture_format(format);
|
|
||||||
bool is_swizzled = !(textures[i].format() & CELL_GCM_TEXTURE_LN);
|
bool is_swizzled = !(textures[i].format() & CELL_GCM_TEXTURE_LN);
|
||||||
|
|
||||||
ID3D12Resource *vramTexture;
|
ID3D12Resource *vram_texture;
|
||||||
std::unordered_map<u32, ID3D12Resource* >::const_iterator ItRTT = m_rtts.m_renderTargets.find(texaddr);
|
std::unordered_map<u32, ID3D12Resource* >::const_iterator ItRTT = m_rtts.m_renderTargets.find(texaddr);
|
||||||
std::pair<TextureEntry, ComPtr<ID3D12Resource> > *cachedTex = m_textureCache.findDataIfAvailable(texaddr);
|
std::pair<TextureEntry, ComPtr<ID3D12Resource> > *cached_texture = m_textureCache.findDataIfAvailable(texaddr);
|
||||||
bool isRenderTarget = false;
|
bool isRenderTarget = false;
|
||||||
if (ItRTT != m_rtts.m_renderTargets.end())
|
if (ItRTT != m_rtts.m_renderTargets.end())
|
||||||
{
|
{
|
||||||
vramTexture = ItRTT->second;
|
vram_texture = ItRTT->second;
|
||||||
isRenderTarget = true;
|
isRenderTarget = true;
|
||||||
}
|
}
|
||||||
else if (cachedTex != nullptr && (cachedTex->first == TextureEntry(format, w, h, textures[i].mipmap())))
|
else if (cached_texture != nullptr && (cached_texture->first == TextureEntry(format, w, h, textures[i].mipmap())))
|
||||||
{
|
{
|
||||||
if (cachedTex->first.m_isDirty)
|
if (cached_texture->first.m_isDirty)
|
||||||
{
|
{
|
||||||
updateExistingTexture(textures[i], cmdlist, m_textureUploadData, cachedTex->second.Get());
|
update_existing_texture(textures[i], cmdlist, m_textureUploadData, cached_texture->second.Get());
|
||||||
m_textureCache.protectData(texaddr, texaddr, getTextureSize(textures[i]));
|
m_textureCache.protectData(texaddr, texaddr, get_texture_size(textures[i]));
|
||||||
}
|
}
|
||||||
vramTexture = cachedTex->second.Get();
|
vram_texture = cached_texture->second.Get();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (cachedTex != nullptr)
|
if (cached_texture != nullptr)
|
||||||
getCurrentResourceStorage().m_dirtyTextures.push_back(m_textureCache.removeFromCache(texaddr));
|
getCurrentResourceStorage().m_dirtyTextures.push_back(m_textureCache.removeFromCache(texaddr));
|
||||||
ComPtr<ID3D12Resource> tex = uploadSingleTexture(textures[i], m_device.Get(), cmdlist, m_textureUploadData);
|
ComPtr<ID3D12Resource> tex = upload_single_texture(textures[i], m_device.Get(), cmdlist, m_textureUploadData);
|
||||||
vramTexture = tex.Get();
|
vram_texture = tex.Get();
|
||||||
m_textureCache.storeAndProtectData(texaddr, texaddr, getTextureSize(textures[i]), format, w, h, textures[i].mipmap(), tex);
|
m_textureCache.storeAndProtectData(texaddr, texaddr, get_texture_size(textures[i]), format, w, h, textures[i].mipmap(), tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
|
D3D12_SHADER_RESOURCE_VIEW_DESC shared_resource_view_desc = {};
|
||||||
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
shared_resource_view_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
||||||
srvDesc.Format = dxgiFormat;
|
shared_resource_view_desc.Format = get_texture_format(format);
|
||||||
srvDesc.Texture2D.MipLevels = textures[i].mipmap();
|
shared_resource_view_desc.Texture2D.MipLevels = textures[i].mipmap();
|
||||||
|
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
|
@ -261,7 +181,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
LOG_ERROR(RSX, "Unimplemented Texture format : %x", format);
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_B8:
|
case CELL_GCM_TEXTURE_B8:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
|
||||||
|
@ -270,7 +190,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
case CELL_GCM_TEXTURE_A1R5G5B5:
|
case CELL_GCM_TEXTURE_A1R5G5B5:
|
||||||
case CELL_GCM_TEXTURE_A4R4G4B4:
|
case CELL_GCM_TEXTURE_A4R4G4B4:
|
||||||
case CELL_GCM_TEXTURE_R5G6B5:
|
case CELL_GCM_TEXTURE_R5G6B5:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_A8R8G8B8:
|
case CELL_GCM_TEXTURE_A8R8G8B8:
|
||||||
{
|
{
|
||||||
|
@ -292,7 +212,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2
|
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2
|
||||||
};
|
};
|
||||||
|
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
||||||
RemapValue[remap_r],
|
RemapValue[remap_r],
|
||||||
RemapValue[remap_g],
|
RemapValue[remap_g],
|
||||||
RemapValue[remap_b],
|
RemapValue[remap_b],
|
||||||
|
@ -310,7 +230,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3
|
D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3
|
||||||
};
|
};
|
||||||
|
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
||||||
RemapValue[remap_r],
|
RemapValue[remap_r],
|
||||||
RemapValue[remap_g],
|
RemapValue[remap_g],
|
||||||
RemapValue[remap_b],
|
RemapValue[remap_b],
|
||||||
|
@ -335,7 +255,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT:
|
||||||
case CELL_GCM_TEXTURE_X32_FLOAT:
|
case CELL_GCM_TEXTURE_X32_FLOAT:
|
||||||
case CELL_GCM_TEXTURE_D1R5G5B5:
|
case CELL_GCM_TEXTURE_D1R5G5B5:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_D8R8G8B8:
|
case CELL_GCM_TEXTURE_D8R8G8B8:
|
||||||
{
|
{
|
||||||
|
@ -352,7 +272,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
u8 remap_g = (textures[i].remap() >> 4) & 0x3;
|
u8 remap_g = (textures[i].remap() >> 4) & 0x3;
|
||||||
u8 remap_b = (textures[i].remap() >> 6) & 0x3;
|
u8 remap_b = (textures[i].remap() >> 6) & 0x3;
|
||||||
|
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
|
||||||
RemapValue[remap_a],
|
RemapValue[remap_a],
|
||||||
RemapValue[remap_r],
|
RemapValue[remap_r],
|
||||||
RemapValue[remap_g],
|
RemapValue[remap_g],
|
||||||
|
@ -360,32 +280,32 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist, size_t
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
case CELL_GCM_TEXTURE_Y16_X16_FLOAT:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
break;
|
break;
|
||||||
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8:
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
shared_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_device->CreateShaderResourceView(vramTexture, &srvDesc,
|
m_device->CreateShaderResourceView(vram_texture, &shared_resource_view_desc,
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(getCurrentResourceStorage().m_descriptorsHeap->GetCPUDescriptorHandleForHeapStart())
|
CD3DX12_CPU_DESCRIPTOR_HANDLE(getCurrentResourceStorage().m_descriptorsHeap->GetCPUDescriptorHandleForHeapStart())
|
||||||
.Offset((UINT)descriptorIndex + (UINT)usedTexture, g_descriptorStrideSRVCBVUAV));
|
.Offset((UINT)descriptor_index + (UINT)used_texture, g_descriptorStrideSRVCBVUAV));
|
||||||
|
|
||||||
if (getCurrentResourceStorage().m_currentSamplerIndex + 16 > 2048)
|
if (getCurrentResourceStorage().m_currentSamplerIndex + 16 > 2048)
|
||||||
{
|
{
|
||||||
getCurrentResourceStorage().m_samplerDescriptorHeapIndex = 1;
|
getCurrentResourceStorage().m_samplerDescriptorHeapIndex = 1;
|
||||||
getCurrentResourceStorage().m_currentSamplerIndex = 0;
|
getCurrentResourceStorage().m_currentSamplerIndex = 0;
|
||||||
}
|
}
|
||||||
m_device->CreateSampler(&getSamplerDesc(textures[i]),
|
m_device->CreateSampler(&get_sampler_desc(textures[i]),
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(getCurrentResourceStorage().m_samplerDescriptorHeap[getCurrentResourceStorage().m_samplerDescriptorHeapIndex]->GetCPUDescriptorHandleForHeapStart())
|
CD3DX12_CPU_DESCRIPTOR_HANDLE(getCurrentResourceStorage().m_samplerDescriptorHeap[getCurrentResourceStorage().m_samplerDescriptorHeapIndex]->GetCPUDescriptorHandleForHeapStart())
|
||||||
.Offset((UINT)getCurrentResourceStorage().m_currentSamplerIndex + (UINT)usedTexture, g_descriptorStrideSamplers));
|
.Offset((UINT)getCurrentResourceStorage().m_currentSamplerIndex + (UINT)used_texture, g_descriptorStrideSamplers));
|
||||||
|
|
||||||
usedTexture++;
|
used_texture++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return usedTexture;
|
return used_texture;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
#pragma once
|
|
Loading…
Add table
Add a link
Reference in a new issue