mirror of https://github.com/PCSX2/pcsx2.git
gsdx mipmap:tc: add code to update a single layer of a mipmap
This commit is contained in:
parent
dbb4bdf59f
commit
15b1d8d3f0
|
@ -1562,6 +1562,8 @@ GSTextureCache::Source::Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFR
|
|||
m_repeating = false;
|
||||
|
||||
} else {
|
||||
memset(m_layer_TEX0, 0, sizeof(m_layer_TEX0));
|
||||
|
||||
memset(m_valid, 0, sizeof(m_valid));
|
||||
|
||||
m_clut = (uint32*)_aligned_malloc(256 * sizeof(uint32), 32);
|
||||
|
@ -1593,7 +1595,7 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
{
|
||||
Surface::UpdateAge();
|
||||
|
||||
if(m_complete || m_target)
|
||||
if(layer == 0 && (m_complete || m_target))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -1605,7 +1607,7 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
|
||||
GSVector4i r = rect.ralign<Align_Outside>(bs);
|
||||
|
||||
if(r.eq(GSVector4i(0, 0, tw, th)))
|
||||
if(layer == 0 && r.eq(GSVector4i(0, 0, tw, th)))
|
||||
{
|
||||
m_complete = true; // lame, but better than nothing
|
||||
}
|
||||
|
@ -1679,6 +1681,27 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
}
|
||||
}
|
||||
|
||||
void GSTextureCache::Source::UpdateLayer(const GIFRegTEX0& TEX0, const GSVector4i& rect, int layer)
|
||||
{
|
||||
if (layer > 6)
|
||||
return;
|
||||
|
||||
if (m_target) // Yeah keep dreaming
|
||||
return;
|
||||
|
||||
if (TEX0 == m_layer_TEX0[layer])
|
||||
return;
|
||||
|
||||
GIFRegTEX0 old_TEX0 = m_TEX0;
|
||||
|
||||
m_layer_TEX0[layer] = TEX0;
|
||||
m_TEX0 = TEX0;
|
||||
|
||||
Update(rect, layer);
|
||||
|
||||
m_TEX0 = old_TEX0;
|
||||
}
|
||||
|
||||
void GSTextureCache::Source::Write(const GSVector4i& r, int layer)
|
||||
{
|
||||
m_write.rect[m_write.count++] = r;
|
||||
|
@ -1750,13 +1773,13 @@ void GSTextureCache::Source::Flush(uint32 count, int layer)
|
|||
{
|
||||
(mem.*rtx)(off, r, buff, pitch, m_TEXA);
|
||||
|
||||
m_texture->Update(r.rintersect(tr), buff, pitch);
|
||||
m_texture->Update(r.rintersect(tr), buff, pitch, layer);
|
||||
}
|
||||
else
|
||||
{
|
||||
GSTexture::GSMap m;
|
||||
|
||||
if(m_texture->Map(m, &r))
|
||||
if(m_texture->Map(m, &r, layer))
|
||||
{
|
||||
(mem.*rtx)(off, r, m.bits, m.pitch, m_TEXA);
|
||||
|
||||
|
@ -1766,7 +1789,7 @@ void GSTextureCache::Source::Flush(uint32 count, int layer)
|
|||
{
|
||||
(mem.*rtx)(off, r, buff, pitch, m_TEXA);
|
||||
|
||||
m_texture->Update(r, buff, pitch);
|
||||
m_texture->Update(r, buff, pitch, layer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,12 +71,14 @@ public:
|
|||
// still be valid on future. However it ought to be good when the source is created
|
||||
// so it can be used to access un-converted data for the current draw call.
|
||||
GSTexture* m_from_target;
|
||||
GIFRegTEX0 m_layer_TEX0[7]; // Detect already loaded value
|
||||
|
||||
public:
|
||||
Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, uint8* temp, bool dummy_container = false);
|
||||
virtual ~Source();
|
||||
|
||||
void Update(const GSVector4i& rect, int layer = 0);
|
||||
void UpdateLayer(const GIFRegTEX0& TEX0, const GSVector4i& rect, int layer = 0);
|
||||
};
|
||||
|
||||
class Target : public Surface
|
||||
|
|
Loading…
Reference in New Issue