Skip to content

Commit

Permalink
Address review comments. Make OpenGL fall back to old code.
Browse files Browse the repository at this point in the history
  • Loading branch information
magumagu committed Feb 18, 2015
1 parent 8e27fd4 commit 588d9dd
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 42 deletions.
9 changes: 8 additions & 1 deletion Source/Core/VideoBackends/D3D/TextureCache.cpp
Expand Up @@ -243,7 +243,7 @@ float4 DecodePixel_RGB565(uint val)
int r, g, b, a;
r = Convert5To8((val >> 11) & 0x1f);
g = Convert6To8((val >> 5) & 0x3f);
b = Convert5To8((val)& 0x1f);
b = Convert5To8((val) & 0x1f);
a = 0xFF;
return float4(r, g, b, a) / 255;
}
Expand All @@ -267,6 +267,11 @@ void main(
}
)HLSL";

bool TextureCache::SupportsConvertTexture()
{
return true;
}

void TextureCache::ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format)
{
g_renderer->ResetAPIState();
Expand All @@ -280,6 +285,7 @@ void TextureCache::ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* uncon

D3D::stateman->SetTexture(1, palette_buf_srv);

// TODO: Add support for C14X2 format. (Different multiplier, more palette entries.)
float params[4] = { unconverted->format == 0 ? 15.f : 255.f };
D3D::context->UpdateSubresource(palette_uniform, 0, nullptr, &params, 0, 0);
D3D::stateman->SetPixelConstants(palette_uniform);
Expand Down Expand Up @@ -332,6 +338,7 @@ TextureCache::TextureCache()
HRESULT hr = D3D::device->CreateBuffer(&lutBd, nullptr, &palette_buf);
CHECK(SUCCEEDED(hr), "create palette decoder lut buffer");
D3D::SetDebugObjectName(palette_buf, "texture decoder lut buffer");
// TODO: C14X2 format.
auto outlutUavDesc = CD3D11_SHADER_RESOURCE_VIEW_DESC(palette_buf, DXGI_FORMAT_R16_UINT, 0, 256, 0);
hr = D3D::device->CreateShaderResourceView(palette_buf, &outlutUavDesc, &palette_buf_srv);
CHECK(SUCCEEDED(hr), "create palette decoder lut srv");
Expand Down
9 changes: 5 additions & 4 deletions Source/Core/VideoBackends/D3D/TextureCache.h
Expand Up @@ -42,14 +42,15 @@ class TextureCache : public ::TextureCache

u64 EncodeToRamFromTexture(u32 address, void* source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source) {return 0;};

virtual void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override;
void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override;
bool SupportsConvertTexture() override;

void CompileShaders() override { }
void DeleteShaders() override { }

ID3D11Buffer *palette_buf;
ID3D11ShaderResourceView *palette_buf_srv;
ID3D11Buffer *palette_uniform;
ID3D11Buffer* palette_buf;
ID3D11ShaderResourceView* palette_buf_srv;
ID3D11Buffer* palette_uniform;
ID3D11PixelShader* palette_pixel_shader[3];
};

Expand Down
5 changes: 5 additions & 0 deletions Source/Core/VideoBackends/OGL/TextureCache.cpp
Expand Up @@ -359,6 +359,11 @@ void TextureCache::DeleteShaders()
s_DepthMatrixProgram.Destroy();
}

bool TextureCache::SupportsConvertTexture()
{
return false;
}

void TextureCache::ConvertTexture(TextureCache::TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format)
{
// TODO: Implement.
Expand Down
1 change: 1 addition & 0 deletions Source/Core/VideoBackends/OGL/TextureCache.h
Expand Up @@ -49,6 +49,7 @@ class TextureCache : public ::TextureCache

TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) override;
void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) override;
bool SupportsConvertTexture() override;

void CompileShaders() override;
void DeleteShaders() override;
Expand Down
73 changes: 40 additions & 33 deletions Source/Core/VideoCommon/TextureCacheBase.cpp
Expand Up @@ -293,6 +293,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)

const bool isPaletteTexture = (texformat == GX_TF_C4 || texformat == GX_TF_C8 || texformat == GX_TF_C14X2);

// Reject invalid tlut format.
if (isPaletteTexture && tlutfmt > GX_TL_RGB5A3)
return nullptr;

Expand Down Expand Up @@ -329,13 +330,13 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
if (texformat == GX_TF_RGBA8 && from_tmem)
{
u32 tmem_odd_addr = bpmem.tex[stage / 4].texImage2[stage % 4].tmem_odd * TMEM_LINE_SIZE;
texID = TextureAddress::TMem(tmem_addr, tmem_odd_addr);
texID = TextureAddress::TMemRGBA8(tmem_addr, tmem_odd_addr);
}
else
{
texID = TextureAddress::TMem(tmem_addr);
if (isPaletteTexture)
paletteDecodedID = TextureAddress::TMem(tmem_addr, tlutaddr);
paletteDecodedID = TextureAddress::TMemPalette(tmem_addr, tlutaddr);
}
}
else
Expand All @@ -362,44 +363,50 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
// EFB copies have slightly different rules: the hash doesn't need to match
// in EFB2Tex mode, and EFB copy formats have different meanings from texture
// formats.
if (entry->IsEfbCopy() && (g_ActiveConfig.bCopyEFBToTexture || tex_hash == entry->hash))
if (entry->IsEfbCopy())
{
// TODO: We should check format/width/height/levels for EFB copies. Checking
// format is complicated because EFB copy formats don't exactly match
// texture formats. I'm not sure what effect checking width/height/levels
// would have.
if (!palette_decoded_entry && isPaletteTexture)
if (g_ActiveConfig.bCopyEFBToTexture ||
(tex_hash == entry->hash && (!isPaletteTexture || g_texture_cache->SupportsConvertTexture())))
{
// Perform palette decoding.
// TODO: Skip decoding if we find a match.
auto decoded_entry_iter = textures.find(paletteDecodedID);
if (decoded_entry_iter != textures.end())
// TODO: We should check format/width/height/levels for EFB copies. Checking
// format is complicated because EFB copy formats don't exactly match
// texture formats. I'm not sure what effect checking width/height/levels
// would have.
if (!palette_decoded_entry && isPaletteTexture && g_texture_cache->SupportsConvertTexture())
{
// Pool this texture and make a new one later.
FreeTexture(decoded_entry_iter->second);
textures.erase(decoded_entry_iter);
// Perform palette decoding.
// TODO: Skip decoding if we find a match.
auto decoded_entry_iter = textures.find(paletteDecodedID);
if (decoded_entry_iter != textures.end())
{
// Pool this texture and make a new one later.
FreeTexture(decoded_entry_iter->second);
textures.erase(decoded_entry_iter);
}

TCacheEntryBase *decoded_entry = AllocateTexture(entry->config);

decoded_entry->SetGeneralParameters(paletteDecodedID, texture_size, full_format);
decoded_entry->SetDimensions(entry->native_width, entry->native_height, 1);
decoded_entry->SetHashes(TEXHASH_INVALID);
decoded_entry->frameCount = FRAMECOUNT_INVALID;

g_texture_cache->ConvertTexture(decoded_entry, entry, &texMem[tlutaddr], (TlutFormat)tlutfmt);
textures[paletteDecodedID] = decoded_entry;
entry = decoded_entry;
}

TCacheEntryBase *decoded_entry = AllocateTexture(entry->config);

decoded_entry->SetGeneralParameters(paletteDecodedID, texture_size, full_format);
decoded_entry->SetDimensions(entry->native_width, entry->native_height, 1);
decoded_entry->SetHashes(TEXHASH_INVALID);
decoded_entry->frameCount = FRAMECOUNT_INVALID;

g_texture_cache->ConvertTexture(decoded_entry, entry, &texMem[tlutaddr], (TlutFormat)tlutfmt);
textures[paletteDecodedID] = decoded_entry;
entry = decoded_entry;
return ReturnEntry(stage, entry);
}
return ReturnEntry(stage, entry);
}

// For normal textures, all texture parameters need to match.
if ((tex_hash ^ tlut_hash) == entry->hash && full_format == entry->format &&
entry->native_levels >= tex_levels && entry->native_width == nativeW && entry->native_height == nativeH)
else
{
// TODO: We have palette decoding code, we might want to use it in some cases.
return ReturnEntry(stage, entry);
// For normal textures, all texture parameters need to match.
if ((tex_hash ^ tlut_hash) == entry->hash && full_format == entry->format &&
entry->native_levels >= tex_levels && entry->native_width == nativeW && entry->native_height == nativeH)
{
// TODO: We have palette decoding code, we might want to use it in some cases.
return ReturnEntry(stage, entry);
}
}

// Pool this texture and make a new one later.
Expand Down
11 changes: 7 additions & 4 deletions Source/Core/VideoCommon/TextureCacheBase.h
Expand Up @@ -55,9 +55,10 @@ class TextureCache
TMEM,
// A texture in RAM, fully decoded using a palette.
RAM_PALETTE,
// A texture with two TMEM addresses.
// May be either decoded with a palette or an RGBA8 texture with two parts.
DUAL_TMEM,
// An RGBA8 texture in TMEM.
TMEM_RGBA8,
// A palette texture in TMEM.
TMEM_PALETTE,
// Uninitialized address.
INVALID
};
Expand All @@ -68,7 +69,8 @@ class TextureCache
static TextureAddress Mem(u32 a) { return TextureAddress(a, 0, RAM); }
static TextureAddress MemPalette(u32 a, u32 b) { return TextureAddress(a, b, RAM_PALETTE); }
static TextureAddress TMem(u32 a) { return TextureAddress(a, 0, TMEM); }
static TextureAddress TMem(u32 a, u32 b) { return TextureAddress(a, b, DUAL_TMEM); }
static TextureAddress TMemRGBA8(u32 a, u32 b) { return TextureAddress(a, b, TMEM_RGBA8); }
static TextureAddress TMemPalette(u32 a, u32 b) { return TextureAddress(a, b, TMEM_PALETTE); }
bool operator == (const TextureAddress& b) const
{
return kind == b.kind && address1 == b.address1 && address2 == b.address2;
Expand Down Expand Up @@ -165,6 +167,7 @@ class TextureCache
static void RequestInvalidateTextureCache();

virtual void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, TlutFormat format) = 0;
virtual bool SupportsConvertTexture() = 0;

protected:
TextureCache();
Expand Down

0 comments on commit 588d9dd

Please sign in to comment.