Files
ppsspp/UI/GPUDriverTestScreen.h
Henrik RydgårdandClaude Opus 5.5 247e764b97 UI: Don't use draw objects from before a device loss
The system info screen's "Copy summary" kept the draw context it was
created with, and the GPU driver test screen kept its pipelines and
sampler, using and finally releasing them into a deleted context after
Android lost the surface. Look up the draw context when clicked, and
release the test objects on device loss (they're recreated on draw).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-26 15:04:00 +01:00

66 lines
2.0 KiB
C++

#pragma once
#include "Common/System/Display.h"
#include "Common/UI/Context.h"
#include "Common/UI/View.h"
#include "Common/UI/ViewGroup.h"
#include "Common/UI/TabHolder.h"
#include "Common/Log.h"
#include "UI/BaseScreens.h"
#include "Common/GPU/thin3d.h"
class GPUDriverTestScreen : public UIBaseDialogScreen {
public:
bool LimitContentArea() const override { return false; }
GPUDriverTestScreen();
~GPUDriverTestScreen();
void CreateViews() override;
void DrawForeground(UIContext &dc) override;
void deviceLost() override;
const char *tag() const override { return "GPUDriverTest"; }
private:
void DiscardTest(UIContext &dc);
void ShaderTest(UIContext &dc);
void DestroyDeviceObjects();
// Common objects
Draw::SamplerState *samplerNearest_ = nullptr;
// Discard/depth/stencil stuff
// ===========================
Draw::ShaderModule *discardFragShader_ = nullptr;
Draw::Pipeline *discardWriteDepthStencil_ = nullptr;
Draw::Pipeline *discardWriteDepth_ = nullptr;
Draw::Pipeline *discardWriteStencil_ = nullptr;
// Stencil test, with and without DepthAlways
Draw::Pipeline *drawTestStencilEqual_ = nullptr;
Draw::Pipeline *drawTestStencilNotEqual_ = nullptr;
Draw::Pipeline *drawTestStencilEqualDepthAlways_ = nullptr;
Draw::Pipeline *drawTestStencilNotEqualDepthAlways_ = nullptr;
// Depth tests with and without StencilAlways
Draw::Pipeline *drawTestStencilAlwaysDepthLessEqual_ = nullptr;
Draw::Pipeline *drawTestStencilAlwaysDepthGreater_ = nullptr;
Draw::Pipeline *drawTestDepthLessEqual_ = nullptr;
Draw::Pipeline *drawTestDepthGreater_ = nullptr;
// Shader tests
// ============
Draw::Pipeline *adrenoLogicDiscardPipeline_ = nullptr;
Draw::ShaderModule *adrenoLogicDiscardFragShader_ = nullptr;
Draw::ShaderModule *adrenoLogicDiscardVertShader_ = nullptr;
Draw::Pipeline *flatShadingPipeline_ = nullptr;
Draw::ShaderModule *flatFragShader_ = nullptr;
Draw::ShaderModule *flatVertShader_ = nullptr;
UI::TabHolder *tabHolder_ = nullptr;
};