|
@@ -90,6 +90,20 @@ public:
|
|
|
|
|
|
|
|
enum class QuerySelect : u32 {
|
|
enum class QuerySelect : u32 {
|
|
|
Zero = 0,
|
|
Zero = 0,
|
|
|
|
|
+ TimeElapsed = 2,
|
|
|
|
|
+ TransformFeedbackPrimitivesGenerated = 11,
|
|
|
|
|
+ PrimitivesGenerated = 18,
|
|
|
|
|
+ SamplesPassed = 21,
|
|
|
|
|
+ TransformFeedbackUnknown = 26,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ struct QueryCompare {
|
|
|
|
|
+ u32 initial_sequence;
|
|
|
|
|
+ u32 initial_mode;
|
|
|
|
|
+ u32 unknown1;
|
|
|
|
|
+ u32 unknown2;
|
|
|
|
|
+ u32 current_sequence;
|
|
|
|
|
+ u32 current_mode;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum class QuerySyncCondition : u32 {
|
|
enum class QuerySyncCondition : u32 {
|
|
@@ -97,6 +111,14 @@ public:
|
|
|
GreaterThan = 1,
|
|
GreaterThan = 1,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ enum class ConditionMode : u32 {
|
|
|
|
|
+ Never = 0,
|
|
|
|
|
+ Always = 1,
|
|
|
|
|
+ ResNonZero = 2,
|
|
|
|
|
+ Equal = 3,
|
|
|
|
|
+ NotEqual = 4,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
enum class ShaderProgram : u32 {
|
|
enum class ShaderProgram : u32 {
|
|
|
VertexA = 0,
|
|
VertexA = 0,
|
|
|
VertexB = 1,
|
|
VertexB = 1,
|
|
@@ -815,7 +837,18 @@ public:
|
|
|
BitField<4, 1, u32> alpha_to_one;
|
|
BitField<4, 1, u32> alpha_to_one;
|
|
|
} multisample_control;
|
|
} multisample_control;
|
|
|
|
|
|
|
|
- INSERT_PADDING_WORDS(0x7);
|
|
|
|
|
|
|
+ INSERT_PADDING_WORDS(0x4);
|
|
|
|
|
+
|
|
|
|
|
+ struct {
|
|
|
|
|
+ u32 address_high;
|
|
|
|
|
+ u32 address_low;
|
|
|
|
|
+ ConditionMode mode;
|
|
|
|
|
+
|
|
|
|
|
+ GPUVAddr Address() const {
|
|
|
|
|
+ return static_cast<GPUVAddr>((static_cast<GPUVAddr>(address_high) << 32) |
|
|
|
|
|
+ address_low);
|
|
|
|
|
+ }
|
|
|
|
|
+ } condition;
|
|
|
|
|
|
|
|
struct {
|
|
struct {
|
|
|
u32 tsc_address_high;
|
|
u32 tsc_address_high;
|
|
@@ -1169,6 +1202,10 @@ public:
|
|
|
return macro_memory;
|
|
return macro_memory;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ bool ShouldExecute() const {
|
|
|
|
|
+ return execute_on;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private:
|
|
private:
|
|
|
void InitializeRegisterDefaults();
|
|
void InitializeRegisterDefaults();
|
|
|
|
|
|
|
@@ -1194,6 +1231,8 @@ private:
|
|
|
|
|
|
|
|
Upload::State upload_state;
|
|
Upload::State upload_state;
|
|
|
|
|
|
|
|
|
|
+ bool execute_on{true};
|
|
|
|
|
+
|
|
|
/// Retrieves information about a specific TIC entry from the TIC buffer.
|
|
/// Retrieves information about a specific TIC entry from the TIC buffer.
|
|
|
Texture::TICEntry GetTICEntry(u32 tic_index) const;
|
|
Texture::TICEntry GetTICEntry(u32 tic_index) const;
|
|
|
|
|
|
|
@@ -1219,6 +1258,9 @@ private:
|
|
|
/// Handles a write to the QUERY_GET register.
|
|
/// Handles a write to the QUERY_GET register.
|
|
|
void ProcessQueryGet();
|
|
void ProcessQueryGet();
|
|
|
|
|
|
|
|
|
|
+ // Handles Conditional Rendering
|
|
|
|
|
+ void ProcessQueryCondition();
|
|
|
|
|
+
|
|
|
/// Handles writes to syncing register.
|
|
/// Handles writes to syncing register.
|
|
|
void ProcessSyncPoint();
|
|
void ProcessSyncPoint();
|
|
|
|
|
|
|
@@ -1290,6 +1332,7 @@ ASSERT_REG_POSITION(clip_distance_enabled, 0x544);
|
|
|
ASSERT_REG_POSITION(point_size, 0x546);
|
|
ASSERT_REG_POSITION(point_size, 0x546);
|
|
|
ASSERT_REG_POSITION(zeta_enable, 0x54E);
|
|
ASSERT_REG_POSITION(zeta_enable, 0x54E);
|
|
|
ASSERT_REG_POSITION(multisample_control, 0x54F);
|
|
ASSERT_REG_POSITION(multisample_control, 0x54F);
|
|
|
|
|
+ASSERT_REG_POSITION(condition, 0x554);
|
|
|
ASSERT_REG_POSITION(tsc, 0x557);
|
|
ASSERT_REG_POSITION(tsc, 0x557);
|
|
|
ASSERT_REG_POSITION(polygon_offset_factor, 0x55b);
|
|
ASSERT_REG_POSITION(polygon_offset_factor, 0x55b);
|
|
|
ASSERT_REG_POSITION(tic, 0x55D);
|
|
ASSERT_REG_POSITION(tic, 0x55D);
|