11 #ifndef hifi_gpu_State_h
12 #define hifi_gpu_State_h
19 #include <unordered_map>
26 static std::string bytesToAscii(T t) {
27 std::string hexString;
28 const auto bytes =
reinterpret_cast<uint8_t*
>(&t);
29 hexString.resize(
sizeof(T) * 2);
30 auto stringData = hexString.data();
31 constexpr int8_t charOffset =
'A';
32 for (
size_t i = 0; i <
sizeof(t); i++) {
33 stringData[i * 2] =
static_cast<int8_t
>(charOffset + (bytes[i] >> 4));
34 stringData[i * 2 + 1] =
static_cast<int8_t
>(charOffset + (bytes[i] & 0x0F));
42 #define SET_FIELD(FIELD, PATH, value) \
44 _values.PATH = value; \
45 if (value == DEFAULT.PATH) { \
46 _signature.reset(FIELD); \
48 _signature.set(FIELD); \
129 BLEND_OP_REV_SUBTRACT,
143 WRITE_ALL = (WRITE_RED | WRITE_GREEN | WRITE_BLUE | WRITE_ALPHA),
155 ComparisonFunction
function{ ComparisonFunction::LESS };
182 bool operator==(
const DepthTest& right)
const {
186 function == right.function;
189 bool operator!=(
const DepthTest& right)
const {
190 return !(*
this == right);
193 operator QString()
const {
194 return QString(
"{ writeMask = %1, enabled = %2, function = %3 }").arg(
writeMask).arg(
enabled).arg((uint8_t)
function);
200 ComparisonFunction
function;
202 StencilOp depthFailOp;
205 uint8 readMask{ 0xff };
216 StencilTest(int8 reference = 0,
217 uint8 readMask = 0xFF,
218 ComparisonFunction func = ComparisonFunction::ALWAYS,
219 StencilOp failOp = STENCIL_OP_KEEP,
220 StencilOp depthFailOp = STENCIL_OP_KEEP,
221 StencilOp passOp = STENCIL_OP_KEEP) :
223 failOp(failOp), depthFailOp(depthFailOp), passOp(passOp), reference(reference), readMask(readMask) {}
228 ComparisonFunction getFunction()
const {
return function; }
233 StencilOp getFailOp()
const {
return failOp; }
238 StencilOp getDepthFailOp()
const {
return depthFailOp; }
243 StencilOp getPassOp()
const {
return passOp; }
248 int8 getReference()
const {
return reference; }
253 uint8 getReadMask()
const {
return readMask; }
255 bool operator==(
const StencilTest& right)
const {
257 function == right.function &&
258 failOp == right.failOp &&
259 depthFailOp == right.depthFailOp &&
260 passOp == right.passOp &&
261 reference == right.reference &&
262 readMask == right.readMask;
266 bool operator!=(
const StencilTest &right)
const {
return !(right==*
this); }
270 struct StencilActivation {
271 uint8 frontWriteMask = 0xFF;
272 uint8 backWriteMask = 0xFF;
281 StencilActivation(
bool enabled =
false, uint8 frontWriteMask = 0xFF, uint8 backWriteMask = 0xFF) :
282 frontWriteMask(frontWriteMask), backWriteMask(backWriteMask), enabled(enabled) {}
287 bool isEnabled()
const {
return enabled; }
292 uint8 getWriteMaskFront()
const {
return frontWriteMask; }
297 uint8 getWriteMaskBack()
const {
return backWriteMask; }
299 bool operator==(
const StencilActivation& right)
const {
301 frontWriteMask == right.frontWriteMask &&
302 backWriteMask == right.backWriteMask &&
303 enabled == right.enabled;
306 bool operator!=(
const StencilActivation& right)
const {
307 return !(*
this == right);
348 BlendOp operationColor,
349 BlendArg destinationColor,
351 BlendOp operationAlpha,
352 BlendArg destinationAlpha) :
364 BlendFunction(
bool enabled =
false, BlendArg source = ONE, BlendOp operation = BLEND_OP_ADD, BlendArg destination = ZERO) :
415 return !(*
this == right);
422 frontFaceClockwise(
false), depthClampEnable(
false), scissorEnable(
false), multisampleEnable(
false),
423 antialisedLineEnable(
true), alphaToCoverageEnable(
false) {}
424 bool frontFaceClockwise;
425 bool depthClampEnable;
427 bool multisampleEnable;
428 bool antialisedLineEnable;
429 bool alphaToCoverageEnable;
432 bool operator==(
const Flags& right)
const {
434 frontFaceClockwise == right.frontFaceClockwise &&
435 depthClampEnable == right.depthClampEnable &&
436 scissorEnable == right.scissorEnable &&
437 multisampleEnable == right.multisampleEnable &&
438 antialisedLineEnable == right.antialisedLineEnable &&
439 alphaToCoverageEnable == right.alphaToCoverageEnable;
443 bool operator!=(
const Flags& right)
const {
444 return !(*
this == right);
455 float depthBias = 0.0f;
456 float depthBiasSlopeScale = 0.0f;
459 StencilActivation stencilActivation;
460 StencilTest stencilTestFront;
461 StencilTest stencilTestBack;
462 uint32 sampleMask = 0xFFFFFFFF;
464 FillMode fillMode{ FILL_FACE };
465 CullMode cullMode{ CULL_NONE };
466 ColorMask colorWriteMask{ WRITE_ALL };
474 std::string
getKey()
const;
478 void setFillMode(FillMode fill) { SET_FIELD(FILL_MODE, fillMode, fill); }
479 FillMode getFillMode()
const {
return _values.fillMode; }
481 void setCullMode(CullMode cull) { SET_FIELD(CULL_MODE, cullMode, cull); }
482 CullMode getCullMode()
const {
return _values.cullMode; }
489 void setFrontFaceClockwise(
bool isClockwise) { SET_FIELD(FRONT_FACE_CLOCKWISE, flags.frontFaceClockwise, isClockwise); }
490 bool isFrontFaceClockwise()
const {
return _values.flags.frontFaceClockwise; }
492 void setDepthClampEnable(
bool enable) { SET_FIELD(DEPTH_CLAMP_ENABLE, flags.depthClampEnable, enable); }
493 bool isDepthClampEnable()
const {
return _values.flags.depthClampEnable; }
495 void setScissorEnable(
bool enable) { SET_FIELD(SCISSOR_ENABLE, flags.scissorEnable, enable); }
496 bool isScissorEnable()
const {
return _values.flags.scissorEnable; }
498 void setMultisampleEnable(
bool enable) { SET_FIELD(MULTISAMPLE_ENABLE, flags.multisampleEnable, enable); }
499 bool isMultisampleEnable()
const {
return _values.flags.multisampleEnable; }
501 void setAntialiasedLineEnable(
bool enable) { SET_FIELD(ANTIALISED_LINE_ENABLE, flags.antialisedLineEnable, enable); }
502 bool isAntialiasedLineEnable()
const {
return _values.flags.antialisedLineEnable; }
505 void setDepthBias(
float bias) { SET_FIELD(DEPTH_BIAS, depthBias, bias); }
506 float getDepthBias()
const {
return _values.depthBias; }
508 void setDepthBiasSlopeScale(
float scale) { SET_FIELD(DEPTH_BIAS_SLOPE_SCALE, depthBiasSlopeScale, scale); }
509 float getDepthBiasSlopeScale()
const {
return _values.depthBiasSlopeScale; }
512 void setDepthTest(DepthTest newDepthTest) { SET_FIELD(DEPTH_TEST, depthTest, newDepthTest); }
513 void setDepthTest(
bool enable,
bool writeMask, ComparisonFunction func) {
514 setDepthTest(DepthTest(enable, writeMask, func));
516 DepthTest getDepthTest()
const {
return _values.depthTest; }
518 bool isDepthTestEnabled()
const {
return getDepthTest().
isEnabled(); }
519 uint8 getDepthTestWriteMask()
const {
return getDepthTest().
getWriteMask(); }
520 ComparisonFunction getDepthTestFunc()
const {
return getDepthTest().
getFunction(); }
530 void setStencilTest(
bool enabled, uint8 frontWriteMask, StencilTest frontTest, uint8 backWriteMask, StencilTest backTest) {
531 SET_FIELD(STENCIL_ACTIVATION, stencilActivation, StencilActivation(enabled, frontWriteMask, backWriteMask));
532 SET_FIELD(STENCIL_TEST_FRONT, stencilTestFront, frontTest);
533 SET_FIELD(STENCIL_TEST_BACK, stencilTestBack, backTest);
542 setStencilTest(enabled, frontWriteMask, frontTest, frontWriteMask, frontTest);
545 StencilActivation getStencilActivation()
const {
return _values.stencilActivation; }
546 StencilTest getStencilTestFront()
const {
return _values.stencilTestFront; }
547 StencilTest getStencilTestBack()
const {
return _values.stencilTestBack; }
549 bool isStencilEnabled()
const {
return getStencilActivation().isEnabled(); }
550 uint8 getStencilWriteMaskFront()
const {
return getStencilActivation().getWriteMaskFront(); }
551 uint8 getStencilWriteMaskBack()
const {
return getStencilActivation().getWriteMaskBack(); }
554 void setAlphaToCoverageEnable(
bool enable) { SET_FIELD(ALPHA_TO_COVERAGE_ENABLE, flags.alphaToCoverageEnable, enable); }
555 bool isAlphaToCoverageEnabled()
const {
return _values.flags.alphaToCoverageEnable; }
564 void setSampleMask(uint32 mask) { SET_FIELD(SAMPLE_MASK, sampleMask, mask); }
575 void setBlendFunction(BlendFunction
function) { SET_FIELD(BLEND_FUNCTION, blendFunction,
function); }
576 const BlendFunction& getBlendFunction()
const {
return _values.blendFunction; }
588 BlendArg sourceColor,
589 BlendOp operationColor,
590 BlendArg destinationColor,
591 BlendArg sourceAlpha,
592 BlendOp operationAlpha,
593 BlendArg destinationAlpha) {
594 setBlendFunction(
BlendFunction(enabled, sourceColor, operationColor, destinationColor, sourceAlpha, operationAlpha,
604 void setBlendFunction(
bool enabled, BlendArg source, BlendOp operation, BlendArg destination) {
605 setBlendFunction(
BlendFunction(enabled, source, operation, destination));
608 bool isBlendEnabled()
const {
return getBlendFunction().
isEnabled(); }
625 ColorMask value = (ColorMask)((WRITE_RED * red) | (WRITE_GREEN * green) | (WRITE_BLUE * blue) | (WRITE_ALPHA * alpha));
626 SET_FIELD(COLOR_WRITE_MASK, colorWriteMask, value);
628 ColorMask getColorWriteMask()
const {
return _values.colorWriteMask; }
636 FRONT_FACE_CLOCKWISE,
640 ANTIALISED_LINE_ENABLE,
643 DEPTH_BIAS_SLOPE_SCALE,
653 ALPHA_TO_COVERAGE_ENABLE,
678 State(
const Data& values);
701 typedef std::shared_ptr<State> StatePointer;
702 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:453
Represents setting for depth testing and writing.
Definition: State.h:147
uint8 enabled
Enable depth test.
Definition: State.h:153
uint8 getWriteMask() const
Definition: State.h:180
bool isEnabled() const
Definition: State.h:170
ComparisonFunction getFunction() const
Definition: State.h:175
DepthTest(bool enabled=false, bool writeMask=true, ComparisonFunction func=ComparisonFunction::LESS)
Definition: State.h:164
uint8 writeMask
Enable writing to the depth buffer.
Definition: State.h:150
Describes pipeline state.
Definition: State.h:58
void setStencilTest(bool enabled, uint8 frontWriteMask, StencilTest frontTest)
Definition: State.h:541
static Signature evalSignature(const Data &state)
Definition: State.cpp:27
uint32 getSampleMask() const
Definition: State.h:572
Stamp _stamp
Incremented on changes and used to determine if API-specific backend object needs updating.
Definition: State.h:698
static const Data DEFAULT
The unique default values for all the fields.
Definition: State.h:477
void setColorWriteMask(bool red, bool green, bool blue, bool alpha)
Sets which color channels can be written to.
Definition: State.h:624
const GPUObjectPointer gpuObject
Object representing state on the API-specific backend side.
Definition: State.h:686
void setBlendFunction(bool enabled, BlendArg source, BlendOp operation, BlendArg destination)
Definition: State.h:604
const Data & getValues() const
Definition: State.h:683
const Flags & getFlags() const
Definition: State.h:487
Field
Definition: State.h:633
void setColorWriteMask(ColorMask mask)
Definition: State.h:614
Signature _signature
Used to tell which fields have default values and which are changed.
Definition: State.h:695
Data _values
Full description of the state.
Definition: State.h:692
void setSampleMask(uint32 mask)
Definition: State.h:564
void setStencilTest(bool enabled, uint8 frontWriteMask, StencilTest frontTest, uint8 backWriteMask, StencilTest backTest)
Definition: State.h:530
std::string getKey() const
Definition: State.cpp:90
Signature getSignature() const
Definition: State.h:669
std::bitset< NUM_FIELDS > Signature
Definition: State.h:664
Stamp getStamp() const
Get the current stamp.
Definition: State.h:70
void setBlendFunction(bool enabled, BlendArg sourceColor, BlendOp operationColor, BlendArg destinationColor, BlendArg sourceAlpha, BlendOp operationAlpha, BlendArg destinationAlpha)
Definition: State.h:587
Represents blending state.
Definition: State.h:312
BlendArg sourceColor
Determines how source color will be used.
Definition: State.h:318
BlendArg getDestinationAlpha() const
Definition: State.h:395
BlendOp getOperationAlpha() const
Definition: State.h:400
BlendFunction(bool enabled, BlendArg sourceColor, BlendOp operationColor, BlendArg destinationColor, BlendArg sourceAlpha, BlendOp operationAlpha, BlendArg destinationAlpha)
Definition: State.h:346
uint16 enabled
true if blending is enabled.
Definition: State.h:315
BlendArg getDestinationColor() const
Definition: State.h:380
BlendOp getOperationColor() const
Definition: State.h:385
BlendFunction(bool enabled=false, BlendArg source=ONE, BlendOp operation=BLEND_OP_ADD, BlendArg destination=ZERO)
Definition: State.h:364
BlendArg getSourceAlpha() const
Definition: State.h:390
BlendOp opColor
Type of operation that will be performed on color if blending is enabled.
Definition: State.h:330
BlendArg getSourceColor() const
Definition: State.h:375
BlendArg destColor
Determines how destination color will be used.
Definition: State.h:324
BlendArg destAlpha
Determines how destination alpha will be used.
Definition: State.h:327
BlendOp opAlpha
Type of operation that will be performed on alpha if blending is enabled.
Definition: State.h:333
bool isEnabled() const
Definition: State.h:370
BlendArg sourceAlpha
Determines how source alpha will be used.
Definition: State.h:321
Flags for enabling or disabling various settings for the pipeline.
Definition: State.h:420