mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
More consistent handling of lack of depth texture support. Small log improvement.
This commit is contained in:
parent
bd3d97b17b
commit
295f5f391e
6 changed files with 41 additions and 16 deletions
|
@ -44,7 +44,7 @@ static const VaryingDef varyings[1] = {
|
|||
{ "vec2", "v_texcoord", Draw::SEM_TEXCOORD0, 0, "highp" },
|
||||
};
|
||||
|
||||
// Uses integer instructions available since OpenGL 3.0. Suitable for ES 3.0 as well.
|
||||
// Uses integer instructions available since OpenGL 3.0, ES 3.0 (and 2.0 with extensions), and of course Vulkan and D3D11.
|
||||
void GenerateDepalShader300(ShaderWriter &writer, const DepalConfig &config, const ShaderLanguageDesc &lang) {
|
||||
const int shift = config.shift;
|
||||
const int mask = config.mask;
|
||||
|
@ -128,7 +128,7 @@ void GenerateDepalShader300(ShaderWriter &writer, const DepalConfig &config, con
|
|||
writer.C(" vec4 outColor = ").SampleTexture2D("pal", "uv").C(";\n");
|
||||
}
|
||||
|
||||
// FP only, to suit GL(ES) 2.0
|
||||
// FP only, to suit GL(ES) 2.0 and DX9
|
||||
void GenerateDepalShaderFloat(ShaderWriter &writer, const DepalConfig &config, const ShaderLanguageDesc &lang) {
|
||||
char lookupMethod[128] = "index.r";
|
||||
|
||||
|
@ -249,7 +249,7 @@ void GenerateDepalShaderFloat(ShaderWriter &writer, const DepalConfig &config, c
|
|||
// index_multiplier -= 0.01f / texturePixels;
|
||||
|
||||
if (!formatOK) {
|
||||
ERROR_LOG_REPORT_ONCE(depal, G3D, "%i depal unsupported: shift=%i mask=%02x offset=%d", config.pixelFormat, shift, mask, config.startPos);
|
||||
ERROR_LOG_REPORT_ONCE(depal, G3D, "%s depal unsupported: shift=%d mask=%02x offset=%d", GeBufferFormatToString(config.pixelFormat), shift, mask, config.startPos);
|
||||
}
|
||||
|
||||
// Offset by half a texel (plus clutBase) to turn NEAREST filtering into FLOOR.
|
||||
|
|
|
@ -515,6 +515,7 @@ TexCacheEntry *TextureCacheCommon::SetTexture() {
|
|||
nextNeedsChange_ = false;
|
||||
// Might need a rebuild if the hash fails, but that will be set later.
|
||||
nextNeedsRebuild_ = false;
|
||||
failedTexture_ = false;
|
||||
VERBOSE_LOG(G3D, "Texture at %08x found in cache, applying", texaddr);
|
||||
return entry; //Done!
|
||||
} else {
|
||||
|
@ -610,10 +611,9 @@ TexCacheEntry *TextureCacheCommon::SetTexture() {
|
|||
gstate_c.curTextureHeight = h;
|
||||
gstate_c.SetTextureIs3D((entry->status & TexCacheEntry::STATUS_3D) != 0);
|
||||
|
||||
failedTexture_ = false;
|
||||
nextTexture_ = entry;
|
||||
if (nextFramebufferTexture_) {
|
||||
nextFramebufferTexture_ = nullptr; // in case it was accidentally set somehow?
|
||||
}
|
||||
nextFramebufferTexture_ = nullptr;
|
||||
nextNeedsRehash_ = true;
|
||||
// We still need to rebuild, to allocate a texture. But we'll bail early.
|
||||
nextNeedsRebuild_ = true;
|
||||
|
@ -633,7 +633,7 @@ std::vector<AttachCandidate> TextureCacheCommon::GetFramebufferCandidates(const
|
|||
candidates.push_back(AttachCandidate{ match, entry, framebuffer, RASTER_COLOR, framebuffer->colorBindSeq });
|
||||
}
|
||||
match = {};
|
||||
if (gstate_c.Supports(GPU_SUPPORTS_DEPTH_TEXTURE) && MatchFramebuffer(entry, framebuffer, texAddrOffset, RASTER_DEPTH, &match)) {
|
||||
if (MatchFramebuffer(entry, framebuffer, texAddrOffset, RASTER_DEPTH, &match)) {
|
||||
candidates.push_back(AttachCandidate{ match, entry, framebuffer, RASTER_DEPTH, framebuffer->depthBindSeq });
|
||||
}
|
||||
}
|
||||
|
@ -1020,10 +1020,10 @@ void TextureCacheCommon::SetTextureFramebuffer(const AttachCandidate &candidate)
|
|||
_dbg_assert_msg_(framebuffer != nullptr, "Framebuffer must not be null.");
|
||||
|
||||
framebuffer->usageFlags |= FB_USAGE_TEXTURE;
|
||||
if (framebufferManager_->UseBufferedRendering()) {
|
||||
// Keep the framebuffer alive.
|
||||
framebuffer->last_frame_used = gpuStats.numFlips;
|
||||
// Keep the framebuffer alive.
|
||||
framebuffer->last_frame_used = gpuStats.numFlips;
|
||||
|
||||
if (framebufferManager_->UseBufferedRendering()) {
|
||||
// We need to force it, since we may have set it on a texture before attaching.
|
||||
gstate_c.curTextureWidth = framebuffer->bufferWidth;
|
||||
gstate_c.curTextureHeight = framebuffer->bufferHeight;
|
||||
|
@ -1042,7 +1042,14 @@ void TextureCacheCommon::SetTextureFramebuffer(const AttachCandidate &candidate)
|
|||
gstate_c.SetNeedShaderTexclamp(true);
|
||||
}
|
||||
|
||||
nextFramebufferTexture_ = framebuffer;
|
||||
if (candidate.channel == RASTER_DEPTH && !gstate_c.Supports(GPU_SUPPORTS_DEPTH_TEXTURE)) {
|
||||
// Flag to bind a null texture if we can't support depth textures.
|
||||
// Should only happen on old OpenGL.
|
||||
nextFramebufferTexture_ = nullptr;
|
||||
failedTexture_ = true;
|
||||
} else {
|
||||
nextFramebufferTexture_ = framebuffer;
|
||||
}
|
||||
nextTexture_ = nullptr;
|
||||
} else {
|
||||
if (framebuffer->fbo) {
|
||||
|
@ -1753,7 +1760,10 @@ void TextureCacheCommon::ApplyTexture() {
|
|||
if (!entry) {
|
||||
// Maybe we bound a framebuffer?
|
||||
InvalidateLastTexture();
|
||||
if (nextFramebufferTexture_) {
|
||||
if (failedTexture_) {
|
||||
// Backends should handle this by binding a black texture with 0 alpha.
|
||||
BindTexture(nullptr);
|
||||
} else if (nextFramebufferTexture_) {
|
||||
bool depth = Memory::IsDepthTexVRAMAddress(gstate.getTextureAddress(0));
|
||||
// ApplyTextureFrameBuffer is responsible for setting SetTextureFullAlpha.
|
||||
ApplyTextureFramebuffer(nextFramebufferTexture_, gstate.getTextureFormat(), depth ? RASTER_DEPTH : RASTER_COLOR);
|
||||
|
|
|
@ -433,6 +433,7 @@ protected:
|
|||
SimpleBuf<u32> tmpTexBufRearrange_;
|
||||
|
||||
TexCacheEntry *nextTexture_ = nullptr;
|
||||
bool failedTexture_ = false;
|
||||
VirtualFramebuffer *nextFramebufferTexture_ = nullptr;
|
||||
|
||||
u32 clutHash_ = 0;
|
||||
|
|
|
@ -236,6 +236,11 @@ void TextureCacheD3D11::UpdateCurrentClut(GEPaletteFormat clutFormat, u32 clutBa
|
|||
}
|
||||
|
||||
void TextureCacheD3D11::BindTexture(TexCacheEntry *entry) {
|
||||
if (!entry) {
|
||||
ID3D11ShaderResourceView *textureView = nullptr;
|
||||
context_->PSSetShaderResources(0, 1, &textureView);
|
||||
return;
|
||||
}
|
||||
ID3D11ShaderResourceView *textureView = DxView(entry);
|
||||
if (textureView != lastBoundTexture) {
|
||||
context_->PSSetShaderResources(0, 1, &textureView);
|
||||
|
|
|
@ -204,6 +204,10 @@ void TextureCacheDX9::UpdateCurrentClut(GEPaletteFormat clutFormat, u32 clutBase
|
|||
}
|
||||
|
||||
void TextureCacheDX9::BindTexture(TexCacheEntry *entry) {
|
||||
if (!entry) {
|
||||
device_->SetTexture(0, nullptr);
|
||||
return;
|
||||
}
|
||||
LPDIRECT3DBASETEXTURE9 texture = DxTex(entry);
|
||||
if (texture != lastBoundTexture) {
|
||||
device_->SetTexture(0, texture);
|
||||
|
@ -215,7 +219,7 @@ void TextureCacheDX9::BindTexture(TexCacheEntry *entry) {
|
|||
}
|
||||
|
||||
void TextureCacheDX9::Unbind() {
|
||||
device_->SetTexture(0, NULL);
|
||||
device_->SetTexture(0, nullptr);
|
||||
InvalidateLastTexture();
|
||||
}
|
||||
|
||||
|
|
|
@ -388,14 +388,19 @@ void TextureCacheVulkan::UpdateCurrentClut(GEPaletteFormat clutFormat, u32 clutB
|
|||
}
|
||||
|
||||
void TextureCacheVulkan::BindTexture(TexCacheEntry *entry) {
|
||||
_assert_(entry);
|
||||
_assert_(entry->vkTex);
|
||||
if (!entry) {
|
||||
imageView_ = VK_NULL_HANDLE;
|
||||
curSampler_ = VK_NULL_HANDLE;
|
||||
return;
|
||||
}
|
||||
|
||||
_dbg_assert_(entry->vkTex);
|
||||
entry->vkTex->Touch();
|
||||
imageView_ = entry->vkTex->GetImageView();
|
||||
|
||||
int maxLevel = (entry->status & TexCacheEntry::STATUS_NO_MIPS) ? 0 : entry->maxLevel;
|
||||
SamplerCacheKey samplerKey = GetSamplingParams(maxLevel, entry);
|
||||
curSampler_ = samplerCache_.GetOrCreateSampler(samplerKey);
|
||||
imageView_ = entry->vkTex->GetImageView();
|
||||
drawEngine_->SetDepalTexture(VK_NULL_HANDLE);
|
||||
gstate_c.SetUseShaderDepal(false);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue