summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp37
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h3
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp1
-rw-r--r--src/video_core/surface.cpp4
-rw-r--r--src/video_core/surface.h1
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
475bool RendererOpenGL::Init() { 474bool 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
37bool SurfaceTargetIsLayered(SurfaceTarget target) { 37bool 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) {
55bool SurfaceTargetIsArray(SurfaceTarget target) { 56bool 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
115enum class SurfaceTarget { 115enum class SurfaceTarget {
116 Texture1D, 116 Texture1D,
117 TextureBuffer,
117 Texture2D, 118 Texture2D,
118 Texture3D, 119 Texture3D,
119 Texture1DArray, 120 Texture1DArray,