forked from ShuriZma/suyu
1
0
Fork 0

Merge pull request #1505 from FernandoS27/tex-3d

Implemented 3D Textures
This commit is contained in:
bunnei 2018-10-18 11:50:42 -04:00 committed by GitHub
commit 6acd8d166a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 2 deletions

View File

@ -448,7 +448,10 @@ public:
BitField<8, 3, u32> block_depth; BitField<8, 3, u32> block_depth;
BitField<12, 1, InvMemoryLayout> type; BitField<12, 1, InvMemoryLayout> type;
} memory_layout; } memory_layout;
u32 array_mode; union {
BitField<0, 16, u32> array_mode;
BitField<16, 1, u32> volume;
};
u32 layer_stride; u32 layer_stride;
u32 base_layer; u32 base_layer;
INSERT_PADDING_WORDS(7); INSERT_PADDING_WORDS(7);

View File

@ -155,6 +155,7 @@ void SurfaceParams::InitCacheParameters(Tegra::GPUVAddr gpu_addr_) {
params.rt.index = static_cast<u32>(index); params.rt.index = static_cast<u32>(index);
params.rt.array_mode = config.array_mode; params.rt.array_mode = config.array_mode;
params.rt.layer_stride = config.layer_stride; params.rt.layer_stride = config.layer_stride;
params.rt.volume = config.volume;
params.rt.base_layer = config.base_layer; params.rt.base_layer = config.base_layer;
params.InitCacheParameters(config.Address()); params.InitCacheParameters(config.Address());
@ -1122,8 +1123,8 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
} else if (preserve_contents) { } else if (preserve_contents) {
// If surface parameters changed and we care about keeping the previous data, recreate // If surface parameters changed and we care about keeping the previous data, recreate
// the surface from the old one // the surface from the old one
Unregister(surface);
Surface new_surface{RecreateSurface(surface, params)}; Surface new_surface{RecreateSurface(surface, params)};
Unregister(surface);
Register(new_surface); Register(new_surface);
return new_surface; return new_surface;
} else { } else {
@ -1220,6 +1221,9 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface,
CopySurface(old_surface, new_surface, copy_pbo.handle); CopySurface(old_surface, new_surface, copy_pbo.handle);
} }
break; break;
case SurfaceParams::SurfaceTarget::Texture3D:
AccurateCopySurface(old_surface, new_surface);
break;
case SurfaceParams::SurfaceTarget::TextureCubemap: { case SurfaceParams::SurfaceTarget::TextureCubemap: {
if (old_params.rt.array_mode != 1) { if (old_params.rt.array_mode != 1) {
// TODO(bunnei): This is used by Breath of the Wild, I'm not sure how to implement this // TODO(bunnei): This is used by Breath of the Wild, I'm not sure how to implement this

View File

@ -132,6 +132,8 @@ struct SurfaceParams {
case Tegra::Texture::TextureType::Texture2D: case Tegra::Texture::TextureType::Texture2D:
case Tegra::Texture::TextureType::Texture2DNoMipmap: case Tegra::Texture::TextureType::Texture2DNoMipmap:
return SurfaceTarget::Texture2D; return SurfaceTarget::Texture2D;
case Tegra::Texture::TextureType::Texture3D:
return SurfaceTarget::Texture3D;
case Tegra::Texture::TextureType::TextureCubemap: case Tegra::Texture::TextureType::TextureCubemap:
return SurfaceTarget::TextureCubemap; return SurfaceTarget::TextureCubemap;
case Tegra::Texture::TextureType::Texture1DArray: case Tegra::Texture::TextureType::Texture1DArray:
@ -791,6 +793,7 @@ struct SurfaceParams {
struct { struct {
u32 index; u32 index;
u32 array_mode; u32 array_mode;
u32 volume;
u32 layer_stride; u32 layer_stride;
u32 base_layer; u32 base_layer;
} rt; } rt;

View File

@ -1142,6 +1142,7 @@ private:
case Tegra::Shader::TextureType::Texture2D: { case Tegra::Shader::TextureType::Texture2D: {
return 2; return 2;
} }
case Tegra::Shader::TextureType::Texture3D:
case Tegra::Shader::TextureType::TextureCube: { case Tegra::Shader::TextureType::TextureCube: {
return 3; return 3;
} }