mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-08 07:51:19 +12:00
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
|
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureMtl.h"
|
|
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
|
#include "Cafe/HW/Latte/Renderer/Metal/LatteToMtl.h"
|
|
#include "Metal/MTLTexture.hpp"
|
|
|
|
LatteTextureViewMtl::LatteTextureViewMtl(MetalRenderer* mtlRenderer, LatteTextureMtl* texture, Latte::E_DIM dim, Latte::E_GX2SURFFMT format, sint32 firstMip, sint32 mipCount, sint32 firstSlice, sint32 sliceCount)
|
|
: LatteTextureView(texture, firstMip, mipCount, firstSlice, sliceCount, dim, format), m_mtlr(mtlRenderer), m_format(format)
|
|
{
|
|
MTL::TextureType textureType;
|
|
switch (dim)
|
|
{
|
|
case Latte::E_DIM::DIM_1D:
|
|
textureType = MTL::TextureType1D;
|
|
break;
|
|
case Latte::E_DIM::DIM_2D:
|
|
case Latte::E_DIM::DIM_2D_MSAA:
|
|
textureType = MTL::TextureType2D;
|
|
break;
|
|
case Latte::E_DIM::DIM_2D_ARRAY:
|
|
textureType = MTL::TextureType2DArray;
|
|
break;
|
|
case Latte::E_DIM::DIM_3D:
|
|
textureType = MTL::TextureType3D;
|
|
break;
|
|
case Latte::E_DIM::DIM_CUBEMAP:
|
|
textureType = MTL::TextureTypeCube; // TODO: check this
|
|
break;
|
|
default:
|
|
cemu_assert_unimplemented();
|
|
textureType = MTL::TextureType2D;
|
|
break;
|
|
}
|
|
|
|
uint32 baseLevel = firstMip;
|
|
uint32 levelCount = this->numMip;
|
|
uint32 baseLayer;
|
|
uint32 layerCount;
|
|
// TODO: check if base texture is 3D texture as well
|
|
if (textureType == MTL::TextureType3D)
|
|
{
|
|
cemu_assert_debug(firstMip == 0);
|
|
cemu_assert_debug(this->numSlice == baseTexture->depth);
|
|
baseLayer = 0;
|
|
layerCount = 1;
|
|
}
|
|
else
|
|
{
|
|
baseLayer = firstSlice;
|
|
layerCount = this->numSlice;
|
|
}
|
|
|
|
// TODO: swizzle
|
|
|
|
auto formatInfo = GetMtlPixelFormatInfo(format, texture->IsDepth());
|
|
m_texture = texture->GetTexture()->newTextureView(formatInfo.pixelFormat, textureType, NS::Range::Make(baseLevel, levelCount), NS::Range::Make(baseLayer, layerCount));
|
|
}
|
|
|
|
LatteTextureViewMtl::~LatteTextureViewMtl()
|
|
{
|
|
m_texture->release();
|
|
}
|