1
0
Fork 0
forked from suyu/suyu

texture_cache: eliminate accelerated depth->color/color->depth copies due to driver instability.

This commit is contained in:
Fernando Sahmkow 2019-06-11 07:20:27 -04:00 committed by ReinUsesLisp
parent 561ce29c98
commit b01f9c8a70
4 changed files with 6 additions and 22 deletions

View file

@ -28,7 +28,6 @@ Device::Device() {
max_varyings = GetInteger<u32>(GL_MAX_VARYING_VECTORS); max_varyings = GetInteger<u32>(GL_MAX_VARYING_VECTORS);
has_variable_aoffi = TestVariableAoffi(); has_variable_aoffi = TestVariableAoffi();
has_component_indexing_bug = TestComponentIndexingBug(); has_component_indexing_bug = TestComponentIndexingBug();
is_turing_plus = GLAD_GL_NV_mesh_shader;
} }
Device::Device(std::nullptr_t) { Device::Device(std::nullptr_t) {

View file

@ -34,10 +34,6 @@ public:
return has_component_indexing_bug; return has_component_indexing_bug;
} }
bool IsTuringGPU() const {
return is_turing_plus;
}
private: private:
static bool TestVariableAoffi(); static bool TestVariableAoffi();
static bool TestComponentIndexingBug(); static bool TestComponentIndexingBug();
@ -47,7 +43,6 @@ private:
u32 max_varyings{}; u32 max_varyings{};
bool has_variable_aoffi{}; bool has_variable_aoffi{};
bool has_component_indexing_bug{}; bool has_component_indexing_bug{};
bool is_turing_plus{};
}; };
} // namespace OpenGL } // namespace OpenGL

View file

@ -439,7 +439,6 @@ TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system,
VideoCore::RasterizerInterface& rasterizer, VideoCore::RasterizerInterface& rasterizer,
const Device& device) const Device& device)
: TextureCacheBase{system, rasterizer} { : TextureCacheBase{system, rasterizer} {
support_info.depth_color_image_copies = !device.IsTuringGPU();
src_framebuffer.Create(); src_framebuffer.Create();
dst_framebuffer.Create(); dst_framebuffer.Create();
} }
@ -452,13 +451,11 @@ Surface TextureCacheOpenGL::CreateSurface(GPUVAddr gpu_addr, const SurfaceParams
void TextureCacheOpenGL::ImageCopy(Surface& src_surface, Surface& dst_surface, void TextureCacheOpenGL::ImageCopy(Surface& src_surface, Surface& dst_surface,
const VideoCommon::CopyParams& copy_params) { const VideoCommon::CopyParams& copy_params) {
if (!support_info.depth_color_image_copies) { const auto& src_params = src_surface->GetSurfaceParams();
const auto& src_params = src_surface->GetSurfaceParams(); const auto& dst_params = dst_surface->GetSurfaceParams();
const auto& dst_params = dst_surface->GetSurfaceParams(); if (src_params.type != dst_params.type) {
if (src_params.type != dst_params.type) { // A fallback is needed
// A fallback is needed return;
return;
}
} }
const auto src_handle = src_surface->GetTexture(); const auto src_handle = src_surface->GetTexture();
const auto src_target = src_surface->GetTarget(); const auto src_target = src_surface->GetTarget();

View file

@ -218,12 +218,6 @@ public:
} }
protected: protected:
// This structure is used for communicating with the backend, on which behaviors
// it supports and what not, to avoid assuming certain things about hardware.
// The backend is RESPONSIBLE for filling this settings on creation.
struct Support {
bool depth_color_image_copies;
} support_info;
TextureCache(Core::System& system, VideoCore::RasterizerInterface& rasterizer) TextureCache(Core::System& system, VideoCore::RasterizerInterface& rasterizer)
: system{system}, rasterizer{rasterizer} { : system{system}, rasterizer{rasterizer} {
@ -389,8 +383,7 @@ private:
const auto gpu_addr = current_surface->GetGpuAddr(); const auto gpu_addr = current_surface->GetGpuAddr();
TSurface new_surface = GetUncachedSurface(gpu_addr, params); TSurface new_surface = GetUncachedSurface(gpu_addr, params);
const auto& cr_params = current_surface->GetSurfaceParams(); const auto& cr_params = current_surface->GetSurfaceParams();
if (cr_params.type != params.type && (!support_info.depth_color_image_copies || if (cr_params.type != params.type || (cr_params.component_type != params.component_type)) {
cr_params.component_type != params.component_type)) {
BufferCopy(current_surface, new_surface); BufferCopy(current_surface, new_surface);
} else { } else {
std::vector<CopyParams> bricks = current_surface->BreakDown(params); std::vector<CopyParams> bricks = current_surface->BreakDown(params);