summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp111
1 files changed, 88 insertions, 23 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 00351d743..57af6cdd1 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -414,9 +414,12 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, std::size_t, VAddr),
414 // clang-format on 414 // clang-format on
415}; 415};
416 416
417static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect, GLuint dst_tex, 417static bool BlitSurface(const Surface& src_surface, const Surface& dst_surface,
418 const MathUtil::Rectangle<u32>& dst_rect, SurfaceType type, 418 GLuint read_fb_handle, GLuint draw_fb_handle, std::size_t face = 0) {
419 GLuint read_fb_handle, GLuint draw_fb_handle) { 419
420 const auto& src_params{src_surface->GetSurfaceParams()};
421 const auto& dst_params{dst_surface->GetSurfaceParams()};
422
420 OpenGLState prev_state{OpenGLState::GetCurState()}; 423 OpenGLState prev_state{OpenGLState::GetCurState()};
421 SCOPE_EXIT({ prev_state.Apply(); }); 424 SCOPE_EXIT({ prev_state.Apply(); });
422 425
@@ -427,42 +430,106 @@ static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rec
427 430
428 u32 buffers{}; 431 u32 buffers{};
429 432
430 if (type == SurfaceType::ColorTexture) { 433 if (src_params.type == SurfaceType::ColorTexture) {
431 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, src_tex, 434 switch (src_params.target) {
432 0); 435 case SurfaceParams::SurfaceTarget::Texture2D:
433 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 436 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
434 0); 437 src_surface->Texture().handle, 0);
438 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
439 0, 0);
440 break;
441 case SurfaceParams::SurfaceTarget::TextureCubemap:
442 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
443 static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face),
444 src_surface->Texture().handle, 0);
445 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
446 static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face), 0,
447 0);
448 break;
449 case SurfaceParams::SurfaceTarget::Texture2DArray:
450 glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
451 src_surface->Texture().handle, 0, 0);
452 glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, 0, 0, 0);
453 break;
454 case SurfaceParams::SurfaceTarget::Texture3D:
455 glFramebufferTexture3D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
456 SurfaceTargetToGL(src_params.target),
457 src_surface->Texture().handle, 0, 0);
458 glFramebufferTexture3D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
459 SurfaceTargetToGL(src_params.target), 0, 0, 0);
460 break;
461 default:
462 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
463 src_surface->Texture().handle, 0);
464 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
465 0, 0);
466 break;
467 }
435 468
436 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dst_tex, 469 switch (dst_params.target) {
437 0); 470 case SurfaceParams::SurfaceTarget::Texture2D:
438 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 471 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
439 0); 472 dst_surface->Texture().handle, 0);
473 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
474 0, 0);
475 break;
476 case SurfaceParams::SurfaceTarget::TextureCubemap:
477 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
478 static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face),
479 dst_surface->Texture().handle, 0);
480 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
481 static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face), 0,
482 0);
483 break;
484 case SurfaceParams::SurfaceTarget::Texture2DArray:
485 glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
486 dst_surface->Texture().handle, 0, 0);
487 glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, 0, 0, 0);
488 break;
489
490 case SurfaceParams::SurfaceTarget::Texture3D:
491 glFramebufferTexture3D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
492 SurfaceTargetToGL(dst_params.target),
493 dst_surface->Texture().handle, 0, 0);
494 glFramebufferTexture3D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
495 SurfaceTargetToGL(dst_params.target), 0, 0, 0);
496 break;
497 default:
498 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
499 dst_surface->Texture().handle, 0);
500 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
501 0, 0);
502 break;
503 }
440 504
441 buffers = GL_COLOR_BUFFER_BIT; 505 buffers = GL_COLOR_BUFFER_BIT;
442 } else if (type == SurfaceType::Depth) { 506 } else if (src_params.type == SurfaceType::Depth) {
443 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 507 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
444 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, src_tex, 0); 508 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
509 src_surface->Texture().handle, 0);
445 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); 510 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
446 511
447 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 512 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
448 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, dst_tex, 0); 513 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
514 dst_surface->Texture().handle, 0);
449 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); 515 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
450 516
451 buffers = GL_DEPTH_BUFFER_BIT; 517 buffers = GL_DEPTH_BUFFER_BIT;
452 } else if (type == SurfaceType::DepthStencil) { 518 } else if (src_params.type == SurfaceType::DepthStencil) {
453 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 519 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
454 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 520 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
455 src_tex, 0); 521 src_surface->Texture().handle, 0);
456 522
457 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); 523 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
458 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 524 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
459 dst_tex, 0); 525 dst_surface->Texture().handle, 0);
460 526
461 buffers = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; 527 buffers = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
462 } 528 }
463 529
464 glBlitFramebuffer(src_rect.left, src_rect.bottom, src_rect.right, src_rect.top, dst_rect.left, 530 const auto& rect{src_params.GetRect()};
465 dst_rect.bottom, dst_rect.right, dst_rect.top, buffers, 531 glBlitFramebuffer(rect.left, rect.bottom, rect.right, rect.top, rect.left, rect.bottom,
532 rect.right, rect.top, buffers,
466 buffers == GL_COLOR_BUFFER_BIT ? GL_LINEAR : GL_NEAREST); 533 buffers == GL_COLOR_BUFFER_BIT ? GL_LINEAR : GL_NEAREST);
467 534
468 return true; 535 return true;
@@ -841,9 +908,7 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface,
841 // using PBOs. The is also likely less accurate, as textures will be converted rather than 908 // using PBOs. The is also likely less accurate, as textures will be converted rather than
842 // reinterpreted. 909 // reinterpreted.
843 910
844 BlitTextures(surface->Texture().handle, params.GetRect(), new_surface->Texture().handle, 911 BlitSurface(old_surface, new_surface, read_framebuffer.handle, draw_framebuffer.handle);
845 params.GetRect(), params.type, read_framebuffer.handle,
846 draw_framebuffer.handle);
847 } else { 912 } else {
848 // When use_accurate_framebuffers setting is enabled, perform a more accurate surface copy, 913 // When use_accurate_framebuffers setting is enabled, perform a more accurate surface copy,
849 // where pixels are reinterpreted as a new format (without conversion). This code path uses 914 // where pixels are reinterpreted as a new format (without conversion). This code path uses