diff options
| author | 2019-07-04 19:38:19 -0400 | |
|---|---|---|
| committer | 2019-07-04 19:38:19 -0400 | |
| commit | 30b176f92b67ec7a9b1ce08cf89d50abd125f8a8 (patch) | |
| tree | 2ee13e6215101a3abe1f0517ae92608070e3941e /src | |
| parent | texture_cache: Pack sibling queries inside a method (diff) | |
| download | yuzu-30b176f92b67ec7a9b1ce08cf89d50abd125f8a8.tar.gz yuzu-30b176f92b67ec7a9b1ce08cf89d50abd125f8a8.tar.xz yuzu-30b176f92b67ec7a9b1ce08cf89d50abd125f8a8.zip | |
texture_cache: Correct Texture Buffer Uploading
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.h | 1 | ||||
| -rw-r--r-- | src/video_core/texture_cache/surface_params.cpp | 2 |
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 | ||
| 142 | GLenum GetTextureTarget(const SurfaceTarget& target) { | 142 | GLenum 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 | ||
| 194 | OGLTexture CreateTexture(const SurfaceParams& params, GLenum target, GLenum internal_format) { | 196 | OGLTexture 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 | ||
| 72 | class CachedSurfaceView final : public VideoCommon::ViewBase { | 73 | class 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: |