mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-01-09 08:29:21 +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/MetalCppImpl.cpp
|
||||||
HW/Latte/Renderer/Metal/LatteTextureMtl.cpp
|
HW/Latte/Renderer/Metal/LatteTextureMtl.cpp
|
||||||
HW/Latte/Renderer/Metal/LatteTextureMtl.h
|
HW/Latte/Renderer/Metal/LatteTextureMtl.h
|
||||||
|
HW/Latte/Renderer/Metal/LatteTextureViewMtl.cpp
|
||||||
|
HW/Latte/Renderer/Metal/LatteTextureViewMtl.h
|
||||||
)
|
)
|
||||||
|
|
||||||
#target_link_libraries(CemuCafe PRIVATE
|
#target_link_libraries(CemuCafe PRIVATE
|
||||||
|
@ -978,7 +978,8 @@ void LatteRenderTarget_copyToBackbuffer(LatteTextureView* textureView, bool isPa
|
|||||||
filter = LatteTextureView::MagFilter::kNearestNeighbor;
|
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->DrawBackbufferQuad(textureView, shader, filter==LatteTextureView::MagFilter::kLinear, imageX, imageY, imageWidth, imageHeight, isPadView, clearBackground);
|
||||||
g_renderer->HandleScreenshotRequest(textureView, isPadView);
|
g_renderer->HandleScreenshotRequest(textureView, isPadView);
|
||||||
if (!g_renderer->ImguiBegin(!isPadView))
|
if (!g_renderer->ImguiBegin(!isPadView))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureMtl.h"
|
#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"
|
#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,
|
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((firstMip + mipCount) <= this->mipLevels);
|
||||||
cemu_assert_debug((firstSlice + sliceCount) <= this->depth);
|
cemu_assert_debug((firstSlice + sliceCount) <= this->depth);
|
||||||
|
|
||||||
//return new LatteTextureViewMtl(m_mtlr, this, dim, format, firstMip, mipCount, firstSlice, sliceCount);
|
return new LatteTextureViewMtl(m_mtlr, this, dim, format, firstMip, mipCount, firstSlice, sliceCount);
|
||||||
cemuLog_logDebug(LogType::Force, "not implemented");
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LatteTextureMtl::AllocateOnHost()
|
void LatteTextureMtl::AllocateOnHost()
|
||||||
|
@ -10,9 +10,12 @@ class LatteTextureMtl : public LatteTexture
|
|||||||
public:
|
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,
|
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);
|
uint32 swizzle, Latte::E_HWTILEMODE tileMode, bool isDepth);
|
||||||
|
|
||||||
~LatteTextureMtl();
|
~LatteTextureMtl();
|
||||||
|
|
||||||
|
MTL::Texture* GetTexture() const {
|
||||||
|
return m_texture;
|
||||||
|
}
|
||||||
|
|
||||||
void AllocateOnHost() override;
|
void AllocateOnHost() override;
|
||||||
|
|
||||||
protected:
|
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…
x
Reference in New Issue
Block a user