diff options
| author | 2019-04-28 18:03:41 -0300 | |
|---|---|---|
| committer | 2019-06-20 21:36:12 -0300 | |
| commit | 07f7ce1da2e86e862b1254a5f543af5ae76d1b43 (patch) | |
| tree | 88b1890a2ffb2e1f4c29fb72eeb46fdfa3f91be9 /src | |
| parent | maxwell_3d: Partially implement texture buffers as 1D textures (diff) | |
| download | yuzu-07f7ce1da2e86e862b1254a5f543af5ae76d1b43.tar.gz yuzu-07f7ce1da2e86e862b1254a5f543af5ae76d1b43.tar.xz yuzu-07f7ce1da2e86e862b1254a5f543af5ae76d1b43.zip | |
gl_rasterizer_cache: Use texture buffers to emulate texture buffers
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 37 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/surface.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/surface.h | 1 |
5 files changed, 35 insertions, 11 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 543b36271..e27da1fa7 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | |||
| @@ -149,6 +149,7 @@ std::size_t SurfaceParams::InnerMemorySize(bool force_gl, bool layer_only, | |||
| 149 | 149 | ||
| 150 | switch (params.target) { | 150 | switch (params.target) { |
| 151 | case SurfaceTarget::Texture1D: | 151 | case SurfaceTarget::Texture1D: |
| 152 | case SurfaceTarget::TextureBuffer: | ||
| 152 | case SurfaceTarget::Texture2D: | 153 | case SurfaceTarget::Texture2D: |
| 153 | params.depth = 1; | 154 | params.depth = 1; |
| 154 | break; | 155 | break; |
| @@ -389,6 +390,8 @@ static GLenum SurfaceTargetToGL(SurfaceTarget target) { | |||
| 389 | switch (target) { | 390 | switch (target) { |
| 390 | case SurfaceTarget::Texture1D: | 391 | case SurfaceTarget::Texture1D: |
| 391 | return GL_TEXTURE_1D; | 392 | return GL_TEXTURE_1D; |
| 393 | case SurfaceTarget::TextureBuffer: | ||
| 394 | return GL_TEXTURE_BUFFER; | ||
| 392 | case SurfaceTarget::Texture2D: | 395 | case SurfaceTarget::Texture2D: |
| 393 | return GL_TEXTURE_2D; | 396 | return GL_TEXTURE_2D; |
| 394 | case SurfaceTarget::Texture3D: | 397 | case SurfaceTarget::Texture3D: |
| @@ -600,29 +603,35 @@ CachedSurface::CachedSurface(const SurfaceParams& params) | |||
| 600 | 603 | ||
| 601 | switch (params.target) { | 604 | switch (params.target) { |
| 602 | case SurfaceTarget::Texture1D: | 605 | case SurfaceTarget::Texture1D: |
| 603 | glTextureStorage1D(texture.handle, params.max_mip_level, format_tuple.internal_format, | 606 | glTextureStorage1D(texture.handle, params.max_mip_level, gl_internal_format, width); |
| 604 | width); | 607 | break; |
| 608 | case SurfaceTarget::TextureBuffer: | ||
| 609 | texture_buffer.Create(); | ||
| 610 | glNamedBufferStorage(texture_buffer.handle, | ||
| 611 | params.width * GetBytesPerPixel(params.pixel_format), nullptr, | ||
| 612 | GL_DYNAMIC_STORAGE_BIT); | ||
| 613 | glTextureBuffer(texture.handle, gl_internal_format, texture_buffer.handle); | ||
| 605 | break; | 614 | break; |
| 606 | case SurfaceTarget::Texture2D: | 615 | case SurfaceTarget::Texture2D: |
| 607 | case SurfaceTarget::TextureCubemap: | 616 | case SurfaceTarget::TextureCubemap: |
| 608 | glTextureStorage2D(texture.handle, params.max_mip_level, format_tuple.internal_format, | 617 | glTextureStorage2D(texture.handle, params.max_mip_level, gl_internal_format, width, height); |
| 609 | width, height); | ||
| 610 | break; | 618 | break; |
| 611 | case SurfaceTarget::Texture3D: | 619 | case SurfaceTarget::Texture3D: |
| 612 | case SurfaceTarget::Texture2DArray: | 620 | case SurfaceTarget::Texture2DArray: |
| 613 | case SurfaceTarget::TextureCubeArray: | 621 | case SurfaceTarget::TextureCubeArray: |
| 614 | glTextureStorage3D(texture.handle, params.max_mip_level, format_tuple.internal_format, | 622 | glTextureStorage3D(texture.handle, params.max_mip_level, gl_internal_format, width, height, |
| 615 | width, height, params.depth); | 623 | params.depth); |
| 616 | break; | 624 | break; |
| 617 | default: | 625 | default: |
| 618 | LOG_CRITICAL(Render_OpenGL, "Unimplemented surface target={}", | 626 | LOG_CRITICAL(Render_OpenGL, "Unimplemented surface target={}", |
| 619 | static_cast<u32>(params.target)); | 627 | static_cast<u32>(params.target)); |
| 620 | UNREACHABLE(); | 628 | UNREACHABLE(); |
| 621 | glTextureStorage2D(texture.handle, params.max_mip_level, format_tuple.internal_format, | 629 | glTextureStorage2D(texture.handle, params.max_mip_level, gl_internal_format, width, height); |
| 622 | width, height); | ||
| 623 | } | 630 | } |
| 624 | 631 | ||
| 625 | ApplyTextureDefaults(texture.handle, params.max_mip_level); | 632 | if (params.target != SurfaceTarget::TextureBuffer) { |
| 633 | ApplyTextureDefaults(texture.handle, params.max_mip_level); | ||
| 634 | } | ||
| 626 | 635 | ||
| 627 | OpenGL::LabelGLObject(GL_TEXTURE, texture.handle, params.gpu_addr, params.IdentityString()); | 636 | OpenGL::LabelGLObject(GL_TEXTURE, texture.handle, params.gpu_addr, params.IdentityString()); |
| 628 | } | 637 | } |
| @@ -785,6 +794,13 @@ void CachedSurface::UploadGLMipmapTexture(RasterizerTemporaryMemory& res_cache_t | |||
| 785 | glTextureSubImage1D(texture.handle, mip_map, x0, static_cast<GLsizei>(rect.GetWidth()), | 794 | glTextureSubImage1D(texture.handle, mip_map, x0, static_cast<GLsizei>(rect.GetWidth()), |
| 786 | tuple.format, tuple.type, &gl_buffer[mip_map][buffer_offset]); | 795 | tuple.format, tuple.type, &gl_buffer[mip_map][buffer_offset]); |
| 787 | break; | 796 | break; |
| 797 | case SurfaceTarget::TextureBuffer: | ||
| 798 | ASSERT(mip_map == 0); | ||
| 799 | glNamedBufferSubData(texture_buffer.handle, x0, | ||
| 800 | static_cast<GLsizeiptr>(rect.GetWidth()) * | ||
| 801 | GetBytesPerPixel(params.pixel_format), | ||
| 802 | &gl_buffer[mip_map][buffer_offset]); | ||
| 803 | break; | ||
| 788 | case SurfaceTarget::Texture2D: | 804 | case SurfaceTarget::Texture2D: |
| 789 | glTextureSubImage2D(texture.handle, mip_map, x0, y0, | 805 | glTextureSubImage2D(texture.handle, mip_map, x0, y0, |
| 790 | static_cast<GLsizei>(rect.GetWidth()), | 806 | static_cast<GLsizei>(rect.GetWidth()), |
| @@ -860,6 +876,9 @@ void CachedSurface::UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, | |||
| 860 | Tegra::Texture::SwizzleSource swizzle_y, | 876 | Tegra::Texture::SwizzleSource swizzle_y, |
| 861 | Tegra::Texture::SwizzleSource swizzle_z, | 877 | Tegra::Texture::SwizzleSource swizzle_z, |
| 862 | Tegra::Texture::SwizzleSource swizzle_w) { | 878 | Tegra::Texture::SwizzleSource swizzle_w) { |
| 879 | if (params.target == SurfaceTarget::TextureBuffer) { | ||
| 880 | return; | ||
| 881 | } | ||
| 863 | const GLenum new_x = MaxwellToGL::SwizzleSource(swizzle_x); | 882 | const GLenum new_x = MaxwellToGL::SwizzleSource(swizzle_x); |
| 864 | const GLenum new_y = MaxwellToGL::SwizzleSource(swizzle_y); | 883 | const GLenum new_y = MaxwellToGL::SwizzleSource(swizzle_y); |
| 865 | const GLenum new_z = MaxwellToGL::SwizzleSource(swizzle_z); | 884 | const GLenum new_z = MaxwellToGL::SwizzleSource(swizzle_z); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 6263ef3e7..bbab79575 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h | |||
| @@ -250,6 +250,8 @@ struct SurfaceParams { | |||
| 250 | switch (target) { | 250 | switch (target) { |
| 251 | case SurfaceTarget::Texture1D: | 251 | case SurfaceTarget::Texture1D: |
| 252 | return "1D"; | 252 | return "1D"; |
| 253 | case SurfaceTarget::TextureBuffer: | ||
| 254 | return "Buffer"; | ||
| 253 | case SurfaceTarget::Texture2D: | 255 | case SurfaceTarget::Texture2D: |
| 254 | return "2D"; | 256 | return "2D"; |
| 255 | case SurfaceTarget::Texture3D: | 257 | case SurfaceTarget::Texture3D: |
| @@ -439,6 +441,7 @@ private: | |||
| 439 | 441 | ||
| 440 | OGLTexture texture; | 442 | OGLTexture texture; |
| 441 | OGLTexture discrepant_view; | 443 | OGLTexture discrepant_view; |
| 444 | OGLBuffer texture_buffer; | ||
| 442 | SurfaceParams params{}; | 445 | SurfaceParams params{}; |
| 443 | GLenum gl_target{}; | 446 | GLenum gl_target{}; |
| 444 | GLenum gl_internal_format{}; | 447 | GLenum gl_internal_format{}; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index aafd6f31b..b142521ec 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -471,7 +471,6 @@ static void APIENTRY DebugHandler(GLenum source, GLenum type, GLuint id, GLenum | |||
| 471 | } | 471 | } |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | /// Initialize the renderer | ||
| 475 | bool RendererOpenGL::Init() { | 474 | bool RendererOpenGL::Init() { |
| 476 | Core::Frontend::ScopeAcquireWindowContext acquire_context{render_window}; | 475 | Core::Frontend::ScopeAcquireWindowContext acquire_context{render_window}; |
| 477 | 476 | ||
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp index 56c43af17..52a79e4a7 100644 --- a/src/video_core/surface.cpp +++ b/src/video_core/surface.cpp | |||
| @@ -13,7 +13,7 @@ SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_t | |||
| 13 | case Tegra::Texture::TextureType::Texture1D: | 13 | case Tegra::Texture::TextureType::Texture1D: |
| 14 | return SurfaceTarget::Texture1D; | 14 | return SurfaceTarget::Texture1D; |
| 15 | case Tegra::Texture::TextureType::Texture1DBuffer: | 15 | case Tegra::Texture::TextureType::Texture1DBuffer: |
| 16 | return SurfaceTarget::Texture1D; // Fixme | 16 | return SurfaceTarget::TextureBuffer; |
| 17 | case Tegra::Texture::TextureType::Texture2D: | 17 | case Tegra::Texture::TextureType::Texture2D: |
| 18 | case Tegra::Texture::TextureType::Texture2DNoMipmap: | 18 | case Tegra::Texture::TextureType::Texture2DNoMipmap: |
| 19 | return SurfaceTarget::Texture2D; | 19 | return SurfaceTarget::Texture2D; |
| @@ -37,6 +37,7 @@ SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_t | |||
| 37 | bool SurfaceTargetIsLayered(SurfaceTarget target) { | 37 | bool SurfaceTargetIsLayered(SurfaceTarget target) { |
| 38 | switch (target) { | 38 | switch (target) { |
| 39 | case SurfaceTarget::Texture1D: | 39 | case SurfaceTarget::Texture1D: |
| 40 | case SurfaceTarget::TextureBuffer: | ||
| 40 | case SurfaceTarget::Texture2D: | 41 | case SurfaceTarget::Texture2D: |
| 41 | case SurfaceTarget::Texture3D: | 42 | case SurfaceTarget::Texture3D: |
| 42 | return false; | 43 | return false; |
| @@ -55,6 +56,7 @@ bool SurfaceTargetIsLayered(SurfaceTarget target) { | |||
| 55 | bool SurfaceTargetIsArray(SurfaceTarget target) { | 56 | bool SurfaceTargetIsArray(SurfaceTarget target) { |
| 56 | switch (target) { | 57 | switch (target) { |
| 57 | case SurfaceTarget::Texture1D: | 58 | case SurfaceTarget::Texture1D: |
| 59 | case SurfaceTarget::TextureBuffer: | ||
| 58 | case SurfaceTarget::Texture2D: | 60 | case SurfaceTarget::Texture2D: |
| 59 | case SurfaceTarget::Texture3D: | 61 | case SurfaceTarget::Texture3D: |
| 60 | case SurfaceTarget::TextureCubemap: | 62 | case SurfaceTarget::TextureCubemap: |
diff --git a/src/video_core/surface.h b/src/video_core/surface.h index 5d49214e5..959504cd3 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h | |||
| @@ -114,6 +114,7 @@ enum class SurfaceType { | |||
| 114 | 114 | ||
| 115 | enum class SurfaceTarget { | 115 | enum class SurfaceTarget { |
| 116 | Texture1D, | 116 | Texture1D, |
| 117 | TextureBuffer, | ||
| 117 | Texture2D, | 118 | Texture2D, |
| 118 | Texture3D, | 119 | Texture3D, |
| 119 | Texture1DArray, | 120 | Texture1DArray, |