diff options
| author | 2019-05-07 22:03:33 -0300 | |
|---|---|---|
| committer | 2019-06-20 21:36:12 -0300 | |
| commit | 549fd18ac44c6bcefdf6584484d775f0129e3fe3 (patch) | |
| tree | 2b5db68561fb1b31dc143686b2fea3f2359d4629 /src/video_core/texture_cache | |
| parent | surface_base: Split BreakDown into layered and non-layered variants (diff) | |
| download | yuzu-549fd18ac44c6bcefdf6584484d775f0129e3fe3.tar.gz yuzu-549fd18ac44c6bcefdf6584484d775f0129e3fe3.tar.xz yuzu-549fd18ac44c6bcefdf6584484d775f0129e3fe3.zip | |
surface_view: Add constructor for ViewParams
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/surface_base.h | 39 | ||||
| -rw-r--r-- | src/video_core/texture_cache/surface_view.h | 8 |
2 files changed, 19 insertions, 28 deletions
diff --git a/src/video_core/texture_cache/surface_base.h b/src/video_core/texture_cache/surface_base.h index 0cfb835d9..f469ab498 100644 --- a/src/video_core/texture_cache/surface_base.h +++ b/src/video_core/texture_cache/surface_base.h | |||
| @@ -253,45 +253,30 @@ public: | |||
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | TView EmplaceOverview(const SurfaceParams& overview_params) { | 255 | TView EmplaceOverview(const SurfaceParams& overview_params) { |
| 256 | ViewParams vp{}; | 256 | const u32 num_layers{params.is_layered && !overview_params.is_layered ? 1 : params.depth}; |
| 257 | vp.base_level = 0; | 257 | const ViewParams view_params(overview_params.target, 0, num_layers, 0, params.num_levels); |
| 258 | vp.num_levels = params.num_levels; | 258 | return GetView(view_params); |
| 259 | vp.target = overview_params.target; | ||
| 260 | if (params.is_layered && !overview_params.is_layered) { | ||
| 261 | vp.base_layer = 0; | ||
| 262 | vp.num_layers = 1; | ||
| 263 | } else { | ||
| 264 | vp.base_layer = 0; | ||
| 265 | vp.num_layers = params.depth; | ||
| 266 | } | ||
| 267 | return GetView(vp); | ||
| 268 | } | 259 | } |
| 269 | 260 | ||
| 270 | std::optional<TView> EmplaceView(const SurfaceParams& view_params, const GPUVAddr view_addr) { | 261 | std::optional<TView> EmplaceView(const SurfaceParams& view_params, const GPUVAddr view_addr) { |
| 271 | if (view_addr < gpu_addr) | 262 | if (view_addr < gpu_addr || params.target == SurfaceTarget::Texture3D || |
| 272 | return {}; | ||
| 273 | if (params.target == SurfaceTarget::Texture3D || | ||
| 274 | view_params.target == SurfaceTarget::Texture3D) { | 263 | view_params.target == SurfaceTarget::Texture3D) { |
| 275 | return {}; | 264 | return {}; |
| 276 | } | 265 | } |
| 277 | const std::size_t size = view_params.GetGuestSizeInBytes(); | 266 | const std::size_t size{view_params.GetGuestSizeInBytes()}; |
| 278 | auto layer_mipmap = GetLayerMipmap(view_addr); | 267 | const auto layer_mipmap{GetLayerMipmap(view_addr)}; |
| 279 | if (!layer_mipmap) { | 268 | if (!layer_mipmap) { |
| 280 | return {}; | 269 | return {}; |
| 281 | } | 270 | } |
| 282 | const u32 layer = (*layer_mipmap).first; | 271 | const u32 layer{layer_mipmap->first}; |
| 283 | const u32 mipmap = (*layer_mipmap).second; | 272 | const u32 mipmap{layer_mipmap->second}; |
| 284 | if (GetMipmapSize(mipmap) != size) { | 273 | if (GetMipmapSize(mipmap) != size) { |
| 285 | // TODO: the view may cover many mimaps, this case can still go on | 274 | // TODO: The view may cover many mimaps, this case can still go on. |
| 275 | // This edge-case can be safely be ignored since it will just result in worse | ||
| 276 | // performance. | ||
| 286 | return {}; | 277 | return {}; |
| 287 | } | 278 | } |
| 288 | ViewParams vp{}; | 279 | return GetView(ViewParams(params.target, layer, 1, mipmap, 1)); |
| 289 | vp.base_layer = layer; | ||
| 290 | vp.num_layers = 1; | ||
| 291 | vp.base_level = mipmap; | ||
| 292 | vp.num_levels = 1; | ||
| 293 | vp.target = view_params.target; | ||
| 294 | return {GetView(vp)}; | ||
| 295 | } | 280 | } |
| 296 | 281 | ||
| 297 | TView GetMainView() const { | 282 | TView GetMainView() const { |
diff --git a/src/video_core/texture_cache/surface_view.h b/src/video_core/texture_cache/surface_view.h index c122800a6..1ef4509ce 100644 --- a/src/video_core/texture_cache/surface_view.h +++ b/src/video_core/texture_cache/surface_view.h | |||
| @@ -13,15 +13,21 @@ | |||
| 13 | namespace VideoCommon { | 13 | namespace VideoCommon { |
| 14 | 14 | ||
| 15 | struct ViewParams { | 15 | struct ViewParams { |
| 16 | ViewParams(VideoCore::Surface::SurfaceTarget target, u32 base_layer, u32 num_layers, | ||
| 17 | u32 base_level, u32 num_levels) | ||
| 18 | : target{target}, base_layer{base_layer}, num_layers{num_layers}, base_level{base_level}, | ||
| 19 | num_levels{num_levels} {} | ||
| 20 | |||
| 16 | std::size_t Hash() const; | 21 | std::size_t Hash() const; |
| 17 | 22 | ||
| 18 | bool operator==(const ViewParams& rhs) const; | 23 | bool operator==(const ViewParams& rhs) const; |
| 19 | 24 | ||
| 25 | VideoCore::Surface::SurfaceTarget target{}; | ||
| 20 | u32 base_layer{}; | 26 | u32 base_layer{}; |
| 21 | u32 num_layers{}; | 27 | u32 num_layers{}; |
| 22 | u32 base_level{}; | 28 | u32 base_level{}; |
| 23 | u32 num_levels{}; | 29 | u32 num_levels{}; |
| 24 | VideoCore::Surface::SurfaceTarget target; | 30 | |
| 25 | bool IsLayered() const { | 31 | bool IsLayered() const { |
| 26 | switch (target) { | 32 | switch (target) { |
| 27 | case VideoCore::Surface::SurfaceTarget::Texture1DArray: | 33 | case VideoCore::Surface::SurfaceTarget::Texture1DArray: |