mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
[spline/bezier]Expand shader dirty flags to 64 bit, and add some flags for hardware tessellation.
This commit is contained in:
parent
52f86cf61b
commit
38293adc78
2 changed files with 91 additions and 43 deletions
|
@ -413,7 +413,7 @@ void LinkedShader::stop() {
|
|||
}
|
||||
|
||||
void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid) {
|
||||
u32 dirty = dirtyUniforms & availableUniforms;
|
||||
u64 dirty = dirtyUniforms & availableUniforms;
|
||||
dirtyUniforms = 0;
|
||||
if (!dirty)
|
||||
return;
|
||||
|
@ -707,7 +707,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid) {
|
|||
}
|
||||
|
||||
ShaderManager::ShaderManager()
|
||||
: lastShader_(nullptr), globalDirty_(0xFFFFFFFF), shaderSwitchDirty_(0), diskCacheDirty_(false) {
|
||||
: lastShader_(nullptr), globalDirty_(DIRTY_ALL), shaderSwitchDirty_(0), diskCacheDirty_(false) {
|
||||
codeBuffer_ = new char[16384];
|
||||
lastFSID_.set_invalid();
|
||||
lastVSID_.set_invalid();
|
||||
|
@ -731,7 +731,7 @@ void ShaderManager::Clear() {
|
|||
linkedShaderCache_.clear();
|
||||
fsCache_.clear();
|
||||
vsCache_.clear();
|
||||
globalDirty_ = 0xFFFFFFFF;
|
||||
globalDirty_ = DIRTY_ALL;
|
||||
lastFSID_.set_invalid();
|
||||
lastVSID_.set_invalid();
|
||||
DirtyShader();
|
||||
|
@ -747,7 +747,7 @@ void ShaderManager::DirtyShader() {
|
|||
lastFSID_.set_invalid();
|
||||
lastVSID_.set_invalid();
|
||||
DirtyLastShader();
|
||||
globalDirty_ = 0xFFFFFFFF;
|
||||
globalDirty_ = DIRTY_ALL;
|
||||
shaderSwitchDirty_ = 0;
|
||||
}
|
||||
|
||||
|
@ -847,7 +847,7 @@ LinkedShader *ShaderManager::ApplyFragmentShader(ShaderID VSID, Shader *vs, u32
|
|||
// Okay, we have both shaders. Let's see if there's a linked one.
|
||||
LinkedShader *ls = nullptr;
|
||||
|
||||
u32 switchDirty = shaderSwitchDirty_;
|
||||
u64 switchDirty = shaderSwitchDirty_;
|
||||
for (auto iter = linkedShaderCache_.begin(); iter != linkedShaderCache_.end(); ++iter) {
|
||||
// Deferred dirtying! Let's see if we can make this even more clever later.
|
||||
iter->ls->dirtyUniforms |= switchDirty;
|
||||
|
|
|
@ -55,8 +55,8 @@ public:
|
|||
bool useHWTransform_;
|
||||
|
||||
uint32_t program;
|
||||
u32 availableUniforms;
|
||||
u32 dirtyUniforms;
|
||||
u64 availableUniforms;
|
||||
u64 dirtyUniforms;
|
||||
|
||||
// Present attributes in the shader.
|
||||
int attrMask; // 1 << ATTR_ ... or-ed together.
|
||||
|
@ -113,51 +113,99 @@ public:
|
|||
};
|
||||
|
||||
enum {
|
||||
DIRTY_PROJMATRIX = (1 << 0),
|
||||
DIRTY_PROJTHROUGHMATRIX = (1 << 1),
|
||||
DIRTY_FOGCOLOR = (1 << 2),
|
||||
DIRTY_FOGCOEF = (1 << 3),
|
||||
DIRTY_TEXENV = (1 << 4),
|
||||
DIRTY_ALPHACOLORREF = (1 << 5),
|
||||
_DIRTY_PROJMATRIX = 0,
|
||||
_DIRTY_PROJTHROUGHMATRIX = 1,
|
||||
_DIRTY_FOGCOLOR = 2,
|
||||
_DIRTY_FOGCOEF = 3,
|
||||
_DIRTY_TEXENV = 4,
|
||||
_DIRTY_ALPHACOLORREF = 5,
|
||||
|
||||
// 1 << 6 is free! Wait, not anymore...
|
||||
DIRTY_STENCILREPLACEVALUE = (1 << 6),
|
||||
_DIRTY_STENCILREPLACEVALUE = 6,
|
||||
|
||||
DIRTY_ALPHACOLORMASK = (1 << 7),
|
||||
DIRTY_LIGHT0 = (1 << 8),
|
||||
DIRTY_LIGHT1 = (1 << 9),
|
||||
DIRTY_LIGHT2 = (1 << 10),
|
||||
DIRTY_LIGHT3 = (1 << 11),
|
||||
_DIRTY_ALPHACOLORMASK = 7,
|
||||
_DIRTY_LIGHT0 = 8,
|
||||
_DIRTY_LIGHT1 = 9,
|
||||
_DIRTY_LIGHT2 = 10,
|
||||
_DIRTY_LIGHT3 = 11,
|
||||
|
||||
DIRTY_MATDIFFUSE = (1 << 12),
|
||||
DIRTY_MATSPECULAR = (1 << 13),
|
||||
DIRTY_MATEMISSIVE = (1 << 14),
|
||||
DIRTY_AMBIENT = (1 << 15),
|
||||
DIRTY_MATAMBIENTALPHA = (1 << 16),
|
||||
_DIRTY_MATDIFFUSE = 12,
|
||||
_DIRTY_MATSPECULAR = 13,
|
||||
_DIRTY_MATEMISSIVE = 14,
|
||||
_DIRTY_AMBIENT = 15,
|
||||
_DIRTY_MATAMBIENTALPHA = 16,
|
||||
|
||||
DIRTY_SHADERBLEND = (1 << 17), // Used only for in-shader blending.
|
||||
_DIRTY_SHADERBLEND = 17, // Used only for in-shader blending.
|
||||
|
||||
DIRTY_UVSCALEOFFSET = (1 << 18), // this will be dirtied ALL THE TIME... maybe we'll need to do "last value with this shader compares"
|
||||
_DIRTY_UVSCALEOFFSET = 18, // this will be dirtied ALL THE TIME... maybe we'll need to do "last value with this shader compares"
|
||||
|
||||
// Texclamp is fairly rare so let's share it's bit with DIRTY_DEPTHRANGE.
|
||||
DIRTY_TEXCLAMP = (1 << 19),
|
||||
DIRTY_DEPTHRANGE = (1 << 19),
|
||||
_DIRTY_TEXCLAMP = 19,
|
||||
_DIRTY_DEPTHRANGE = 19,
|
||||
|
||||
DIRTY_WORLDMATRIX = (1 << 21),
|
||||
DIRTY_VIEWMATRIX = (1 << 22), // Maybe we'll fold this into projmatrix eventually
|
||||
DIRTY_TEXMATRIX = (1 << 23),
|
||||
DIRTY_BONEMATRIX0 = (1 << 24),
|
||||
DIRTY_BONEMATRIX1 = (1 << 25),
|
||||
DIRTY_BONEMATRIX2 = (1 << 26),
|
||||
DIRTY_BONEMATRIX3 = (1 << 27),
|
||||
DIRTY_BONEMATRIX4 = (1 << 28),
|
||||
DIRTY_BONEMATRIX5 = (1 << 29),
|
||||
DIRTY_BONEMATRIX6 = (1 << 30),
|
||||
DIRTY_BONEMATRIX7 = (1 << 31),
|
||||
_DIRTY_WORLDMATRIX = 21,
|
||||
_DIRTY_VIEWMATRIX = 22, // Maybe we'll fold this into projmatrix eventually
|
||||
_DIRTY_TEXMATRIX = 23,
|
||||
_DIRTY_BONEMATRIX0 = 24,
|
||||
_DIRTY_BONEMATRIX1 = 25,
|
||||
_DIRTY_BONEMATRIX2 = 26,
|
||||
_DIRTY_BONEMATRIX3 = 27,
|
||||
_DIRTY_BONEMATRIX4 = 28,
|
||||
_DIRTY_BONEMATRIX5 = 29,
|
||||
_DIRTY_BONEMATRIX6 = 30,
|
||||
_DIRTY_BONEMATRIX7 = 31,
|
||||
|
||||
DIRTY_ALL = 0xFFFFFFFF
|
||||
_DIRTY_BEZIERCOUNTU = 32, // Used only for hardware tessellation
|
||||
_DIRTY_SPLINECOUNTU = 33, // Used only for hardware tessellation
|
||||
_DIRTY_SPLINECOUNTV = 34, // Used only for hardware tessellation
|
||||
_DIRTY_SPLINETYPEU = 35, // Used only for hardware tessellation
|
||||
_DIRTY_SPLINETYPEV = 36, // Used only for hardware tessellation
|
||||
|
||||
__END_OF_LINE__DIRTY = 64,
|
||||
|
||||
DIRTY_ALL = -1
|
||||
};
|
||||
|
||||
#define FLAG_BIT64(x) (1ULL << x)
|
||||
|
||||
#define DIRTY_PROJMATRIX FLAG_BIT64(_DIRTY_PROJMATRIX)
|
||||
#define DIRTY_PROJTHROUGHMATRIX FLAG_BIT64(_DIRTY_PROJTHROUGHMATRIX)
|
||||
#define DIRTY_FOGCOLOR FLAG_BIT64(_DIRTY_FOGCOLOR)
|
||||
#define DIRTY_FOGCOEF FLAG_BIT64(_DIRTY_FOGCOEF)
|
||||
#define DIRTY_TEXENV FLAG_BIT64(_DIRTY_TEXENV)
|
||||
#define DIRTY_ALPHACOLORREF FLAG_BIT64(_DIRTY_ALPHACOLORREF)
|
||||
#define DIRTY_STENCILREPLACEVALUE FLAG_BIT64(_DIRTY_STENCILREPLACEVALUE)
|
||||
#define DIRTY_ALPHACOLORMASK FLAG_BIT64(_DIRTY_ALPHACOLORMASK)
|
||||
#define DIRTY_LIGHT0 FLAG_BIT64(_DIRTY_LIGHT0)
|
||||
#define DIRTY_LIGHT1 FLAG_BIT64(_DIRTY_LIGHT1)
|
||||
#define DIRTY_LIGHT2 FLAG_BIT64(_DIRTY_LIGHT2)
|
||||
#define DIRTY_LIGHT3 FLAG_BIT64(_DIRTY_LIGHT3)
|
||||
#define DIRTY_MATDIFFUSE FLAG_BIT64(_DIRTY_MATDIFFUSE)
|
||||
#define DIRTY_MATSPECULAR FLAG_BIT64(_DIRTY_MATSPECULAR)
|
||||
#define DIRTY_MATEMISSIVE FLAG_BIT64(_DIRTY_MATEMISSIVE)
|
||||
#define DIRTY_AMBIENT FLAG_BIT64(_DIRTY_AMBIENT)
|
||||
#define DIRTY_MATAMBIENTALPHA FLAG_BIT64(_DIRTY_MATAMBIENTALPHA)
|
||||
#define DIRTY_SHADERBLEND FLAG_BIT64(_DIRTY_SHADERBLEND)
|
||||
#define DIRTY_UVSCALEOFFSET FLAG_BIT64(_DIRTY_UVSCALEOFFSET)
|
||||
#define DIRTY_TEXCLAMP FLAG_BIT64(_DIRTY_TEXCLAMP)
|
||||
#define DIRTY_DEPTHRANGE FLAG_BIT64(_DIRTY_DEPTHRANGE)
|
||||
#define DIRTY_WORLDMATRIX FLAG_BIT64(_DIRTY_WORLDMATRIX)
|
||||
#define DIRTY_VIEWMATRIX FLAG_BIT64(_DIRTY_VIEWMATRIX)
|
||||
#define DIRTY_TEXMATRIX FLAG_BIT64(_DIRTY_TEXMATRIX)
|
||||
#define DIRTY_BONEMATRIX0 FLAG_BIT64(_DIRTY_BONEMATRIX0)
|
||||
#define DIRTY_BONEMATRIX1 FLAG_BIT64(_DIRTY_BONEMATRIX1)
|
||||
#define DIRTY_BONEMATRIX2 FLAG_BIT64(_DIRTY_BONEMATRIX2)
|
||||
#define DIRTY_BONEMATRIX3 FLAG_BIT64(_DIRTY_BONEMATRIX3)
|
||||
#define DIRTY_BONEMATRIX4 FLAG_BIT64(_DIRTY_BONEMATRIX4)
|
||||
#define DIRTY_BONEMATRIX5 FLAG_BIT64(_DIRTY_BONEMATRIX5)
|
||||
#define DIRTY_BONEMATRIX6 FLAG_BIT64(_DIRTY_BONEMATRIX6)
|
||||
#define DIRTY_BONEMATRIX7 FLAG_BIT64(_DIRTY_BONEMATRIX7)
|
||||
#define DIRTY_BEZIERCOUNTU FLAG_BIT64(_DIRTY_BEZIERCOUNTU)
|
||||
#define DIRTY_SPLINECOUNTU FLAG_BIT64(_DIRTY_SPLINECOUNTU)
|
||||
#define DIRTY_SPLINECOUNTV FLAG_BIT64(_DIRTY_SPLINECOUNTV)
|
||||
#define DIRTY_SPLINETYPEU FLAG_BIT64(_DIRTY_SPLINETYPEU)
|
||||
#define DIRTY_SPLINETYPEV FLAG_BIT64(_DIRTY_SPLINETYPEV)
|
||||
|
||||
// Real public interface
|
||||
|
||||
class Shader {
|
||||
|
@ -191,7 +239,7 @@ public:
|
|||
LinkedShader *ApplyFragmentShader(ShaderID VSID, Shader *vs, u32 vertType, int prim);
|
||||
|
||||
void DirtyShader();
|
||||
void DirtyUniform(u32 what) {
|
||||
void DirtyUniform(u64 what) {
|
||||
globalDirty_ |= what;
|
||||
}
|
||||
void DirtyLastShader(); // disables vertex arrays
|
||||
|
@ -229,8 +277,8 @@ private:
|
|||
ShaderID lastVSID_;
|
||||
|
||||
LinkedShader *lastShader_;
|
||||
u32 globalDirty_;
|
||||
u32 shaderSwitchDirty_;
|
||||
u64 globalDirty_;
|
||||
u64 shaderSwitchDirty_;
|
||||
char *codeBuffer_;
|
||||
|
||||
typedef std::map<ShaderID, Shader *> FSCache;
|
||||
|
|
Loading…
Add table
Reference in a new issue