[spline/bezier]Expand shader dirty flags to 64 bit, and add some flags for hardware tessellation.

This commit is contained in:
xebra 2017-01-08 23:01:01 +09:00 committed by Henrik Rydgård
parent 52f86cf61b
commit 38293adc78
2 changed files with 91 additions and 43 deletions

View file

@ -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;

View file

@ -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;