GPU: Fixed texel pitch calculation for linear textures.

This commit is contained in:
gibbed 2017-08-07 20:50:42 -05:00
parent febe46973f
commit 6d9a56a269
2 changed files with 26 additions and 13 deletions

View File

@ -124,14 +124,18 @@ void TextureInfo::CalculateTextureSizes1D(uint32_t width) {
size_1d.block_width = tile_width * 32; size_1d.block_width = tile_width * 32;
uint32_t bytes_per_block = format->block_width * format->bits_per_pixel / 8; uint32_t bytes_per_block = format->block_width * format->bits_per_pixel / 8;
uint32_t byte_pitch = tile_width * 32 * bytes_per_block; uint32_t byte_pitch = tile_width * 32 * bytes_per_block;
uint32_t texel_width;
if (!is_tiled) { if (!is_tiled) {
// Each row must be a multiple of 256 in linear textures. // Each row must be a multiple of 256 in linear textures.
byte_pitch = xe::round_up(byte_pitch, 256); byte_pitch = xe::round_up(byte_pitch, 256);
texel_width = (byte_pitch / bytes_per_block) * format->block_width;
} else {
texel_width = tile_width * 32 * format->block_width;
} }
size_1d.input_width = tile_width * 32 * format->block_width; size_1d.input_width = texel_width;
size_1d.input_pitch = byte_pitch; size_1d.input_pitch = byte_pitch;
input_length = size_1d.input_pitch; input_length = size_1d.input_pitch;
} }
@ -164,12 +168,16 @@ void TextureInfo::CalculateTextureSizes2D(uint32_t width, uint32_t height) {
format->block_width * format->block_height * format->bits_per_pixel / 8; format->block_width * format->block_height * format->bits_per_pixel / 8;
uint32_t byte_pitch = size_2d.block_width * bytes_per_block; uint32_t byte_pitch = size_2d.block_width * bytes_per_block;
uint32_t texel_width;
if (!is_tiled) { if (!is_tiled) {
// Each row must be a multiple of 256 in linear textures. // Each row must be a multiple of 256 in linear textures.
byte_pitch = xe::round_up(byte_pitch, 256); byte_pitch = xe::round_up(byte_pitch, 256);
texel_width = (byte_pitch / bytes_per_block) * format->block_width;
} else {
texel_width = size_2d.block_width * format->block_width;
} }
size_2d.input_width = size_2d.block_width * format->block_width; size_2d.input_width = texel_width;
size_2d.input_height = size_2d.block_height * format->block_height; size_2d.input_height = size_2d.block_height * format->block_height;
size_2d.input_pitch = byte_pitch; size_2d.input_pitch = byte_pitch;
@ -201,12 +209,17 @@ void TextureInfo::CalculateTextureSizesCube(uint32_t width, uint32_t height,
uint32_t bytes_per_block = uint32_t bytes_per_block =
format->block_width * format->block_height * format->bits_per_pixel / 8; format->block_width * format->block_height * format->bits_per_pixel / 8;
uint32_t byte_pitch = size_cube.block_width * bytes_per_block; uint32_t byte_pitch = size_cube.block_width * bytes_per_block;
uint32_t texel_width;
if (!is_tiled) { if (!is_tiled) {
// Each row must be a multiple of 256 in linear textures. // Each row must be a multiple of 256 in linear textures.
byte_pitch = xe::round_up(byte_pitch, 256); byte_pitch = xe::round_up(byte_pitch, 256);
texel_width = (byte_pitch / bytes_per_block) * format->block_width;
} else {
texel_width = size_cube.block_width * format->block_width;
} }
size_cube.input_width = size_cube.block_width * format->block_width; size_cube.input_width = texel_width;
size_cube.input_height = size_cube.block_height * format->block_height; size_cube.input_height = size_cube.block_height * format->block_height;
size_cube.input_pitch = byte_pitch; size_cube.input_pitch = byte_pitch;

View File

@ -269,17 +269,17 @@ struct TextureInfo {
struct { struct {
uint32_t logical_width; uint32_t logical_width;
uint32_t block_width; // # of horizontal blocks uint32_t block_width; // # of horizontal blocks
uint32_t input_width; // pixel pitch uint32_t input_width; // texel pitch
uint32_t input_pitch; // pitch in bytes uint32_t input_pitch; // byte pitch
} size_1d; } size_1d;
struct { struct {
uint32_t logical_width; uint32_t logical_width;
uint32_t logical_height; uint32_t logical_height;
uint32_t block_width; // # of horizontal blocks uint32_t block_width; // # of horizontal blocks
uint32_t block_height; // # of vertical blocks uint32_t block_height; // # of vertical blocks
uint32_t input_width; // pixel pitch uint32_t input_width; // texel pitch
uint32_t input_height; // pixel height uint32_t input_height; // texel height
uint32_t input_pitch; // pitch in bytes uint32_t input_pitch; // byte pitch
} size_2d; } size_2d;
struct { struct {
} size_3d; } size_3d;
@ -288,10 +288,10 @@ struct TextureInfo {
uint32_t logical_height; uint32_t logical_height;
uint32_t block_width; // # of horizontal blocks uint32_t block_width; // # of horizontal blocks
uint32_t block_height; // # of vertical blocks uint32_t block_height; // # of vertical blocks
uint32_t input_width; // pixel pitch uint32_t input_width; // texel pitch
uint32_t input_height; // pixel height uint32_t input_height; // texel height
uint32_t input_pitch; // pitch in bytes uint32_t input_pitch; // byte pitch
uint32_t input_face_length; // pitch of face in bytes uint32_t input_face_length; // byte pitch of face
} size_cube; } size_cube;
}; };