TextureCache: Move EFB copy cache code from TextureConverter to TextureCache
This commit is contained in:
parent
a02df43e6d
commit
cc54ee7d94
|
@ -149,17 +149,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
if (!g_ActiveConfig.bCopyEFBToTexture)
|
if (!g_ActiveConfig.bCopyEFBToTexture)
|
||||||
{
|
{
|
||||||
u8* dst = Memory::GetPointer(dstAddr);
|
u8* dst = Memory::GetPointer(dstAddr);
|
||||||
size_t encodeSize = g_encoder->Encode(dst, dstFormat, srcFormat, srcRect, isIntensity, scaleByHalf);
|
size_t encoded_size = g_encoder->Encode(dst, dstFormat, srcFormat, srcRect, isIntensity, scaleByHalf);
|
||||||
hash = GetHash64(dst, encodeSize, g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
|
||||||
if (g_ActiveConfig.bEFBCopyCacheEnable)
|
|
||||||
{
|
|
||||||
// If the texture in RAM is already in the texture cache,
|
|
||||||
// do not copy it again as it has not changed.
|
|
||||||
if (TextureCache::Find(dstAddr, hash))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureCache::MakeRangeDynamic(dstAddr, encodeSize);
|
hash = GetHash64(dst, (int)encoded_size, g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
||||||
|
|
||||||
|
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
|
||||||
|
if (!g_ActiveConfig.bEFBCopyCacheEnable)
|
||||||
|
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
|
||||||
|
else if (!TextureCache::Find(addr, hash))
|
||||||
|
TextureCache::MakeRangeDynamic(addr, (u32)encoded_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "Statistics.h"
|
#include "Statistics.h"
|
||||||
#include "MemoryUtil.h"
|
#include "MemoryUtil.h"
|
||||||
#include "Hash.h"
|
#include "Hash.h"
|
||||||
|
#include "HW/Memmap.h"
|
||||||
|
|
||||||
#include "CommonPaths.h"
|
#include "CommonPaths.h"
|
||||||
#include "FileUtil.h"
|
#include "FileUtil.h"
|
||||||
|
@ -143,16 +144,25 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
|
|
||||||
if (!g_ActiveConfig.bCopyEFBToTexture)
|
if (!g_ActiveConfig.bCopyEFBToTexture)
|
||||||
{
|
{
|
||||||
hash = TextureConverter::EncodeToRamFromTexture(
|
int encoded_size = TextureConverter::EncodeToRamFromTexture(
|
||||||
addr,
|
addr,
|
||||||
read_texture,
|
read_texture,
|
||||||
Renderer::GetTargetWidth(),
|
Renderer::GetTargetWidth(),
|
||||||
Renderer::GetTargetHeight(),
|
Renderer::GetTargetHeight(),
|
||||||
srcFormat == PIXELFMT_Z24,
|
srcFormat == PIXELFMT_Z24,
|
||||||
isIntensity,
|
isIntensity,
|
||||||
dstFormat,
|
dstFormat,
|
||||||
scaleByHalf,
|
scaleByHalf,
|
||||||
srcRect);
|
srcRect);
|
||||||
|
|
||||||
|
u8* dst = Memory::GetPointer(addr);
|
||||||
|
hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
||||||
|
|
||||||
|
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
|
||||||
|
if (!g_ActiveConfig.bEFBCopyCacheEnable)
|
||||||
|
TextureCache::MakeRangeDynamic(addr,encoded_size);
|
||||||
|
else if (!TextureCache::Find(addr, hash))
|
||||||
|
TextureCache::MakeRangeDynamic(addr,encoded_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
||||||
|
|
|
@ -252,10 +252,10 @@ void EncodeToRamUsingShader(LPDIRECT3DPIXELSHADER9 shader, LPDIRECT3DTEXTURE9 sr
|
||||||
|
|
||||||
s_texConvReadSurface = TrnBuffers[index].ReadSurface;
|
s_texConvReadSurface = TrnBuffers[index].ReadSurface;
|
||||||
Rendersurf = TrnBuffers[index].RenderSurface;
|
Rendersurf = TrnBuffers[index].RenderSurface;
|
||||||
|
|
||||||
hr = D3D::dev->SetDepthStencilSurface(NULL);
|
hr = D3D::dev->SetDepthStencilSurface(NULL);
|
||||||
hr = D3D::dev->SetRenderTarget(0, Rendersurf);
|
hr = D3D::dev->SetRenderTarget(0, Rendersurf);
|
||||||
|
|
||||||
if (linearFilter)
|
if (linearFilter)
|
||||||
{
|
{
|
||||||
D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
||||||
|
@ -290,7 +290,7 @@ void EncodeToRamUsingShader(LPDIRECT3DPIXELSHADER9 shader, LPDIRECT3DTEXTURE9 sr
|
||||||
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
||||||
// .. and then read back the results.
|
// .. and then read back the results.
|
||||||
// TODO: make this less slow.
|
// TODO: make this less slow.
|
||||||
|
|
||||||
hr = D3D::dev->GetRenderTargetData(Rendersurf,s_texConvReadSurface);
|
hr = D3D::dev->GetRenderTargetData(Rendersurf,s_texConvReadSurface);
|
||||||
|
|
||||||
D3DLOCKED_RECT drect;
|
D3DLOCKED_RECT drect;
|
||||||
|
@ -313,7 +313,7 @@ void EncodeToRamUsingShader(LPDIRECT3DPIXELSHADER9 shader, LPDIRECT3DTEXTURE9 sr
|
||||||
hr = s_texConvReadSurface->UnlockRect();
|
hr = s_texConvReadSurface->UnlockRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source)
|
int EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source)
|
||||||
{
|
{
|
||||||
u32 format = copyfmt;
|
u32 format = copyfmt;
|
||||||
|
|
||||||
|
@ -371,16 +371,7 @@ u64 EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 So
|
||||||
|
|
||||||
int readStride = (expandedWidth * cacheBytes) / TexDecoder_GetBlockWidthInTexels(format);
|
int readStride = (expandedWidth * cacheBytes) / TexDecoder_GetBlockWidthInTexels(format);
|
||||||
EncodeToRamUsingShader(texconv_shader, source_texture, scaledSource, dest_ptr, expandedWidth / samples, expandedHeight, readStride, true, bScaleByHalf > 0,1.0f);
|
EncodeToRamUsingShader(texconv_shader, source_texture, scaledSource, dest_ptr, expandedWidth / samples, expandedHeight, readStride, true, bScaleByHalf > 0,1.0f);
|
||||||
u64 hash = GetHash64(dest_ptr,size_in_bytes,g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
return size_in_bytes; // TODO: D3D11 is calculating this value differently!
|
||||||
if (g_ActiveConfig.bEFBCopyCacheEnable)
|
|
||||||
{
|
|
||||||
// If the texture in RAM is already in the texture cache, do not copy it again as it has not changed.
|
|
||||||
if (TextureCache::Find(address, hash))
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureCache::MakeRangeDynamic(address,size_in_bytes);
|
|
||||||
return hash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EncodeToRamYUYV(LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight,float Gamma)
|
void EncodeToRamYUYV(LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight,float Gamma)
|
||||||
|
@ -421,7 +412,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE
|
||||||
destTexture->GetSurfaceLevel(0,&Rendersurf);
|
destTexture->GetSurfaceLevel(0,&Rendersurf);
|
||||||
D3D::dev->SetDepthStencilSurface(NULL);
|
D3D::dev->SetDepthStencilSurface(NULL);
|
||||||
D3D::dev->SetRenderTarget(0, Rendersurf);
|
D3D::dev->SetRenderTarget(0, Rendersurf);
|
||||||
|
|
||||||
D3DVIEWPORT9 vp;
|
D3DVIEWPORT9 vp;
|
||||||
|
|
||||||
// Stretch picture with increased internal resolution
|
// Stretch picture with increased internal resolution
|
||||||
|
|
|
@ -40,7 +40,8 @@ void EncodeToRamYUYV(LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourc
|
||||||
|
|
||||||
void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE9 destTexture);
|
void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE9 destTexture);
|
||||||
|
|
||||||
u64 EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source);
|
// returns size of the encoded data (in bytes)
|
||||||
|
int EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "Hash.h"
|
#include "Hash.h"
|
||||||
#include "HiresTextures.h"
|
#include "HiresTextures.h"
|
||||||
|
#include "HW/Memmap.h"
|
||||||
#include "ImageWrite.h"
|
#include "ImageWrite.h"
|
||||||
#include "MemoryUtil.h"
|
#include "MemoryUtil.h"
|
||||||
#include "PixelShaderCache.h"
|
#include "PixelShaderCache.h"
|
||||||
|
@ -317,7 +318,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
|
|
||||||
if (false == g_ActiveConfig.bCopyEFBToTexture)
|
if (false == g_ActiveConfig.bCopyEFBToTexture)
|
||||||
{
|
{
|
||||||
hash = TextureConverter::EncodeToRamFromTexture(
|
int encoded_size = TextureConverter::EncodeToRamFromTexture(
|
||||||
addr,
|
addr,
|
||||||
read_texture,
|
read_texture,
|
||||||
srcFormat == PIXELFMT_Z24,
|
srcFormat == PIXELFMT_Z24,
|
||||||
|
@ -325,6 +326,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
dstFormat,
|
dstFormat,
|
||||||
scaleByHalf,
|
scaleByHalf,
|
||||||
srcRect);
|
srcRect);
|
||||||
|
|
||||||
|
u8* dst = Memory::GetPointer(addr);
|
||||||
|
hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
||||||
|
|
||||||
|
// Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date
|
||||||
|
if (!g_ActiveConfig.bEFBCopyCacheEnable)
|
||||||
|
TextureCache::MakeRangeDynamic(addr,encoded_size);
|
||||||
|
else if (!TextureCache::Find(addr, hash))
|
||||||
|
TextureCache::MakeRangeDynamic(addr,encoded_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
FramebufferManager::SetFramebuffer(0);
|
FramebufferManager::SetFramebuffer(0);
|
||||||
|
|
|
@ -250,7 +250,7 @@ void EncodeToRamUsingShader(FRAGMENTSHADER& shader, GLuint srcTexture, const Tar
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source)
|
int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source)
|
||||||
{
|
{
|
||||||
u32 format = copyfmt;
|
u32 format = copyfmt;
|
||||||
|
|
||||||
|
@ -308,19 +308,8 @@ u64 EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer,
|
||||||
EncodeToRamUsingShader(texconv_shader, source_texture, scaledSource,
|
EncodeToRamUsingShader(texconv_shader, source_texture, scaledSource,
|
||||||
dest_ptr, expandedWidth / samples, expandedHeight, readStride,
|
dest_ptr, expandedWidth / samples, expandedHeight, readStride,
|
||||||
true, bScaleByHalf > 0 && !bFromZBuffer);
|
true, bScaleByHalf > 0 && !bFromZBuffer);
|
||||||
|
return size_in_bytes; // TODO: D3D11 is calculating this value differently!
|
||||||
|
|
||||||
u64 hash = GetHash64(dest_ptr, size_in_bytes,
|
|
||||||
g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
|
||||||
if (g_ActiveConfig.bEFBCopyCacheEnable)
|
|
||||||
{
|
|
||||||
// If the texture in RAM is already in the texture cache,
|
|
||||||
// do not copy it again as it has not changed.
|
|
||||||
if (TextureCache::Find(address, hash))
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureCache::MakeRangeDynamic(address,size_in_bytes);
|
|
||||||
return hash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight)
|
void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight)
|
||||||
|
|
|
@ -37,7 +37,8 @@ void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc,
|
||||||
|
|
||||||
void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTexture);
|
void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTexture);
|
||||||
|
|
||||||
u64 EncodeToRamFromTexture(u32 address, GLuint source_texture, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source);
|
// returns size of the encoded data (in bytes)
|
||||||
|
int EncodeToRamFromTexture(u32 address, GLuint source_texture, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue