Skip to content

Commit

Permalink
GPU: Move hw transform decision to draw engine.
Browse files Browse the repository at this point in the history
  • Loading branch information
unknownbrackets committed Apr 4, 2020
1 parent c42fb72 commit 30ede82
Show file tree
Hide file tree
Showing 13 changed files with 31 additions and 32 deletions.
13 changes: 13 additions & 0 deletions GPU/Common/DrawEngineCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,19 @@ void DrawEngineCommon::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim,
}
}

bool DrawEngineCommon::CanUseHardwareTransform(int prim) {
if (!g_Config.bHardwareTransform)
return false;
return !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES;
}

bool DrawEngineCommon::CanUseHardwareTessellation(GEPatchPrimType prim) {
if (g_Config.bHardwareTessellation && !g_Config.bSoftwareRendering) {
return CanUseHardwareTransform(PatchPrimToPrim(prim));
}
return false;
}

void TessellationDataTransfer::CopyControlPoints(float *pos, float *tex, float *col, int posStride, int texStride, int colStride, const SimpleVertex *const *points, int size, u32 vertType) {
bool hasColor = (vertType & GE_VTYPE_COL_MASK) != 0;
bool hasTexCoord = (vertType & GE_VTYPE_TC_MASK) != 0;
Expand Down
3 changes: 3 additions & 0 deletions GPU/Common/DrawEngineCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ class DrawEngineCommon {
void SubmitCurve(const void *control_points, const void *indices, Surface &surface, u32 vertType, int *bytesRead, const char *scope);
void ClearSplineBezierWeights();

bool CanUseHardwareTransform(int prim);
bool CanUseHardwareTessellation(GEPatchPrimType prim);

std::vector<std::string> DebugGetVertexLoaderIDs();
std::string DebugGetVertexLoaderString(std::string id, DebugShaderStringType stringType);

Expand Down
6 changes: 0 additions & 6 deletions GPU/Common/GPUStateUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,6 @@

#include "GPU/Common/GPUStateUtils.h"

bool CanUseHardwareTransform(int prim) {
if (!g_Config.bHardwareTransform)
return false;
return !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES;
}

bool IsStencilTestOutputDisabled() {
// The mask applies on all stencil ops.
if (gstate.isStencilTestEnabled() && (gstate.pmska & 0xFF) != 0xFF) {
Expand Down
1 change: 0 additions & 1 deletion GPU/Common/GPUStateUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ StencilValueType ReplaceAlphaWithStencilType();
ReplaceAlphaType ReplaceAlphaWithStencil(ReplaceBlendType replaceBlend);
ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bufferFormat);

bool CanUseHardwareTransform(int prim);
LogicOpReplaceType ReplaceLogicOpType();


Expand Down
7 changes: 0 additions & 7 deletions GPU/Common/SplineCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,6 @@
#include "GPU/ge_constants.h"
#include "GPU/GPUState.h" // only needed for UVScale stuff

bool CanUseHardwareTessellation(GEPatchPrimType prim) {
if (g_Config.bHardwareTessellation && !g_Config.bSoftwareRendering) {
return CanUseHardwareTransform(PatchPrimToPrim(prim));
}
return false;
}

class SimpleBufferManager {
private:
u8 *buf_;
Expand Down
2 changes: 0 additions & 2 deletions GPU/Common/SplineCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,6 @@ void SoftwareTessellation(OutputBuffers &output, const Surface &surface, u32 ori

} // namespace Spline

bool CanUseHardwareTessellation(GEPatchPrimType prim);

// Define function object for TemplateParameterDispatcher
#define TEMPLATE_PARAMETER_DISPATCHER_FUNCTION(NAME, FUNCNAME, FUNCTYPE) \
struct NAME { \
Expand Down
6 changes: 3 additions & 3 deletions GPU/Directx9/DrawEngineDX9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ void DrawEngineDX9::DoFlush() {
GEPrimitiveType prim = prevPrim_;
ApplyDrawState(prim);

VSShader *vshader = shaderManager_->ApplyShader(prim, lastVType_);
VSShader *vshader = shaderManager_->ApplyShader(CanUseHardwareTransform(prim), lastVType_);

if (vshader->UseHWTransform()) {
LPDIRECT3DVERTEXBUFFER9 vb_ = NULL;
Expand Down Expand Up @@ -491,7 +491,7 @@ void DrawEngineDX9::DoFlush() {
}

ApplyDrawStateLate();
vshader = shaderManager_->ApplyShader(prim, lastVType_);
vshader = shaderManager_->ApplyShader(CanUseHardwareTransform(prim), lastVType_);
IDirect3DVertexDeclaration9 *pHardwareVertexDecl = SetupDecFmtForDraw(vshader, dec_->GetDecVtxFmt(), dec_->VertexType());

if (pHardwareVertexDecl) {
Expand Down Expand Up @@ -552,7 +552,7 @@ void DrawEngineDX9::DoFlush() {
maxIndex, drawBuffer, numTrans, drawIndexed, &params, &result);

ApplyDrawStateLate();
vshader = shaderManager_->ApplyShader(prim, lastVType_);
vshader = shaderManager_->ApplyShader(CanUseHardwareTransform(prim), lastVType_);

if (result.action == SW_DRAW_PRIMITIVES) {
if (result.setStencil) {
Expand Down
4 changes: 2 additions & 2 deletions GPU/Directx9/ShaderManagerDX9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,10 +546,10 @@ void ShaderManagerDX9::DirtyLastShader() { // disables vertex arrays
lastPShader_ = nullptr;
}

VSShader *ShaderManagerDX9::ApplyShader(int prim, u32 vertType) {
VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, u32 vertType) {
// Always use software for flat shading to fix the provoking index.
bool tess = gstate_c.bezier || gstate_c.spline;
bool useHWTransform = CanUseHardwareTransform(prim) && (tess || gstate.getShadeMode() != GE_SHADE_FLAT);
useHWTransform = useHWTransform && (tess || gstate.getShadeMode() != GE_SHADE_FLAT);

VShaderID VSID;
if (gstate_c.IsDirty(DIRTY_VERTEXSHADER_STATE)) {
Expand Down
2 changes: 1 addition & 1 deletion GPU/Directx9/ShaderManagerDX9.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class ShaderManagerDX9 : public ShaderManagerCommon {
~ShaderManagerDX9();

void ClearCache(bool deleteThem); // TODO: deleteThem currently not respected
VSShader *ApplyShader(int prim, u32 vertType);
VSShader *ApplyShader(bool useHWTransform, u32 vertType);
void DirtyShader();
void DirtyLastShader() override;

Expand Down
6 changes: 3 additions & 3 deletions GPU/GLES/DrawEngineGLES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ void DrawEngineGLES::DoFlush() {
GEPrimitiveType prim = prevPrim_;

VShaderID vsid;
Shader *vshader = shaderManager_->ApplyVertexShader(prim, lastVType_, &vsid);
Shader *vshader = shaderManager_->ApplyVertexShader(CanUseHardwareTransform(prim), lastVType_, &vsid);

GLRBuffer *vertexBuffer = nullptr;
GLRBuffer *indexBuffer = nullptr;
Expand Down Expand Up @@ -511,7 +511,7 @@ void DrawEngineGLES::DoFlush() {
ApplyDrawState(prim);
ApplyDrawStateLate(false, 0);

LinkedShader *program = shaderManager_->ApplyFragmentShader(vsid, vshader, lastVType_, prim, framebufferManager_->UseBufferedRendering());
LinkedShader *program = shaderManager_->ApplyFragmentShader(vsid, vshader, lastVType_, framebufferManager_->UseBufferedRendering());
GLRInputLayout *inputLayout = SetupDecFmtForDraw(program, dec_->GetDecVtxFmt());
render_->BindVertexBuffer(inputLayout, vertexBuffer, vertexBufferOffset);
if (useElements) {
Expand Down Expand Up @@ -576,7 +576,7 @@ void DrawEngineGLES::DoFlush() {

ApplyDrawStateLate(result.setStencil, result.stencilValue);

LinkedShader *program = shaderManager_->ApplyFragmentShader(vsid, vshader, lastVType_, prim, framebufferManager_->UseBufferedRendering());
LinkedShader *program = shaderManager_->ApplyFragmentShader(vsid, vshader, lastVType_, framebufferManager_->UseBufferedRendering());

if (result.action == SW_DRAW_PRIMITIVES) {
const int vertexSize = sizeof(transformed[0]);
Expand Down
5 changes: 2 additions & 3 deletions GPU/GLES/ShaderManagerGLES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -645,7 +645,7 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) {
return new Shader(render_, codeBuffer_, desc, GL_VERTEX_SHADER, useHWTransform, attrMask, uniformMask);
}

Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, VShaderID *VSID) {
Shader *ShaderManagerGLES::ApplyVertexShader(bool useHWTransform, u32 vertType, VShaderID *VSID) {
uint64_t dirty = gstate_c.GetDirtyUniforms();
if (dirty) {
if (lastShader_)
Expand All @@ -656,7 +656,6 @@ Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, VShaderID *

if (gstate_c.IsDirty(DIRTY_VERTEXSHADER_STATE)) {
gstate_c.Clean(DIRTY_VERTEXSHADER_STATE);
bool useHWTransform = CanUseHardwareTransform(prim);
ComputeVertexShaderID(VSID, vertType, useHWTransform);
} else {
*VSID = lastVSID_;
Expand Down Expand Up @@ -698,7 +697,7 @@ Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, VShaderID *
return vs;
}

LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, u32 vertType, int prim, bool useBufferedRendering) {
LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, u32 vertType, bool useBufferedRendering) {
FShaderID FSID;
if (gstate_c.IsDirty(DIRTY_FRAGMENTSHADER_STATE)) {
gstate_c.Clean(DIRTY_FRAGMENTSHADER_STATE);
Expand Down
4 changes: 2 additions & 2 deletions GPU/GLES/ShaderManagerGLES.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ class ShaderManagerGLES : public ShaderManagerCommon {

// This is the old ApplyShader split into two parts, because of annoying information dependencies.
// If you call ApplyVertexShader, you MUST call ApplyFragmentShader soon afterwards.
Shader *ApplyVertexShader(int prim, u32 vertType, VShaderID *VSID);
LinkedShader *ApplyFragmentShader(VShaderID VSID, Shader *vs, u32 vertType, int prim, bool useBufferedRendering);
Shader *ApplyVertexShader(bool useHWTransform, u32 vertType, VShaderID *VSID);
LinkedShader *ApplyFragmentShader(VShaderID VSID, Shader *vs, u32 vertType, bool useBufferedRendering);

void DeviceLost();
void DeviceRestore(Draw::DrawContext *draw);
Expand Down
4 changes: 2 additions & 2 deletions GPU/GPUCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1803,7 +1803,7 @@ void GPUCommon::Execute_Bezier(u32 op, u32 diff) {

SetDrawType(DRAW_BEZIER, PatchPrimToPrim(surface.primType));

if (CanUseHardwareTessellation(surface.primType)) {
if (drawEngineCommon_->CanUseHardwareTessellation(surface.primType)) {
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE);
gstate_c.bezier = true;
if (gstate_c.spline_num_points_u != surface.num_points_u) {
Expand Down Expand Up @@ -1869,7 +1869,7 @@ void GPUCommon::Execute_Spline(u32 op, u32 diff) {

SetDrawType(DRAW_SPLINE, PatchPrimToPrim(surface.primType));

if (CanUseHardwareTessellation(surface.primType)) {
if (drawEngineCommon_->CanUseHardwareTessellation(surface.primType)) {
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE);
gstate_c.spline = true;
if (gstate_c.spline_num_points_u != surface.num_points_u) {
Expand Down

0 comments on commit 30ede82

Please sign in to comment.