OpenGlTextureCache: Fix state invalidation on rescaling.

This commit is contained in:
Fernando Sahmkow 2021-10-23 01:52:34 +02:00
parent c5dbd93adb
commit 5c6fa88935
3 changed files with 17 additions and 2 deletions

View File

@ -942,10 +942,21 @@ bool Image::Scale(bool up_scale) {
dst_info.size.height = scaled_height; dst_info.size.height = scaled_height;
upscaled_backup = MakeImage(dst_info, gl_internal_format); upscaled_backup = MakeImage(dst_info, gl_internal_format);
} }
auto& state_tracker = runtime->GetStateTracker();
state_tracker.NotifyViewport0();
state_tracker.NotifyScissor0();
// TODO (ameerj): Investigate other GL states that affect blitting. // TODO (ameerj): Investigate other GL states that affect blitting.
GLboolean scissor_test; GLboolean scissor_test;
glGetBooleani_v(GL_SCISSOR_TEST, 0, &scissor_test); glGetBooleani_v(GL_SCISSOR_TEST, 0, &scissor_test);
glDisablei(GL_SCISSOR_TEST, 0); glDisablei(GL_SCISSOR_TEST, 0);
if (up_scale) {
glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(scaled_width),
static_cast<GLfloat>(scaled_height));
} else {
glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(original_width),
static_cast<GLfloat>(original_height));
}
const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle; const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle;
const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle; const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle;

View File

@ -116,6 +116,10 @@ public:
void TickFrame() {} void TickFrame() {}
StateTracker& GetStateTracker() {
return state_tracker;
}
private: private:
struct StagingBuffers { struct StagingBuffers {
explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_); explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);

View File

@ -1810,8 +1810,8 @@ void TextureCache<P>::BindRenderTarget(ImageViewId* old_id, ImageViewId new_id)
if (*old_id == new_id) { if (*old_id == new_id) {
return; return;
} }
if (*old_id) { if (new_id) {
const ImageViewBase& old_view = slot_image_views[*old_id]; const ImageViewBase& old_view = slot_image_views[new_id];
if (True(old_view.flags & ImageViewFlagBits::PreemtiveDownload)) { if (True(old_view.flags & ImageViewFlagBits::PreemtiveDownload)) {
uncommitted_downloads.push_back(old_view.image_id); uncommitted_downloads.push_back(old_view.image_id);
} }