mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-13 17:49:29 +01:00
Merge pull request #17004 from hrydgard/gpu-common-hw-move-exec
Move more stuff to GPUCommonHW
This commit is contained in:
7 files changed
+1119
-1127
No files matched your search
+2
-1006
File diff suppressed because it is too large.
Load diff
+2
-70
@@ -60,7 +60,6 @@ struct TransformedVertex {
|
||||
u32 color1_32;
|
||||
};
|
||||
|
||||
|
||||
void CopyFromWithOffset(const TransformedVertex &other, float xoff, float yoff) {
|
||||
this->x = other.x + xoff;
|
||||
this->y = other.y + yoff;
|
||||
@@ -108,7 +107,6 @@ public:
|
||||
|
||||
void DumpNextFrame() override;
|
||||
|
||||
void ExecuteOp(u32 op, u32 diff) override;
|
||||
virtual void PreExecuteOp(u32 op, u32 diff) {}
|
||||
|
||||
bool InterpretList(DisplayList &list);
|
||||
@@ -129,14 +127,12 @@ public:
|
||||
uint32_t SetAddrTranslation(uint32_t value) override;
|
||||
uint32_t GetAddrTranslation() override;
|
||||
|
||||
void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format) override;
|
||||
void CopyDisplayToOutput(bool reallyDirty) override = 0;
|
||||
bool PerformMemoryCopy(u32 dest, u32 src, int size, GPUCopyFlag flags = GPUCopyFlag::NONE) override;
|
||||
bool PerformMemorySet(u32 dest, u8 v, int size) override;
|
||||
bool PerformReadbackToMemory(u32 dest, int size) override;
|
||||
bool PerformWriteColorFromMemory(u32 dest, int size) override;
|
||||
|
||||
void InvalidateCache(u32 addr, int size, GPUInvalidationType type) override;
|
||||
void PerformWriteFormattedFromMemory(u32 addr, int size, int width, GEBufferFormat format) override;
|
||||
bool PerformWriteStencilFromMemory(u32 dest, int size, WriteStencil flags) override;
|
||||
|
||||
@@ -152,30 +148,7 @@ public:
|
||||
void Execute_Ret(u32 op, u32 diff);
|
||||
void Execute_End(u32 op, u32 diff);
|
||||
|
||||
void Execute_VertexType(u32 op, u32 diff);
|
||||
void Execute_VertexTypeSkinning(u32 op, u32 diff);
|
||||
|
||||
void Execute_Prim(u32 op, u32 diff);
|
||||
void Execute_Bezier(u32 op, u32 diff);
|
||||
void Execute_Spline(u32 op, u32 diff);
|
||||
void Execute_BoundingBox(u32 op, u32 diff);
|
||||
void Execute_BlockTransferStart(u32 op, u32 diff);
|
||||
|
||||
void Execute_LoadClut(u32 op, u32 diff);
|
||||
|
||||
void Execute_TexSize0(u32 op, u32 diff);
|
||||
void Execute_TexLevel(u32 op, u32 diff);
|
||||
|
||||
void Execute_WorldMtxNum(u32 op, u32 diff);
|
||||
void Execute_WorldMtxData(u32 op, u32 diff);
|
||||
void Execute_ViewMtxNum(u32 op, u32 diff);
|
||||
void Execute_ViewMtxData(u32 op, u32 diff);
|
||||
void Execute_ProjMtxNum(u32 op, u32 diff);
|
||||
void Execute_ProjMtxData(u32 op, u32 diff);
|
||||
void Execute_TgenMtxNum(u32 op, u32 diff);
|
||||
void Execute_TgenMtxData(u32 op, u32 diff);
|
||||
void Execute_BoneMtxNum(u32 op, u32 diff);
|
||||
void Execute_BoneMtxData(u32 op, u32 diff);
|
||||
|
||||
void Execute_MorphWeight(u32 op, u32 diff);
|
||||
|
||||
@@ -204,13 +177,7 @@ public:
|
||||
|
||||
// From GPUDebugInterface.
|
||||
bool GetCurrentDisplayList(DisplayList &list) override;
|
||||
bool GetCurrentFramebuffer(GPUDebugBuffer &buffer, GPUDebugFramebufferType type, int maxRes) override;
|
||||
bool GetCurrentDepthbuffer(GPUDebugBuffer &buffer) override;
|
||||
bool GetCurrentStencilbuffer(GPUDebugBuffer &buffer) override;
|
||||
bool GetCurrentTexture(GPUDebugBuffer &buffer, int level, bool *isFramebuffer) override;
|
||||
bool GetCurrentClut(GPUDebugBuffer &buffer) override;
|
||||
bool GetCurrentSimpleVertices(int count, std::vector<GPUDebugVertex> &vertices, std::vector<u16> &indices) override;
|
||||
bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override;
|
||||
|
||||
std::vector<std::string> DebugGetShaderIDs(DebugShaderType shader) override { return std::vector<std::string>(); };
|
||||
std::string DebugGetShaderString(std::string id, DebugShaderType shader, DebugShaderStringType stringType) override {
|
||||
@@ -253,11 +220,6 @@ public:
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool FramebufferDirty() override;
|
||||
bool FramebufferReallyDirty() override;
|
||||
|
||||
typedef void (GPUCommon::*CmdFunc)(u32 op, u32 diff);
|
||||
|
||||
void GetReportingInfo(std::string &primaryInfo, std::string &fullInfo) override {
|
||||
primaryInfo = reportingPrimaryInfo_;
|
||||
fullInfo = reportingFullInfo_;
|
||||
@@ -271,9 +233,6 @@ protected:
|
||||
|
||||
virtual void CheckRenderResized() {}
|
||||
|
||||
// Add additional common features dependent on other features, which may be backend-determined.
|
||||
u32 CheckGPUFeaturesLate(u32 features) const;
|
||||
|
||||
inline bool IsTrianglePrim(GEPrimitiveType prim) const {
|
||||
return prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP;
|
||||
}
|
||||
@@ -296,7 +255,7 @@ protected:
|
||||
void BeginFrame() override;
|
||||
void UpdateVsyncInterval(bool force);
|
||||
|
||||
virtual void FastRunLoop(DisplayList &list);
|
||||
virtual void FastRunLoop(DisplayList &list) = 0;
|
||||
|
||||
void SlowRunLoop(DisplayList &list);
|
||||
void UpdatePC(u32 currentPC, u32 newPC);
|
||||
@@ -308,8 +267,6 @@ protected:
|
||||
// TODO: Unify this. The only backend that differs is Vulkan.
|
||||
virtual void FinishDeferred() {}
|
||||
|
||||
void CheckFlushOp(int cmd, u32 diff);
|
||||
|
||||
void AdvanceVerts(u32 vertType, int count, int bytesRead) {
|
||||
if ((vertType & GE_VTYPE_IDX_MASK) != GE_VTYPE_IDX_NONE) {
|
||||
int indexShift = ((vertType & GE_VTYPE_IDX_MASK) >> GE_VTYPE_IDX_SHIFT) - 1;
|
||||
@@ -330,28 +287,12 @@ protected:
|
||||
// TODO: These should live in GPUCommonHW.
|
||||
FramebufferManagerCommon *framebufferManager_ = nullptr;
|
||||
TextureCacheCommon *textureCache_ = nullptr;
|
||||
ShaderManagerCommon *shaderManager_ = nullptr;
|
||||
|
||||
bool flushOnParams_ = true;
|
||||
|
||||
GraphicsContext *gfxCtx_;
|
||||
Draw::DrawContext *draw_;
|
||||
|
||||
struct CommandInfo {
|
||||
uint64_t flags;
|
||||
GPUCommon::CmdFunc func;
|
||||
|
||||
// Dirty flags are mashed into the regular flags by a left shift of 8.
|
||||
void AddDirty(u64 dirty) {
|
||||
flags |= dirty << 8;
|
||||
}
|
||||
void RemoveDirty(u64 dirty) {
|
||||
flags &= ~(dirty << 8);
|
||||
}
|
||||
};
|
||||
|
||||
static CommandInfo cmdInfo_[256];
|
||||
|
||||
typedef std::list<int> DisplayListQueue;
|
||||
|
||||
int nextListID;
|
||||
@@ -377,7 +318,6 @@ protected:
|
||||
bool displayResized_ = false;
|
||||
bool renderResized_ = false;
|
||||
bool configChanged_ = false;
|
||||
bool sawExactEqualDepth_ = false;
|
||||
DrawType lastDraw_ = DRAW_UNKNOWN;
|
||||
GEPrimitiveType lastPrim_ = GE_PRIM_INVALID;
|
||||
|
||||
@@ -396,7 +336,7 @@ protected:
|
||||
|
||||
uint32_t edramTranslation_ = 0x400;
|
||||
|
||||
// Whe matrix data overflows, the CPU visible values wrap and bleed between matrices.
|
||||
// When matrix data overflows, the CPU visible values wrap and bleed between matrices.
|
||||
// But this doesn't actually change the values used by rendering.
|
||||
// The CPU visible values affect the GPU when list contexts are restored.
|
||||
// Note: not maintained by all backends, here for save stating.
|
||||
@@ -415,7 +355,6 @@ protected:
|
||||
std::string reportingFullInfo_;
|
||||
|
||||
private:
|
||||
void CheckDepthUsage(VirtualFramebuffer *vfb);
|
||||
void DoExecuteCall(u32 target);
|
||||
void PopDLQueue();
|
||||
void CheckDrawSync();
|
||||
@@ -427,10 +366,3 @@ private:
|
||||
|
||||
int lastVsync_ = -1;
|
||||
};
|
||||
|
||||
struct CommonCommandTableEntry {
|
||||
uint8_t cmd;
|
||||
uint8_t flags;
|
||||
uint64_t dirty;
|
||||
GPUCommon::CmdFunc func;
|
||||
};
|
||||
+1048
-21
File diff suppressed because it is too large.
Load diff
+52
-2
@@ -13,16 +13,64 @@ public:
|
||||
void DoState(PointerWrap &p) override;
|
||||
void DeviceLost() override;
|
||||
|
||||
void BeginFrame() override;
|
||||
|
||||
u32 CheckGPUFeatures() const override;
|
||||
|
||||
// From GPUDebugInterface.
|
||||
bool GetCurrentFramebuffer(GPUDebugBuffer &buffer, GPUDebugFramebufferType type, int maxRes) override;
|
||||
bool GetCurrentDepthbuffer(GPUDebugBuffer &buffer) override;
|
||||
bool GetCurrentStencilbuffer(GPUDebugBuffer &buffer) override;
|
||||
bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override;
|
||||
bool GetCurrentTexture(GPUDebugBuffer &buffer, int level, bool *isFramebuffer) override;
|
||||
bool GetCurrentClut(GPUDebugBuffer &buffer) override;
|
||||
|
||||
// Using string because it's generic - makes no assumptions on the size of the shader IDs of this backend.
|
||||
std::vector<std::string> DebugGetShaderIDs(DebugShaderType shader) override;
|
||||
std::string DebugGetShaderString(std::string id, DebugShaderType shader, DebugShaderStringType stringType) override;
|
||||
|
||||
void SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format) override;
|
||||
void InvalidateCache(u32 addr, int size, GPUInvalidationType type) override;
|
||||
|
||||
bool FramebufferDirty() override;
|
||||
bool FramebufferReallyDirty() override;
|
||||
|
||||
void Execute_VertexType(u32 op, u32 diff);
|
||||
void Execute_VertexTypeSkinning(u32 op, u32 diff);
|
||||
|
||||
void Execute_Prim(u32 op, u32 diff);
|
||||
void Execute_Bezier(u32 op, u32 diff);
|
||||
void Execute_Spline(u32 op, u32 diff);
|
||||
void Execute_BlockTransferStart(u32 op, u32 diff);
|
||||
|
||||
void Execute_TexSize0(u32 op, u32 diff);
|
||||
void Execute_TexLevel(u32 op, u32 diff);
|
||||
void Execute_LoadClut(u32 op, u32 diff);
|
||||
|
||||
void Execute_WorldMtxNum(u32 op, u32 diff);
|
||||
void Execute_WorldMtxData(u32 op, u32 diff);
|
||||
void Execute_ViewMtxNum(u32 op, u32 diff);
|
||||
void Execute_ViewMtxData(u32 op, u32 diff);
|
||||
void Execute_ProjMtxNum(u32 op, u32 diff);
|
||||
void Execute_ProjMtxData(u32 op, u32 diff);
|
||||
void Execute_TgenMtxNum(u32 op, u32 diff);
|
||||
void Execute_TgenMtxData(u32 op, u32 diff);
|
||||
void Execute_BoneMtxNum(u32 op, u32 diff);
|
||||
void Execute_BoneMtxData(u32 op, u32 diff);
|
||||
|
||||
typedef void (GPUCommonHW::*CmdFunc)(u32 op, u32 diff);
|
||||
|
||||
void FastRunLoop(DisplayList &list) override;
|
||||
void ExecuteOp(u32 op, u32 diff) override;
|
||||
|
||||
private:
|
||||
void CheckDepthUsage(VirtualFramebuffer *vfb);
|
||||
void CheckFlushOp(int cmd, u32 diff);
|
||||
|
||||
protected:
|
||||
void UpdateCmdInfo() override;
|
||||
|
||||
void PreExecuteOp(u32 op, u32 diff);
|
||||
void PreExecuteOp(u32 op, u32 diff) override;
|
||||
void ClearCacheNextFrame() override;
|
||||
|
||||
// Needs to be called on GPU thread, not reporting thread.
|
||||
@@ -30,7 +78,9 @@ protected:
|
||||
void UpdateMSAALevel(Draw::DrawContext *draw) override;
|
||||
|
||||
void CheckRenderResized() override;
|
||||
u32 CheckGPUFeaturesLate(u32 features) const;
|
||||
|
||||
int msaaLevel_ = 0;
|
||||
bool sawExactEqualDepth_ = false;
|
||||
ShaderManagerCommon *shaderManager_ = nullptr;
|
||||
};
|
||||
|
||||
@@ -983,11 +983,21 @@ void DrawEngineVulkan::DoFlush() {
|
||||
}
|
||||
} else if (result.action == SW_CLEAR) {
|
||||
// Note: we won't get here if the clear is alpha but not color, or color but not alpha.
|
||||
|
||||
// We let the framebuffer manager handle the clear. It can use renderpasses to optimize on tilers.
|
||||
// If non-buffered though, it'll just do a plain clear.
|
||||
framebufferManager_->NotifyClear(gstate.isClearModeColorMask(), gstate.isClearModeAlphaMask(), gstate.isClearModeDepthMask(), result.color, result.depth);
|
||||
|
||||
bool clearColor = gstate.isClearModeColorMask();
|
||||
bool clearAlpha = gstate.isClearModeAlphaMask(); // and stencil
|
||||
bool clearDepth = gstate.isClearModeDepthMask();
|
||||
int mask = 0;
|
||||
// The Clear detection takes care of doing a regular draw instead if separate masking
|
||||
// of color and alpha is needed, so we can just treat them as the same.
|
||||
if (clearColor || clearAlpha) mask |= Draw::FBChannel::FB_COLOR_BIT;
|
||||
if (clearDepth) mask |= Draw::FBChannel::FB_DEPTH_BIT;
|
||||
if (clearAlpha) mask |= Draw::FBChannel::FB_STENCIL_BIT;
|
||||
// Note that since the alpha channel and the stencil channel are shared on the PSP,
|
||||
// when we clear alpha, we also clear stencil to the same value.
|
||||
draw_->Clear(mask, result.color, result.depth, result.color >> 24);
|
||||
if (clearColor || clearAlpha) {
|
||||
framebufferManager_->SetColorUpdated(gstate_c.skipDrawReason);
|
||||
}
|
||||
if (gstate_c.Use(GPU_USE_CLEAR_RAM_HACK) && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
int scissorX1 = gstate.getScissorX1();
|
||||
int scissorY1 = gstate.getScissorY1();
|
||||
|
||||
@@ -26,22 +26,3 @@ FramebufferManagerVulkan::FramebufferManagerVulkan(Draw::DrawContext *draw) :
|
||||
FramebufferManagerCommon(draw) {
|
||||
presentation_->SetLanguage(GLSL_VULKAN);
|
||||
}
|
||||
|
||||
void FramebufferManagerVulkan::NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth) {
|
||||
int mask = 0;
|
||||
// The Clear detection takes care of doing a regular draw instead if separate masking
|
||||
// of color and alpha is needed, so we can just treat them as the same.
|
||||
if (clearColor || clearAlpha)
|
||||
mask |= Draw::FBChannel::FB_COLOR_BIT;
|
||||
if (clearDepth)
|
||||
mask |= Draw::FBChannel::FB_DEPTH_BIT;
|
||||
if (clearAlpha)
|
||||
mask |= Draw::FBChannel::FB_STENCIL_BIT;
|
||||
|
||||
// Note that since the alpha channel and the stencil channel are shared on the PSP,
|
||||
// when we clear alpha, we also clear stencil to the same value.
|
||||
draw_->Clear(mask, color, depth, color >> 24);
|
||||
if (clearColor || clearAlpha) {
|
||||
SetColorUpdated(gstate_c.skipDrawReason);
|
||||
}
|
||||
}
|
||||
@@ -25,8 +25,4 @@
|
||||
class FramebufferManagerVulkan : public FramebufferManagerCommon {
|
||||
public:
|
||||
explicit FramebufferManagerVulkan(Draw::DrawContext *draw);
|
||||
|
||||
// If within a render pass, this will just issue a regular clear. If beginning a new render pass,
|
||||
// do that.
|
||||
void NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth);
|
||||
};
|
||||
Reference in new issue
Block a user