Don't refer directly to g_Config.iMultiSampleLevel, it can contain unsupported modes.

This commit is contained in:
Henrik Rydgård
2022-12-14 15:15:31 +01:00
parent 41e5b1e95a
commit 11366a2ded
11 changed files with 55 additions and 23 deletions
+8 -10
View File
@@ -82,14 +82,14 @@ FramebufferManagerCommon::~FramebufferManagerCommon() {
delete presentation_;
}
void FramebufferManagerCommon::Init() {
void FramebufferManagerCommon::Init(int msaaLevel) {
// We may need to override the render size if the shader is upscaling or SSAA.
NotifyDisplayResized();
NotifyRenderResized();
NotifyRenderResized(msaaLevel);
}
bool FramebufferManagerCommon::UpdateRenderSize() {
const bool newRender = renderWidth_ != (float)PSP_CoreParameter().renderWidth || renderHeight_ != (float)PSP_CoreParameter().renderHeight || msaaLevel_ != g_Config.iMultiSampleLevel;
bool FramebufferManagerCommon::UpdateRenderSize(int msaaLevel) {
const bool newRender = renderWidth_ != (float)PSP_CoreParameter().renderWidth || renderHeight_ != (float)PSP_CoreParameter().renderHeight || msaaLevel_ != msaaLevel;
int effectiveBloomHack = g_Config.iBloomHack;
if (PSP_CoreParameter().compat.flags().ForceLowerResolutionForEffectsOn) {
@@ -104,7 +104,7 @@ bool FramebufferManagerCommon::UpdateRenderSize() {
renderWidth_ = (float)PSP_CoreParameter().renderWidth;
renderHeight_ = (float)PSP_CoreParameter().renderHeight;
renderScaleFactor_ = (float)PSP_CoreParameter().renderScaleFactor;
msaaLevel_ = g_Config.iMultiSampleLevel;
msaaLevel_ = msaaLevel;
bloomHack_ = effectiveBloomHack;
useBufferedRendering_ = newBuffered;
@@ -1670,9 +1670,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w,
char tag[128];
size_t len = FormatFramebufferName(vfb, tag, sizeof(tag));
int msaaLevel = g_Config.iMultiSampleLevel;
vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, GetFramebufferLayers(), msaaLevel, true, tag });
vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, GetFramebufferLayers(), msaaLevel_, true, tag });
if (Memory::IsVRAMAddress(vfb->fb_address) && vfb->fb_stride != 0) {
NotifyMemInfo(MemBlockFlags::ALLOC, vfb->fb_address, ColorBufferByteSize(vfb), tag, len);
}
@@ -2406,7 +2404,7 @@ void FramebufferManagerCommon::NotifyDisplayResized() {
updatePostShaders_ = true;
}
void FramebufferManagerCommon::NotifyRenderResized() {
void FramebufferManagerCommon::NotifyRenderResized(int msaaLevel) {
gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB;
int w, h, scaleFactor;
@@ -2415,7 +2413,7 @@ void FramebufferManagerCommon::NotifyRenderResized() {
PSP_CoreParameter().renderHeight = h;
PSP_CoreParameter().renderScaleFactor = scaleFactor;
if (UpdateRenderSize()) {
if (UpdateRenderSize(msaaLevel)) {
DestroyAllFBOs();
}
+7 -3
View File
@@ -272,7 +272,7 @@ public:
drawEngine_ = td;
}
virtual void Init();
void Init(int msaaLevel);
virtual void BeginFrame();
void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format);
void DestroyFramebuf(VirtualFramebuffer *v);
@@ -398,7 +398,7 @@ public:
}
void SetSafeSize(u16 w, u16 h);
void NotifyRenderResized();
void NotifyRenderResized(int msaaLevel);
virtual void NotifyDisplayResized();
void NotifyConfigChanged();
@@ -445,6 +445,10 @@ public:
void ReleasePipelines();
int GetMSAALevel() const {
return msaaLevel_;
}
protected:
virtual void ReadbackFramebufferSync(VirtualFramebuffer *vfb, int x, int y, int w, int h, RasterChannel channel);
// Used for when a shader is required, such as GLES.
@@ -457,7 +461,7 @@ protected:
void CopyToColorFromOverlappingFramebuffers(VirtualFramebuffer *dest);
void CopyToDepthFromOverlappingFramebuffers(VirtualFramebuffer *dest);
bool UpdateRenderSize();
bool UpdateRenderSize(int msaaLevel);
void FlushBeforeCopy();
virtual void DecimateFBOs(); // keeping it virtual to let D3D do a little extra
+1 -1
View File
@@ -70,7 +70,7 @@ GPU_D3D11::GPU_D3D11(GraphicsContext *gfxCtx, Draw::DrawContext *draw)
framebufferManagerD3D11_->SetTextureCache(textureCacheD3D11_);
framebufferManagerD3D11_->SetShaderManager(shaderManagerD3D11_);
framebufferManagerD3D11_->SetDrawEngine(&drawEngine_);
framebufferManagerD3D11_->Init();
framebufferManagerD3D11_->Init(msaaLevel_);
textureCacheD3D11_->SetFramebufferManager(framebufferManagerD3D11_);
textureCacheD3D11_->SetShaderManager(shaderManagerD3D11_);
+1 -1
View File
@@ -69,7 +69,7 @@ GPU_DX9::GPU_DX9(GraphicsContext *gfxCtx, Draw::DrawContext *draw)
framebufferManagerDX9_->SetTextureCache(textureCacheDX9_);
framebufferManagerDX9_->SetShaderManager(shaderManagerDX9_);
framebufferManagerDX9_->SetDrawEngine(&drawEngine_);
framebufferManagerDX9_->Init();
framebufferManagerDX9_->Init(msaaLevel_);
textureCacheDX9_->SetFramebufferManager(framebufferManagerDX9_);
textureCacheDX9_->SetShaderManager(shaderManagerDX9_);
+1 -1
View File
@@ -74,7 +74,7 @@ GPU_GLES::GPU_GLES(GraphicsContext *gfxCtx, Draw::DrawContext *draw)
framebufferManagerGL_->SetTextureCache(textureCacheGL_);
framebufferManagerGL_->SetShaderManager(shaderManagerGL_);
framebufferManagerGL_->SetDrawEngine(&drawEngine_);
framebufferManagerGL_->Init();
framebufferManagerGL_->Init(msaaLevel_);
textureCacheGL_->SetFramebufferManager(framebufferManagerGL_);
textureCacheGL_->SetShaderManager(shaderManagerGL_);
textureCacheGL_->SetDrawEngine(&drawEngine_);
+15 -1
View File
@@ -428,6 +428,8 @@ GPUCommon::GPUCommon(GraphicsContext *gfxCtx, Draw::DrawContext *draw) :
ResetMatrices();
PPGeSetDrawContext(draw);
UpdateMSAALevel(draw);
}
GPUCommon::~GPUCommon() {
@@ -484,6 +486,8 @@ void GPUCommon::BeginHostFrame() {
gstate_c.Dirty(DIRTY_ALL);
UpdateCmdInfo();
UpdateMSAALevel(draw_);
CheckConfigChanged();
CheckDisplayResized();
CheckRenderResized();
@@ -659,7 +663,7 @@ void GPUCommon::CheckDisplayResized() {
void GPUCommon::CheckRenderResized() {
if (renderResized_) {
framebufferManager_->NotifyRenderResized();
framebufferManager_->NotifyRenderResized(msaaLevel_);
renderResized_ = false;
}
}
@@ -3575,3 +3579,13 @@ u32 GPUCommon::CheckGPUFeaturesLate(u32 features) const {
return features;
}
void GPUCommon::UpdateMSAALevel(Draw::DrawContext *draw) {
int level = g_Config.iMultiSampleLevel;
if (draw->GetDeviceCaps().multiSampleLevelsMask & (1 << level)) {
msaaLevel_ = level;
} else {
// Didn't support the configured level, so revert to 0.
msaaLevel_ = 0;
}
}
+9
View File
@@ -261,6 +261,10 @@ public:
fullInfo = reportingFullInfo_;
}
int MSAALevel() const {
return msaaLevel_;
}
protected:
void DeviceLost() override;
void DeviceRestore() override;
@@ -319,6 +323,8 @@ protected:
virtual void BuildReportingInfo() = 0;
void UpdateMSAALevel(Draw::DrawContext *draw);
FramebufferManagerCommon *framebufferManager_ = nullptr;
TextureCacheCommon *textureCache_ = nullptr;
DrawEngineCommon *drawEngineCommon_ = nullptr;
@@ -405,6 +411,8 @@ protected:
std::string reportingPrimaryInfo_;
std::string reportingFullInfo_;
int msaaLevel_ = 0;
private:
void CheckDepthUsage(VirtualFramebuffer *vfb);
void DoExecuteCall(u32 target);
@@ -415,6 +423,7 @@ private:
// Debug stats.
double timeSteppingStarted_;
double timeSpentStepping_;
int lastVsync_ = -1;
};
+2 -2
View File
@@ -788,7 +788,7 @@ void DrawEngineVulkan::DoFlush() {
}
_dbg_assert_msg_(vshader->UseHWTransform(), "Bad vshader");
VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(renderManager, pipelineLayout_, pipelineKey_, &dec_->decFmt, vshader, fshader, gshader, true, 0, g_Config.iMultiSampleLevel);
VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(renderManager, pipelineLayout_, pipelineKey_, &dec_->decFmt, vshader, fshader, gshader, true, 0, framebufferManager_->GetMSAALevel());
if (!pipeline || !pipeline->pipeline) {
// Already logged, let's bail out.
return;
@@ -917,7 +917,7 @@ void DrawEngineVulkan::DoFlush() {
shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, &gshader, pipelineState_, false, false, decOptions_.expandAllWeightsToFloat, true);
_dbg_assert_msg_(!vshader->UseHWTransform(), "Bad vshader");
VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(renderManager, pipelineLayout_, pipelineKey_, &dec_->decFmt, vshader, fshader, gshader, false, 0, g_Config.iMultiSampleLevel);
VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(renderManager, pipelineLayout_, pipelineKey_, &dec_->decFmt, vshader, fshader, gshader, false, 0, framebufferManager_->GetMSAALevel());
if (!pipeline || !pipeline->pipeline) {
// Already logged, let's bail out.
decodedVerts_ = 0;
+4 -3
View File
@@ -76,7 +76,7 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw)
framebufferManagerVulkan_->SetTextureCache(textureCacheVulkan_);
framebufferManagerVulkan_->SetDrawEngine(&drawEngine_);
framebufferManagerVulkan_->SetShaderManager(shaderManagerVulkan_);
framebufferManagerVulkan_->Init();
framebufferManagerVulkan_->Init(msaaLevel_);
textureCacheVulkan_->SetFramebufferManager(framebufferManagerVulkan_);
textureCacheVulkan_->SetShaderManager(shaderManagerVulkan_);
textureCacheVulkan_->SetDrawEngine(&drawEngine_);
@@ -140,9 +140,10 @@ void GPU_Vulkan::LoadCache(const Path &filename) {
}
if (result) {
// WARNING: See comment in LoadPipelineCache if you are tempted to flip the second parameter to true.
result = pipelineManager_->LoadPipelineCache(f, false, shaderManagerVulkan_, draw_, drawEngine_.GetPipelineLayout(), g_Config.iMultiSampleLevel);
result = pipelineManager_->LoadPipelineCache(f, false, shaderManagerVulkan_, draw_, drawEngine_.GetPipelineLayout(), msaaLevel_);
}
fclose(f);
if (!result) {
WARN_LOG(G3D, "Incompatible Vulkan pipeline cache - rebuilding.");
// Bad cache file for this GPU/Driver/etc. Delete it.
@@ -274,7 +275,7 @@ u32 GPU_Vulkan::CheckGPUFeatures() const {
// We need to turn off framebuffer fetch through input attachments if MSAA is on for now.
// This is fixable, just needs some shader generator work (subpassInputMS).
if (g_Config.iMultiSampleLevel != 0) {
if (msaaLevel_ != 0) {
features &= ~GPU_USE_FRAMEBUFFER_FETCH;
}
+1 -1
View File
@@ -727,7 +727,7 @@ bool PipelineManagerVulkan::LoadPipelineCache(FILE *file, bool loadRawPipelineCa
// Read the number of pipelines.
bool failed = fread(&size, sizeof(size), 1, file) != 1;
NOTICE_LOG(G3D, "Creating %d pipelines from cache...", size);
NOTICE_LOG(G3D, "Creating %d pipelines from cache (%dx MSAA)...", size, (1 << multiSampleLevel));
int pipelineCreateFailCount = 0;
int shaderFailCount = 0;
for (uint32_t i = 0; i < size; i++) {