mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-01-08 08:00:44 +01:00
implement texture view & fix: crashes
This commit is contained in:
parent
98370260d3
commit
6db893c446
@ -532,6 +532,8 @@ if(ENABLE_METAL)
|
||||
HW/Latte/Renderer/Metal/MetalCppImpl.cpp
|
||||
HW/Latte/Renderer/Metal/LatteTextureMtl.cpp
|
||||
HW/Latte/Renderer/Metal/LatteTextureMtl.h
|
||||
HW/Latte/Renderer/Metal/LatteTextureViewMtl.cpp
|
||||
HW/Latte/Renderer/Metal/LatteTextureViewMtl.h
|
||||
)
|
||||
|
||||
#target_link_libraries(CemuCafe PRIVATE
|
||||
|
@ -978,7 +978,8 @@ void LatteRenderTarget_copyToBackbuffer(LatteTextureView* textureView, bool isPa
|
||||
filter = LatteTextureView::MagFilter::kNearestNeighbor;
|
||||
}
|
||||
}
|
||||
cemu_assert(shader);
|
||||
// HACK: comment out the assert
|
||||
//cemu_assert(shader);
|
||||
g_renderer->DrawBackbufferQuad(textureView, shader, filter==LatteTextureView::MagFilter::kLinear, imageX, imageY, imageWidth, imageHeight, isPadView, clearBackground);
|
||||
g_renderer->HandleScreenshotRequest(textureView, isPadView);
|
||||
if (!g_renderer->ImguiBegin(!isPadView))
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureMtl.h"
|
||||
//#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
||||
|
||||
LatteTextureMtl::LatteTextureMtl(class MetalRenderer* mtlRenderer, Latte::E_DIM dim, MPTR physAddress, MPTR physMipAddress, Latte::E_GX2SURFFMT format, uint32 width, uint32 height, uint32 depth, uint32 pitch, uint32 mipLevels, uint32 swizzle,
|
||||
@ -80,10 +80,7 @@ LatteTextureView* LatteTextureMtl::CreateView(Latte::E_DIM dim, Latte::E_GX2SURF
|
||||
cemu_assert_debug((firstMip + mipCount) <= this->mipLevels);
|
||||
cemu_assert_debug((firstSlice + sliceCount) <= this->depth);
|
||||
|
||||
//return new LatteTextureViewMtl(m_mtlr, this, dim, format, firstMip, mipCount, firstSlice, sliceCount);
|
||||
cemuLog_logDebug(LogType::Force, "not implemented");
|
||||
|
||||
return nullptr;
|
||||
return new LatteTextureViewMtl(m_mtlr, this, dim, format, firstMip, mipCount, firstSlice, sliceCount);
|
||||
}
|
||||
|
||||
void LatteTextureMtl::AllocateOnHost()
|
||||
|
@ -10,9 +10,12 @@ class LatteTextureMtl : public LatteTexture
|
||||
public:
|
||||
LatteTextureMtl(class MetalRenderer* vkRenderer, Latte::E_DIM dim, MPTR physAddress, MPTR physMipAddress, Latte::E_GX2SURFFMT format, uint32 width, uint32 height, uint32 depth, uint32 pitch, uint32 mipLevels,
|
||||
uint32 swizzle, Latte::E_HWTILEMODE tileMode, bool isDepth);
|
||||
|
||||
~LatteTextureMtl();
|
||||
|
||||
MTL::Texture* GetTexture() const {
|
||||
return m_texture;
|
||||
}
|
||||
|
||||
void AllocateOnHost() override;
|
||||
|
||||
protected:
|
||||
|
56
src/Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.cpp
Normal file
56
src/Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
||||
|
||||
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)
|
||||
{
|
||||
// TODO: don't hardcode the format
|
||||
MTL::PixelFormat pixelFormat = MTL::PixelFormatRGBA8Unorm;
|
||||
MTL::TextureType textureType;
|
||||
switch (dim)
|
||||
{
|
||||
case Latte::E_DIM::DIM_1D:
|
||||
textureType = MTL::TextureType1D;
|
||||
case Latte::E_DIM::DIM_2D:
|
||||
case Latte::E_DIM::DIM_2D_MSAA:
|
||||
textureType = MTL::TextureType2D;
|
||||
case Latte::E_DIM::DIM_2D_ARRAY:
|
||||
textureType = MTL::TextureType2DArray;
|
||||
case Latte::E_DIM::DIM_3D:
|
||||
textureType = MTL::TextureType3D;
|
||||
case Latte::E_DIM::DIM_CUBEMAP:
|
||||
textureType = MTL::TextureTypeCube; // TODO: check this
|
||||
default:
|
||||
cemu_assert_unimplemented();
|
||||
textureType = MTL::TextureType2D;
|
||||
}
|
||||
|
||||
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);
|
||||
// TODO: uncomment
|
||||
//cemu_assert_debug(this->numSlice == baseTexture->depth);
|
||||
baseLayer = 0;
|
||||
layerCount = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
baseLayer = firstSlice;
|
||||
layerCount = this->numSlice;
|
||||
}
|
||||
|
||||
// TODO: swizzle
|
||||
|
||||
m_texture = texture->GetTexture()->newTextureView(pixelFormat, textureType, NS::Range::Make(baseLevel, levelCount), NS::Range::Make(baseLayer, layerCount));
|
||||
}
|
||||
|
||||
LatteTextureViewMtl::~LatteTextureViewMtl()
|
||||
{
|
||||
m_texture->release();
|
||||
}
|
21
src/Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h
Normal file
21
src/Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include <Metal/Metal.hpp>
|
||||
|
||||
#include "Cafe/HW/Latte/Core/LatteTexture.h"
|
||||
|
||||
class LatteTextureViewMtl : public LatteTextureView
|
||||
{
|
||||
public:
|
||||
LatteTextureViewMtl(class MetalRenderer* mtlRenderer, class LatteTextureMtl* texture, Latte::E_DIM dim, Latte::E_GX2SURFFMT format, sint32 firstMip, sint32 mipCount, sint32 firstSlice, sint32 sliceCount);
|
||||
~LatteTextureViewMtl();
|
||||
|
||||
MTL::Texture* GetTexture() const {
|
||||
return m_texture;
|
||||
}
|
||||
|
||||
private:
|
||||
class MetalRenderer* m_mtlr;
|
||||
|
||||
MTL::Texture* m_texture;
|
||||
};
|
Loading…
Reference in New Issue
Block a user