summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp17
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h1
-rw-r--r--src/video_core/texture_cache/surface_params.cpp2
3 files changed, 18 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index 97014a676..780526b66 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -141,6 +141,8 @@ const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType compon
141 141
142GLenum GetTextureTarget(const SurfaceTarget& target) { 142GLenum GetTextureTarget(const SurfaceTarget& target) {
143 switch (target) { 143 switch (target) {
144 case SurfaceTarget::TextureBuffer:
145 return GL_TEXTURE_BUFFER;
144 case SurfaceTarget::Texture1D: 146 case SurfaceTarget::Texture1D:
145 return GL_TEXTURE_1D; 147 return GL_TEXTURE_1D;
146 case SurfaceTarget::Texture2D: 148 case SurfaceTarget::Texture2D:
@@ -191,7 +193,8 @@ void ApplyTextureDefaults(const SurfaceParams& params, GLuint texture) {
191 } 193 }
192} 194}
193 195
194OGLTexture CreateTexture(const SurfaceParams& params, GLenum target, GLenum internal_format) { 196OGLTexture CreateTexture(const SurfaceParams& params, GLenum target, GLenum internal_format,
197 OGLBuffer& texture_buffer) {
195 OGLTexture texture; 198 OGLTexture texture;
196 texture.Create(target); 199 texture.Create(target);
197 200
@@ -199,6 +202,11 @@ OGLTexture CreateTexture(const SurfaceParams& params, GLenum target, GLenum inte
199 case SurfaceTarget::Texture1D: 202 case SurfaceTarget::Texture1D:
200 glTextureStorage1D(texture.handle, params.emulated_levels, internal_format, params.width); 203 glTextureStorage1D(texture.handle, params.emulated_levels, internal_format, params.width);
201 break; 204 break;
205 case SurfaceTarget::TextureBuffer:
206 texture_buffer.Create();
207 glNamedBufferStorage(texture_buffer.handle, params.width * params.GetBytesPerPixel(),
208 nullptr, GL_DYNAMIC_STORAGE_BIT);
209 glTextureBuffer(texture.handle, internal_format, texture_buffer.handle);
202 case SurfaceTarget::Texture2D: 210 case SurfaceTarget::Texture2D:
203 case SurfaceTarget::TextureCubemap: 211 case SurfaceTarget::TextureCubemap:
204 glTextureStorage2D(texture.handle, params.emulated_levels, internal_format, params.width, 212 glTextureStorage2D(texture.handle, params.emulated_levels, internal_format, params.width,
@@ -229,7 +237,7 @@ CachedSurface::CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& param
229 type = tuple.type; 237 type = tuple.type;
230 is_compressed = tuple.compressed; 238 is_compressed = tuple.compressed;
231 target = GetTextureTarget(params.target); 239 target = GetTextureTarget(params.target);
232 texture = CreateTexture(params, target, internal_format); 240 texture = CreateTexture(params, target, internal_format, texture_buffer);
233 DecorateSurfaceName(); 241 DecorateSurfaceName();
234 main_view = CreateViewInner( 242 main_view = CreateViewInner(
235 ViewParams(params.target, 0, params.is_layered ? params.depth : 1, 0, params.num_levels), 243 ViewParams(params.target, 0, params.is_layered ? params.depth : 1, 0, params.num_levels),
@@ -316,6 +324,11 @@ void CachedSurface::UploadTextureMipmap(u32 level, std::vector<u8>& staging_buff
316 glTextureSubImage1D(texture.handle, level, 0, params.GetMipWidth(level), format, type, 324 glTextureSubImage1D(texture.handle, level, 0, params.GetMipWidth(level), format, type,
317 buffer); 325 buffer);
318 break; 326 break;
327 case SurfaceTarget::TextureBuffer:
328 ASSERT(level == 0);
329 glNamedBufferSubData(texture_buffer.handle, 0,
330 params.GetMipWidth(level) * params.GetBytesPerPixel(), buffer);
331 break;
319 case SurfaceTarget::Texture1DArray: 332 case SurfaceTarget::Texture1DArray:
320 case SurfaceTarget::Texture2D: 333 case SurfaceTarget::Texture2D:
321 glTextureSubImage2D(texture.handle, level, 0, 0, params.GetMipWidth(level), 334 glTextureSubImage2D(texture.handle, level, 0, 0, params.GetMipWidth(level),
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index d4c6e9a30..e7cc66fbb 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -67,6 +67,7 @@ private:
67 u32 view_count{}; 67 u32 view_count{};
68 68
69 OGLTexture texture; 69 OGLTexture texture;
70 OGLBuffer texture_buffer;
70}; 71};
71 72
72class CachedSurfaceView final : public VideoCommon::ViewBase { 73class CachedSurfaceView final : public VideoCommon::ViewBase {
diff --git a/src/video_core/texture_cache/surface_params.cpp b/src/video_core/texture_cache/surface_params.cpp
index 340ed2ca0..9c56e2b4f 100644
--- a/src/video_core/texture_cache/surface_params.cpp
+++ b/src/video_core/texture_cache/surface_params.cpp
@@ -310,6 +310,8 @@ std::string SurfaceParams::TargetName() const {
310 switch (target) { 310 switch (target) {
311 case SurfaceTarget::Texture1D: 311 case SurfaceTarget::Texture1D:
312 return "1D"; 312 return "1D";
313 case SurfaceTarget::TextureBuffer:
314 return "TexBuffer";
313 case SurfaceTarget::Texture2D: 315 case SurfaceTarget::Texture2D:
314 return "2D"; 316 return "2D";
315 case SurfaceTarget::Texture3D: 317 case SurfaceTarget::Texture3D: