TextureCache: Split efb2ram from efb2tex

This commit is contained in:
degasus 2015-10-29 17:48:35 +01:00
parent d7d8704353
commit dcdf8fd3ce
7 changed files with 54 additions and 23 deletions

View File

@ -236,11 +236,13 @@ void TextureCache::TCacheEntry::FromRenderTarget(u8* dst, unsigned int dstFormat
D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV()); D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
}
if (g_ActiveConfig.bSkipEFBCopyToRam) void TextureCache::CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
this->Zero(dst); PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
else bool isIntensity, bool scaleByHalf)
g_encoder->Encode(dst, format, native_width, BytesPerRow(), NumBlocksY(), memory_stride, srcFormat, srcRect, isIntensity, scaleByHalf); {
g_encoder->Encode(dst, format, native_width, bytes_per_row, num_blocks_y, memory_stride, srcFormat, srcRect, isIntensity, scaleByHalf);
} }
const char palette_shader[] = const char palette_shader[] =

View File

@ -49,6 +49,10 @@ private:
void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override; void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override;
void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
bool isIntensity, bool scaleByHalf) override;
void CompileShaders() override { } void CompileShaders() override { }
void DeleteShaders() override { } void DeleteShaders() override { }

View File

@ -26,7 +26,7 @@ public:
virtual void Init() = 0; virtual void Init() = 0;
virtual void Shutdown() = 0; virtual void Shutdown() = 0;
// Returns size in bytes of encoded block of memory // Returns size in bytes of encoded block of memory
virtual void Encode(u8* dst, const TextureCacheBase::TCacheEntryBase* texture_entry, virtual void Encode(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect, PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
bool isIntensity, bool scaleByHalf) = 0; bool isIntensity, bool scaleByHalf) = 0;

View File

@ -266,25 +266,23 @@ void TextureCache::TCacheEntry::FromRenderTarget(u8* dstPointer, unsigned int ds
FramebufferManager::SetFramebuffer(0); FramebufferManager::SetFramebuffer(0);
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
}
if (g_ActiveConfig.bSkipEFBCopyToRam) void TextureCache::CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
{ PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
this->Zero(dstPointer); bool isIntensity, bool scaleByHalf)
} {
else TextureConverter::EncodeToRamFromTexture(
{ dst,
TextureConverter::EncodeToRamFromTexture( format,
dstPointer, native_width,
format, bytes_per_row,
native_width, num_blocks_y,
BytesPerRow(), memory_stride,
NumBlocksY(), srcFormat,
memory_stride, isIntensity,
srcFormat, scaleByHalf,
isIntensity, srcRect);
scaleByHalf,
srcRect);
}
} }
TextureCache::TextureCache() TextureCache::TextureCache()

View File

@ -56,6 +56,10 @@ private:
TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) override; TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) override;
void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override; void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override;
void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
bool isIntensity, bool scaleByHalf) override;
void CompileShaders() override; void CompileShaders() override;
void DeleteShaders() override; void DeleteShaders() override;
}; };

View File

@ -1050,6 +1050,25 @@ void TextureCacheBase::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFo
entry->FromRenderTarget(dst, dstFormat, dstStride, srcFormat, srcRect, isIntensity, scaleByHalf, cbufid, colmat); entry->FromRenderTarget(dst, dstFormat, dstStride, srcFormat, srcRect, isIntensity, scaleByHalf, cbufid, colmat);
if (g_ActiveConfig.bSkipEFBCopyToRam)
{
entry->Zero(dst);
}
else
{
g_texture_cache->CopyEFB(
dst,
entry->format,
entry->native_width,
entry->BytesPerRow(),
entry->NumBlocksY(),
entry->memory_stride,
srcFormat,
srcRect,
isIntensity,
scaleByHalf);
}
u64 hash = entry->CalculateHash(); u64 hash = entry->CalculateHash();
entry->SetHashes(hash, hash); entry->SetHashes(hash, hash);

View File

@ -130,6 +130,10 @@ public:
virtual TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) = 0; virtual TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) = 0;
virtual void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
bool isIntensity, bool scaleByHalf) = 0;
virtual void CompileShaders() = 0; // currently only implemented by OGL virtual void CompileShaders() = 0; // currently only implemented by OGL
virtual void DeleteShaders() = 0; // currently only implemented by OGL virtual void DeleteShaders() = 0; // currently only implemented by OGL