11 #ifndef hifi_gpu_State_h
12 #define hifi_gpu_State_h
19 #include <unordered_map>
28 #define SET_FIELD(FIELD, PATH, value) \
30 _values.PATH = value; \
31 if (value == DEFAULT.PATH) { \
32 _signature.reset(FIELD); \
34 _signature.set(FIELD); \
115 BLEND_OP_REV_SUBTRACT,
129 WRITE_ALL = (WRITE_RED | WRITE_GREEN | WRITE_BLUE | WRITE_ALPHA),
141 ComparisonFunction
function{ ComparisonFunction::LESS };
168 bool operator==(
const DepthTest& right)
const {
172 function == right.function;
175 bool operator!=(
const DepthTest& right)
const {
176 return !(*
this == right);
179 operator QString()
const {
180 return QString(
"{ writeMask = %1, enabled = %2, function = %3 }").arg(
writeMask).arg(
enabled).arg((uint8_t)
function);
186 ComparisonFunction
function;
188 StencilOp depthFailOp;
191 uint8 readMask{ 0xff };
202 StencilTest(int8 reference = 0,
203 uint8 readMask = 0xFF,
204 ComparisonFunction func = ComparisonFunction::ALWAYS,
205 StencilOp failOp = STENCIL_OP_KEEP,
206 StencilOp depthFailOp = STENCIL_OP_KEEP,
207 StencilOp passOp = STENCIL_OP_KEEP) :
209 failOp(failOp), depthFailOp(depthFailOp), passOp(passOp), reference(reference), readMask(readMask) {}
214 ComparisonFunction getFunction()
const {
return function; }
219 StencilOp getFailOp()
const {
return failOp; }
224 StencilOp getDepthFailOp()
const {
return depthFailOp; }
229 StencilOp getPassOp()
const {
return passOp; }
234 int8 getReference()
const {
return reference; }
239 uint8 getReadMask()
const {
return readMask; }
241 bool operator==(
const StencilTest& right)
const {
243 function == right.function &&
244 failOp == right.failOp &&
245 depthFailOp == right.depthFailOp &&
246 passOp == right.passOp &&
247 reference == right.reference &&
248 readMask == right.readMask;
252 bool operator!=(
const StencilTest &right)
const {
return !(right==*
this); }
256 struct StencilActivation {
257 uint8 frontWriteMask = 0xFF;
258 uint8 backWriteMask = 0xFF;
267 StencilActivation(
bool enabled =
false, uint8 frontWriteMask = 0xFF, uint8 backWriteMask = 0xFF) :
268 frontWriteMask(frontWriteMask), backWriteMask(backWriteMask), enabled(enabled) {}
273 bool isEnabled()
const {
return enabled; }
278 uint8 getWriteMaskFront()
const {
return frontWriteMask; }
283 uint8 getWriteMaskBack()
const {
return backWriteMask; }
285 bool operator==(
const StencilActivation& right)
const {
287 frontWriteMask == right.frontWriteMask &&
288 backWriteMask == right.backWriteMask &&
289 enabled == right.enabled;
292 bool operator!=(
const StencilActivation& right)
const {
293 return !(*
this == right);
334 BlendOp operationColor,
335 BlendArg destinationColor,
337 BlendOp operationAlpha,
338 BlendArg destinationAlpha) :
350 BlendFunction(
bool enabled =
false, BlendArg source = ONE, BlendOp operation = BLEND_OP_ADD, BlendArg destination = ZERO) :
401 return !(*
this == right);
408 frontFaceClockwise(
false), depthClampEnable(
false), scissorEnable(
false), multisampleEnable(
false),
409 antialisedLineEnable(
true), alphaToCoverageEnable(
false) {}
410 bool frontFaceClockwise;
411 bool depthClampEnable;
413 bool multisampleEnable;
414 bool antialisedLineEnable;
415 bool alphaToCoverageEnable;
418 bool operator==(
const Flags& right)
const {
420 frontFaceClockwise == right.frontFaceClockwise &&
421 depthClampEnable == right.depthClampEnable &&
422 scissorEnable == right.scissorEnable &&
423 multisampleEnable == right.multisampleEnable &&
424 antialisedLineEnable == right.antialisedLineEnable &&
425 alphaToCoverageEnable == right.alphaToCoverageEnable;
429 bool operator!=(
const Flags& right)
const {
430 return !(*
this == right);
441 float depthBias = 0.0f;
442 float depthBiasSlopeScale = 0.0f;
445 StencilActivation stencilActivation;
446 StencilTest stencilTestFront;
447 StencilTest stencilTestBack;
448 uint32 sampleMask = 0xFFFFFFFF;
450 FillMode fillMode{ FILL_FACE };
451 CullMode cullMode{ CULL_NONE };
452 ColorMask colorWriteMask{ WRITE_ALL };
460 std::string
getKey()
const;
464 void setFillMode(FillMode fill) { SET_FIELD(FILL_MODE, fillMode, fill); }
465 FillMode getFillMode()
const {
return _values.fillMode; }
467 void setCullMode(CullMode cull) { SET_FIELD(CULL_MODE, cullMode, cull); }
468 CullMode getCullMode()
const {
return _values.cullMode; }
475 void setFrontFaceClockwise(
bool isClockwise) { SET_FIELD(FRONT_FACE_CLOCKWISE, flags.frontFaceClockwise, isClockwise); }
476 bool isFrontFaceClockwise()
const {
return _values.flags.frontFaceClockwise; }
478 void setDepthClampEnable(
bool enable) { SET_FIELD(DEPTH_CLAMP_ENABLE, flags.depthClampEnable, enable); }
479 bool isDepthClampEnable()
const {
return _values.flags.depthClampEnable; }
481 void setScissorEnable(
bool enable) { SET_FIELD(SCISSOR_ENABLE, flags.scissorEnable, enable); }
482 bool isScissorEnable()
const {
return _values.flags.scissorEnable; }
484 void setMultisampleEnable(
bool enable) { SET_FIELD(MULTISAMPLE_ENABLE, flags.multisampleEnable, enable); }
485 bool isMultisampleEnable()
const {
return _values.flags.multisampleEnable; }
487 void setAntialiasedLineEnable(
bool enable) { SET_FIELD(ANTIALISED_LINE_ENABLE, flags.antialisedLineEnable, enable); }
488 bool isAntialiasedLineEnable()
const {
return _values.flags.antialisedLineEnable; }
491 void setDepthBias(
float bias) { SET_FIELD(DEPTH_BIAS, depthBias, bias); }
492 float getDepthBias()
const {
return _values.depthBias; }
494 void setDepthBiasSlopeScale(
float scale) { SET_FIELD(DEPTH_BIAS_SLOPE_SCALE, depthBiasSlopeScale, scale); }
495 float getDepthBiasSlopeScale()
const {
return _values.depthBiasSlopeScale; }
498 void setDepthTest(DepthTest newDepthTest) { SET_FIELD(DEPTH_TEST, depthTest, newDepthTest); }
499 void setDepthTest(
bool enable,
bool writeMask, ComparisonFunction func) {
500 setDepthTest(DepthTest(enable, writeMask, func));
502 DepthTest getDepthTest()
const {
return _values.depthTest; }
504 bool isDepthTestEnabled()
const {
return getDepthTest().
isEnabled(); }
505 uint8 getDepthTestWriteMask()
const {
return getDepthTest().
getWriteMask(); }
506 ComparisonFunction getDepthTestFunc()
const {
return getDepthTest().
getFunction(); }
516 void setStencilTest(
bool enabled, uint8 frontWriteMask, StencilTest frontTest, uint8 backWriteMask, StencilTest backTest) {
517 SET_FIELD(STENCIL_ACTIVATION, stencilActivation, StencilActivation(enabled, frontWriteMask, backWriteMask));
518 SET_FIELD(STENCIL_TEST_FRONT, stencilTestFront, frontTest);
519 SET_FIELD(STENCIL_TEST_BACK, stencilTestBack, backTest);
528 setStencilTest(enabled, frontWriteMask, frontTest, frontWriteMask, frontTest);
531 StencilActivation getStencilActivation()
const {
return _values.stencilActivation; }
532 StencilTest getStencilTestFront()
const {
return _values.stencilTestFront; }
533 StencilTest getStencilTestBack()
const {
return _values.stencilTestBack; }
535 bool isStencilEnabled()
const {
return getStencilActivation().isEnabled(); }
536 uint8 getStencilWriteMaskFront()
const {
return getStencilActivation().getWriteMaskFront(); }
537 uint8 getStencilWriteMaskBack()
const {
return getStencilActivation().getWriteMaskBack(); }
540 void setAlphaToCoverageEnable(
bool enable) { SET_FIELD(ALPHA_TO_COVERAGE_ENABLE, flags.alphaToCoverageEnable, enable); }
541 bool isAlphaToCoverageEnabled()
const {
return _values.flags.alphaToCoverageEnable; }
550 void setSampleMask(uint32 mask) { SET_FIELD(SAMPLE_MASK, sampleMask, mask); }
561 void setBlendFunction(BlendFunction
function) { SET_FIELD(BLEND_FUNCTION, blendFunction,
function); }
562 const BlendFunction& getBlendFunction()
const {
return _values.blendFunction; }
574 BlendArg sourceColor,
575 BlendOp operationColor,
576 BlendArg destinationColor,
577 BlendArg sourceAlpha,
578 BlendOp operationAlpha,
579 BlendArg destinationAlpha) {
580 setBlendFunction(
BlendFunction(enabled, sourceColor, operationColor, destinationColor, sourceAlpha, operationAlpha,
590 void setBlendFunction(
bool enabled, BlendArg source, BlendOp operation, BlendArg destination) {
591 setBlendFunction(
BlendFunction(enabled, source, operation, destination));
594 bool isBlendEnabled()
const {
return getBlendFunction().
isEnabled(); }
611 ColorMask value = (ColorMask)((WRITE_RED * red) | (WRITE_GREEN * green) | (WRITE_BLUE * blue) | (WRITE_ALPHA * alpha));
612 SET_FIELD(COLOR_WRITE_MASK, colorWriteMask, value);
614 ColorMask getColorWriteMask()
const {
return _values.colorWriteMask; }
622 FRONT_FACE_CLOCKWISE,
626 ANTIALISED_LINE_ENABLE,
629 DEPTH_BIAS_SLOPE_SCALE,
639 ALPHA_TO_COVERAGE_ENABLE,
664 State(
const Data& values);
687 typedef std::shared_ptr<State> StatePointer;
688 typedef std::vector<StatePointer> States;
Definition: gpu/src/gpu/Forward.h:134
The Data class is the full explicit description of the State class fields value.
Definition: State.h:439
Represents setting for depth testing and writing.
Definition: State.h:133
uint8 enabled
Enable depth test.
Definition: State.h:139
uint8 getWriteMask() const
Definition: State.h:166
bool isEnabled() const
Definition: State.h:156
ComparisonFunction getFunction() const
Definition: State.h:161
DepthTest(bool enabled=false, bool writeMask=true, ComparisonFunction func=ComparisonFunction::LESS)
Definition: State.h:150
uint8 writeMask
Enable writing to the depth buffer.
Definition: State.h:136
Describes pipeline state.
Definition: State.h:44
void setStencilTest(bool enabled, uint8 frontWriteMask, StencilTest frontTest)
Definition: State.h:527
static Signature evalSignature(const Data &state)
Definition: State.cpp:27
uint32 getSampleMask() const
Definition: State.h:558
Stamp _stamp
Incremented on changes and used to determine if API-specific backend object needs updating.
Definition: State.h:684
static const Data DEFAULT
The unique default values for all the fields.
Definition: State.h:463
void setColorWriteMask(bool red, bool green, bool blue, bool alpha)
Sets which color channels can be written to.
Definition: State.h:610
const GPUObjectPointer gpuObject
Object representing state on the API-specific backend side.
Definition: State.h:672
void setBlendFunction(bool enabled, BlendArg source, BlendOp operation, BlendArg destination)
Definition: State.h:590
const Data & getValues() const
Definition: State.h:669
const Flags & getFlags() const
Definition: State.h:473
Field
Definition: State.h:619
void setColorWriteMask(ColorMask mask)
Definition: State.h:600
Signature _signature
Used to tell which fields have default values and which are changed.
Definition: State.h:681
Data _values
Full description of the state.
Definition: State.h:678
void setSampleMask(uint32 mask)
Definition: State.h:550
void setStencilTest(bool enabled, uint8 frontWriteMask, StencilTest frontTest, uint8 backWriteMask, StencilTest backTest)
Definition: State.h:516
std::string getKey() const
Definition: State.cpp:90
Signature getSignature() const
Definition: State.h:655
std::bitset< NUM_FIELDS > Signature
Definition: State.h:650
Stamp getStamp() const
Get the current stamp.
Definition: State.h:56
void setBlendFunction(bool enabled, BlendArg sourceColor, BlendOp operationColor, BlendArg destinationColor, BlendArg sourceAlpha, BlendOp operationAlpha, BlendArg destinationAlpha)
Definition: State.h:573
Represents blending state.
Definition: State.h:298
BlendArg sourceColor
Determines how source color will be used.
Definition: State.h:304
BlendArg getDestinationAlpha() const
Definition: State.h:381
BlendOp getOperationAlpha() const
Definition: State.h:386
BlendFunction(bool enabled, BlendArg sourceColor, BlendOp operationColor, BlendArg destinationColor, BlendArg sourceAlpha, BlendOp operationAlpha, BlendArg destinationAlpha)
Definition: State.h:332
uint16 enabled
true if blending is enabled.
Definition: State.h:301
BlendArg getDestinationColor() const
Definition: State.h:366
BlendOp getOperationColor() const
Definition: State.h:371
BlendFunction(bool enabled=false, BlendArg source=ONE, BlendOp operation=BLEND_OP_ADD, BlendArg destination=ZERO)
Definition: State.h:350
BlendArg getSourceAlpha() const
Definition: State.h:376
BlendOp opColor
Type of operation that will be performed on color if blending is enabled.
Definition: State.h:316
BlendArg getSourceColor() const
Definition: State.h:361
BlendArg destColor
Determines how destination color will be used.
Definition: State.h:310
BlendArg destAlpha
Determines how destination alpha will be used.
Definition: State.h:313
BlendOp opAlpha
Type of operation that will be performed on alpha if blending is enabled.
Definition: State.h:319
bool isEnabled() const
Definition: State.h:356
BlendArg sourceAlpha
Determines how source alpha will be used.
Definition: State.h:307
Flags for enabling or disabling various settings for the pipeline.
Definition: State.h:406