diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 111 |
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 | ||
| 417 | static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect, GLuint dst_tex, | 417 | static 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 |