|
|
|
@ -22,14 +22,19 @@ using VideoCore::QueryType;
|
|
|
|
|
/// First register id that is actually a Macro call.
|
|
|
|
|
constexpr u32 MacroRegistersStart = 0xE00;
|
|
|
|
|
|
|
|
|
|
Maxwell3D::Maxwell3D(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
|
|
|
|
|
MemoryManager& memory_manager)
|
|
|
|
|
: system{system}, rasterizer{rasterizer}, memory_manager{memory_manager},
|
|
|
|
|
macro_engine{GetMacroEngine(*this)}, upload_state{memory_manager, regs.upload} {
|
|
|
|
|
Maxwell3D::Maxwell3D(Core::System& system_, MemoryManager& memory_manager_)
|
|
|
|
|
: system{system_}, memory_manager{memory_manager_}, macro_engine{GetMacroEngine(*this)},
|
|
|
|
|
upload_state{memory_manager, regs.upload} {
|
|
|
|
|
dirty.flags.flip();
|
|
|
|
|
InitializeRegisterDefaults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Maxwell3D::~Maxwell3D() = default;
|
|
|
|
|
|
|
|
|
|
void Maxwell3D::BindRasterizer(VideoCore::RasterizerInterface& rasterizer_) {
|
|
|
|
|
rasterizer = &rasterizer_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Maxwell3D::InitializeRegisterDefaults() {
|
|
|
|
|
// Initializes registers to their default values - what games expect them to be at boot. This is
|
|
|
|
|
// for certain registers that may not be explicitly set by games.
|
|
|
|
@ -192,7 +197,7 @@ void Maxwell3D::CallMethod(u32 method, u32 method_argument, bool is_last_call) {
|
|
|
|
|
|
|
|
|
|
switch (method) {
|
|
|
|
|
case MAXWELL3D_REG_INDEX(wait_for_idle): {
|
|
|
|
|
rasterizer.WaitForIdle();
|
|
|
|
|
rasterizer->WaitForIdle();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case MAXWELL3D_REG_INDEX(shadow_ram_control): {
|
|
|
|
@ -402,7 +407,7 @@ void Maxwell3D::FlushMMEInlineDraw() {
|
|
|
|
|
|
|
|
|
|
const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed;
|
|
|
|
|
if (ShouldExecute()) {
|
|
|
|
|
rasterizer.Draw(is_indexed, true);
|
|
|
|
|
rasterizer->Draw(is_indexed, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if
|
|
|
|
@ -465,7 +470,7 @@ void Maxwell3D::ProcessQueryGet() {
|
|
|
|
|
switch (regs.query.query_get.operation) {
|
|
|
|
|
case Regs::QueryOperation::Release:
|
|
|
|
|
if (regs.query.query_get.fence == 1) {
|
|
|
|
|
rasterizer.SignalSemaphore(regs.query.QueryAddress(), regs.query.query_sequence);
|
|
|
|
|
rasterizer->SignalSemaphore(regs.query.QueryAddress(), regs.query.query_sequence);
|
|
|
|
|
} else {
|
|
|
|
|
StampQueryResult(regs.query.query_sequence, regs.query.query_get.short_query == 0);
|
|
|
|
|
}
|
|
|
|
@ -533,7 +538,7 @@ void Maxwell3D::ProcessQueryCondition() {
|
|
|
|
|
void Maxwell3D::ProcessCounterReset() {
|
|
|
|
|
switch (regs.counter_reset) {
|
|
|
|
|
case Regs::CounterReset::SampleCnt:
|
|
|
|
|
rasterizer.ResetCounter(QueryType::SamplesPassed);
|
|
|
|
|
rasterizer->ResetCounter(QueryType::SamplesPassed);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
LOG_DEBUG(Render_OpenGL, "Unimplemented counter reset={}",
|
|
|
|
@ -547,7 +552,7 @@ void Maxwell3D::ProcessSyncPoint() {
|
|
|
|
|
const u32 increment = regs.sync_info.increment.Value();
|
|
|
|
|
[[maybe_unused]] const u32 cache_flush = regs.sync_info.unknown.Value();
|
|
|
|
|
if (increment) {
|
|
|
|
|
rasterizer.SignalSyncPoint(sync_point);
|
|
|
|
|
rasterizer->SignalSyncPoint(sync_point);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -570,7 +575,7 @@ void Maxwell3D::DrawArrays() {
|
|
|
|
|
|
|
|
|
|
const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count};
|
|
|
|
|
if (ShouldExecute()) {
|
|
|
|
|
rasterizer.Draw(is_indexed, false);
|
|
|
|
|
rasterizer->Draw(is_indexed, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if
|
|
|
|
@ -590,8 +595,8 @@ std::optional<u64> Maxwell3D::GetQueryResult() {
|
|
|
|
|
return 0;
|
|
|
|
|
case Regs::QuerySelect::SamplesPassed:
|
|
|
|
|
// Deferred.
|
|
|
|
|
rasterizer.Query(regs.query.QueryAddress(), VideoCore::QueryType::SamplesPassed,
|
|
|
|
|
system.GPU().GetTicks());
|
|
|
|
|
rasterizer->Query(regs.query.QueryAddress(), VideoCore::QueryType::SamplesPassed,
|
|
|
|
|
system.GPU().GetTicks());
|
|
|
|
|
return {};
|
|
|
|
|
default:
|
|
|
|
|
LOG_DEBUG(HW_GPU, "Unimplemented query select type {}",
|
|
|
|
@ -718,7 +723,7 @@ void Maxwell3D::ProcessClearBuffers() {
|
|
|
|
|
regs.clear_buffers.R == regs.clear_buffers.B &&
|
|
|
|
|
regs.clear_buffers.R == regs.clear_buffers.A);
|
|
|
|
|
|
|
|
|
|
rasterizer.Clear();
|
|
|
|
|
rasterizer->Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 Maxwell3D::AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const {
|
|
|
|
@ -752,11 +757,11 @@ SamplerDescriptor Maxwell3D::AccessSampler(u32 handle) const {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() {
|
|
|
|
|
return rasterizer.AccessGuestDriverProfile();
|
|
|
|
|
return rasterizer->AccessGuestDriverProfile();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() const {
|
|
|
|
|
return rasterizer.AccessGuestDriverProfile();
|
|
|
|
|
return rasterizer->AccessGuestDriverProfile();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Tegra::Engines
|
|
|
|
|