Implement Maxwell3D Data Upload
This commit is contained in:
parent
e4ff140b99
commit
701ce1c9d0
|
@ -20,8 +20,8 @@ constexpr u32 MacroRegistersStart = 0xE00;
|
||||||
|
|
||||||
Maxwell3D::Maxwell3D(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
|
Maxwell3D::Maxwell3D(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
|
||||||
MemoryManager& memory_manager)
|
MemoryManager& memory_manager)
|
||||||
: system{system}, rasterizer{rasterizer}, memory_manager{memory_manager}, macro_interpreter{
|
: system{system}, rasterizer{rasterizer}, memory_manager{memory_manager},
|
||||||
*this} {
|
macro_interpreter{*this}, upload_state{memory_manager, regs.upload} {
|
||||||
InitializeRegisterDefaults();
|
InitializeRegisterDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,6 +253,18 @@ void Maxwell3D::CallMethod(const GPU::MethodCall& method_call) {
|
||||||
ProcessSyncPoint();
|
ProcessSyncPoint();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MAXWELL3D_REG_INDEX(exec_upload): {
|
||||||
|
upload_state.ProcessExec(regs.exec_upload.linear != 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MAXWELL3D_REG_INDEX(data_upload): {
|
||||||
|
bool is_last_call = method_call.IsLastCall();
|
||||||
|
upload_state.ProcessData(method_call.argument, is_last_call);
|
||||||
|
if (is_last_call) {
|
||||||
|
dirty_flags.OnMemoryWrite();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
|
#include "video_core/engines/engine_upload.h"
|
||||||
#include "video_core/gpu.h"
|
#include "video_core/gpu.h"
|
||||||
#include "video_core/macro_interpreter.h"
|
#include "video_core/macro_interpreter.h"
|
||||||
#include "video_core/textures/texture.h"
|
#include "video_core/textures/texture.h"
|
||||||
|
@ -579,7 +580,18 @@ public:
|
||||||
u32 bind;
|
u32 bind;
|
||||||
} macros;
|
} macros;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x69);
|
INSERT_PADDING_WORDS(0x17);
|
||||||
|
|
||||||
|
Upload::Data upload;
|
||||||
|
struct {
|
||||||
|
union {
|
||||||
|
BitField<0, 1, u32> linear;
|
||||||
|
};
|
||||||
|
} exec_upload;
|
||||||
|
|
||||||
|
u32 data_upload;
|
||||||
|
|
||||||
|
INSERT_PADDING_WORDS(0x44);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
union {
|
union {
|
||||||
|
@ -1175,6 +1187,8 @@ private:
|
||||||
/// Interpreter for the macro codes uploaded to the GPU.
|
/// Interpreter for the macro codes uploaded to the GPU.
|
||||||
MacroInterpreter macro_interpreter;
|
MacroInterpreter macro_interpreter;
|
||||||
|
|
||||||
|
Upload::State upload_state;
|
||||||
|
|
||||||
/// 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;
|
||||||
|
|
||||||
|
@ -1218,6 +1232,9 @@ private:
|
||||||
"Field " #field_name " has invalid position")
|
"Field " #field_name " has invalid position")
|
||||||
|
|
||||||
ASSERT_REG_POSITION(macros, 0x45);
|
ASSERT_REG_POSITION(macros, 0x45);
|
||||||
|
ASSERT_REG_POSITION(upload, 0x60);
|
||||||
|
ASSERT_REG_POSITION(exec_upload, 0x6C);
|
||||||
|
ASSERT_REG_POSITION(data_upload, 0x6D);
|
||||||
ASSERT_REG_POSITION(sync_info, 0xB2);
|
ASSERT_REG_POSITION(sync_info, 0xB2);
|
||||||
ASSERT_REG_POSITION(tfb_enabled, 0x1D1);
|
ASSERT_REG_POSITION(tfb_enabled, 0x1D1);
|
||||||
ASSERT_REG_POSITION(rt, 0x200);
|
ASSERT_REG_POSITION(rt, 0x200);
|
||||||
|
|
Reference in New Issue