|
@@ -104,6 +104,11 @@ public:
|
|
|
if (!cache_addr) {
|
|
if (!cache_addr) {
|
|
|
return GetNullSurface(SurfaceParams::ExpectedTarget(entry));
|
|
return GetNullSurface(SurfaceParams::ExpectedTarget(entry));
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if (!IsTypeCompatible(tic.texture_type, entry)) {
|
|
|
|
|
+ return GetNullSurface(SurfaceParams::ExpectedTarget(entry));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const auto params{SurfaceParams::CreateForTexture(format_lookup_table, tic, entry)};
|
|
const auto params{SurfaceParams::CreateForTexture(format_lookup_table, tic, entry)};
|
|
|
const auto [surface, view] = GetSurface(gpu_addr, cache_addr, params, true, false);
|
|
const auto [surface, view] = GetSurface(gpu_addr, cache_addr, params, true, false);
|
|
|
if (guard_samplers) {
|
|
if (guard_samplers) {
|
|
@@ -914,13 +919,15 @@ private:
|
|
|
params.width = 1;
|
|
params.width = 1;
|
|
|
params.height = 1;
|
|
params.height = 1;
|
|
|
params.depth = 1;
|
|
params.depth = 1;
|
|
|
|
|
+ if (target == SurfaceTarget::TextureCubemap || target == SurfaceTarget::TextureCubeArray) {
|
|
|
|
|
+ params.depth = 6;
|
|
|
|
|
+ }
|
|
|
params.pitch = 4;
|
|
params.pitch = 4;
|
|
|
params.num_levels = 1;
|
|
params.num_levels = 1;
|
|
|
params.emulated_levels = 1;
|
|
params.emulated_levels = 1;
|
|
|
- params.pixel_format = VideoCore::Surface::PixelFormat::RGBA16F;
|
|
|
|
|
|
|
+ params.pixel_format = VideoCore::Surface::PixelFormat::R8U;
|
|
|
params.type = VideoCore::Surface::SurfaceType::ColorTexture;
|
|
params.type = VideoCore::Surface::SurfaceType::ColorTexture;
|
|
|
auto surface = CreateSurface(0ULL, params);
|
|
auto surface = CreateSurface(0ULL, params);
|
|
|
- invalid_memory.clear();
|
|
|
|
|
invalid_memory.resize(surface->GetHostSizeInBytes(), 0U);
|
|
invalid_memory.resize(surface->GetHostSizeInBytes(), 0U);
|
|
|
surface->UploadTexture(invalid_memory);
|
|
surface->UploadTexture(invalid_memory);
|
|
|
surface->MarkAsModified(false, Tick());
|
|
surface->MarkAsModified(false, Tick());
|
|
@@ -1082,6 +1089,36 @@ private:
|
|
|
return siblings_table[static_cast<std::size_t>(format)];
|
|
return siblings_table[static_cast<std::size_t>(format)];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// Returns true the shader sampler entry is compatible with the TIC texture type.
|
|
|
|
|
+ static bool IsTypeCompatible(Tegra::Texture::TextureType tic_type,
|
|
|
|
|
+ const VideoCommon::Shader::Sampler& entry) {
|
|
|
|
|
+ const auto shader_type = entry.GetType();
|
|
|
|
|
+ switch (tic_type) {
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture1D:
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture1DArray:
|
|
|
|
|
+ return shader_type == Tegra::Shader::TextureType::Texture1D;
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture1DBuffer:
|
|
|
|
|
+ // TODO(Rodrigo): Assume as valid for now
|
|
|
|
|
+ return true;
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture2D:
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture2DNoMipmap:
|
|
|
|
|
+ return shader_type == Tegra::Shader::TextureType::Texture2D;
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture2DArray:
|
|
|
|
|
+ return shader_type == Tegra::Shader::TextureType::Texture2D ||
|
|
|
|
|
+ shader_type == Tegra::Shader::TextureType::TextureCube;
|
|
|
|
|
+ case Tegra::Texture::TextureType::Texture3D:
|
|
|
|
|
+ return shader_type == Tegra::Shader::TextureType::Texture3D;
|
|
|
|
|
+ case Tegra::Texture::TextureType::TextureCubeArray:
|
|
|
|
|
+ case Tegra::Texture::TextureType::TextureCubemap:
|
|
|
|
|
+ if (shader_type == Tegra::Shader::TextureType::TextureCube) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return shader_type == Tegra::Shader::TextureType::Texture2D && entry.IsArray();
|
|
|
|
|
+ }
|
|
|
|
|
+ UNREACHABLE();
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
struct FramebufferTargetInfo {
|
|
struct FramebufferTargetInfo {
|
|
|
TSurface target;
|
|
TSurface target;
|
|
|
TView view;
|
|
TView view;
|