summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-05-07 22:03:33 -0300
committerGravatar ReinUsesLisp2019-06-20 21:36:12 -0300
commit549fd18ac44c6bcefdf6584484d775f0129e3fe3 (patch)
tree2b5db68561fb1b31dc143686b2fea3f2359d4629 /src/video_core/texture_cache
parentsurface_base: Split BreakDown into layered and non-layered variants (diff)
downloadyuzu-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.h39
-rw-r--r--src/video_core/texture_cache/surface_view.h8
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 @@
13namespace VideoCommon { 13namespace VideoCommon {
14 14
15struct ViewParams { 15struct 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: