maxwell_3d: Slow implementation of passed samples (query 21)

Implements GL_SAMPLES_PASSED by waiting immediately for queries.
This commit is contained in:
ReinUsesLisp
2019-07-27 19:40:10 -03:00
parent 3217400dd1
commit 2b58652f08
8 changed files with 201 additions and 17 deletions

View File

@ -400,6 +400,10 @@ void Maxwell3D::CallMethod(const GPU::MethodCall& method_call) {
ProcessQueryCondition();
break;
}
case MAXWELL3D_REG_INDEX(counter_reset): {
ProcessCounterReset();
break;
}
case MAXWELL3D_REG_INDEX(sync_info): {
ProcessSyncPoint();
break;
@ -544,23 +548,23 @@ void Maxwell3D::ProcessQueryGet() {
"Units other than CROP are unimplemented");
switch (regs.query.query_get.operation) {
case Regs::QueryOperation::Release: {
const u64 result = regs.query.query_sequence;
StampQueryResult(result, regs.query.query_get.short_query == 0);
case Regs::QueryOperation::Release:
StampQueryResult(regs.query.query_sequence, regs.query.query_get.short_query == 0);
break;
}
case Regs::QueryOperation::Acquire: {
// Todo(Blinkhawk): Under this operation, the GPU waits for the CPU
// to write a value that matches the current payload.
case Regs::QueryOperation::Acquire:
// TODO(Blinkhawk): Under this operation, the GPU waits for the CPU to write a value that
// matches the current payload.
UNIMPLEMENTED_MSG("Unimplemented query operation ACQUIRE");
break;
}
case Regs::QueryOperation::Counter: {
u64 result{};
u64 result;
switch (regs.query.query_get.select) {
case Regs::QuerySelect::Zero:
result = 0;
break;
case Regs::QuerySelect::SamplesPassed:
result = rasterizer.Query(VideoCore::QueryType::SamplesPassed);
break;
default:
result = 1;
UNIMPLEMENTED_MSG("Unimplemented query select type {}",
@ -569,15 +573,13 @@ void Maxwell3D::ProcessQueryGet() {
StampQueryResult(result, regs.query.query_get.short_query == 0);
break;
}
case Regs::QueryOperation::Trap: {
case Regs::QueryOperation::Trap:
UNIMPLEMENTED_MSG("Unimplemented query operation TRAP");
break;
}
default: {
default:
UNIMPLEMENTED_MSG("Unknown query operation");
break;
}
}
}
void Maxwell3D::ProcessQueryCondition() {
@ -619,6 +621,17 @@ void Maxwell3D::ProcessQueryCondition() {
}
}
void Maxwell3D::ProcessCounterReset() {
switch (regs.counter_reset) {
case Regs::CounterReset::SampleCnt:
rasterizer.ResetCounter(VideoCore::QueryType::SamplesPassed);
break;
default:
UNIMPLEMENTED_MSG("counter_reset={}", static_cast<u32>(regs.counter_reset));
break;
}
}
void Maxwell3D::ProcessSyncPoint() {
const u32 sync_point = regs.sync_info.sync_point.Value();
const u32 increment = regs.sync_info.increment.Value();