summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2018-04-24 03:01:29 +0200
committerSubv <subv2112@gmail.com>2018-04-25 18:55:27 +0200
commita994446b6ec776c9383e8b13c45eeb461405adff (patch)
tree1810023a79e3f511601d60051e15df2f869c01c3
parentGPU: Corrected the upper bound of the PFIFO method ids in the command processor. (diff)
downloadyuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar.gz
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar.bz2
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar.lz
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar.xz
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.tar.zst
yuzu-a994446b6ec776c9383e8b13c45eeb461405adff.zip
-rw-r--r--src/video_core/command_processor.cpp25
-rw-r--r--src/video_core/engines/maxwell_3d.cpp14
-rw-r--r--src/video_core/engines/maxwell_3d.h17
-rw-r--r--src/video_core/gpu.h7
4 files changed, 23 insertions, 40 deletions
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 26792a2bf..2eaece298 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -24,9 +24,6 @@ namespace Tegra {
enum class BufferMethods {
BindObject = 0,
- SetGraphMacroCode = 0x45,
- SetGraphMacroCodeArg = 0x46,
- SetGraphMacroEntry = 0x47,
CountBufferMethods = 0x40,
};
@@ -36,28 +33,6 @@ void GPU::WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params)
"{:08X} remaining params {}",
method, subchannel, value, remaining_params);
- if (method == static_cast<u32>(BufferMethods::SetGraphMacroEntry)) {
- // Prepare to upload a new macro, reset the upload counter.
- NGLOG_DEBUG(HW_GPU, "Uploading GPU macro {:08X}", value);
- current_macro_entry = value;
- current_macro_code.clear();
- return;
- }
-
- if (method == static_cast<u32>(BufferMethods::SetGraphMacroCodeArg)) {
- // Append a new code word to the current macro.
- current_macro_code.push_back(value);
-
- // There are no more params remaining, submit the code to the 3D engine.
- if (remaining_params == 0) {
- maxwell_3d->SubmitMacroCode(current_macro_entry, std::move(current_macro_code));
- current_macro_entry = InvalidGraphMacroEntry;
- current_macro_code.clear();
- }
-
- return;
- }
-
if (method == static_cast<u32>(BufferMethods::BindObject)) {
// Bind the current subchannel to the desired engine id.
NGLOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", subchannel, value);
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 2acbb9cd6..bc40f8d98 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -22,10 +22,6 @@ constexpr u32 MacroRegistersStart = 0xE00;
Maxwell3D::Maxwell3D(MemoryManager& memory_manager)
: memory_manager(memory_manager), macro_interpreter(*this) {}
-void Maxwell3D::SubmitMacroCode(u32 entry, std::vector<u32> code) {
- uploaded_macros[entry * 2 + MacroRegistersStart] = std::move(code);
-}
-
void Maxwell3D::CallMacroMethod(u32 method, std::vector<u32> parameters) {
auto macro_code = uploaded_macros.find(method);
// The requested macro must have been uploaded already.
@@ -75,6 +71,10 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {
regs.reg_array[method] = value;
switch (method) {
+ case MAXWELL3D_REG_INDEX(macros.data): {
+ ProcessMacroUpload(value);
+ break;
+ }
case MAXWELL3D_REG_INDEX(code_address.code_address_high):
case MAXWELL3D_REG_INDEX(code_address.code_address_low): {
// Note: For some reason games (like Puyo Puyo Tetris) seem to write 0 to the CODE_ADDRESS
@@ -141,6 +141,12 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {
}
}
+void Maxwell3D::ProcessMacroUpload(u32 data) {
+ // Store the uploaded macro code to interpret them when they're called.
+ auto& macro = uploaded_macros[regs.macros.entry * 2 + MacroRegistersStart];
+ macro.push_back(data);
+}
+
void Maxwell3D::ProcessQueryGet() {
GPUVAddr sequence_address = regs.query.QueryAddress();
// Since the sequence address is given as a GPU VAddr, we have to convert it to an application
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index a022665eb..8edc3cd38 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -322,7 +322,15 @@ public:
union {
struct {
- INSERT_PADDING_WORDS(0x200);
+ INSERT_PADDING_WORDS(0x45);
+
+ struct {
+ INSERT_PADDING_WORDS(1);
+ u32 data;
+ u32 entry;
+ } macros;
+
+ INSERT_PADDING_WORDS(0x1B8);
struct {
u32 address_high;
@@ -637,9 +645,6 @@ public:
/// Write the value to the register identified by method.
void WriteReg(u32 method, u32 value, u32 remaining_params);
- /// Uploads the code for a GPU macro program associated with the specified entry.
- void SubmitMacroCode(u32 entry, std::vector<u32> code);
-
/// Returns a list of enabled textures for the specified shader stage.
std::vector<Texture::FullTextureInfo> GetStageTextures(Regs::ShaderStage stage) const;
@@ -670,6 +675,9 @@ private:
*/
void CallMacroMethod(u32 method, std::vector<u32> parameters);
+ /// Handles writes to the macro uploading registers.
+ void ProcessMacroUpload(u32 data);
+
/// Handles a write to the QUERY_GET register.
void ProcessQueryGet();
@@ -687,6 +695,7 @@ private:
static_assert(offsetof(Maxwell3D::Regs, field_name) == position * 4, \
"Field " #field_name " has invalid position")
+ASSERT_REG_POSITION(macros, 0x45);
ASSERT_REG_POSITION(rt, 0x200);
ASSERT_REG_POSITION(viewport_transform[0], 0x280);
ASSERT_REG_POSITION(viewport, 0x300);
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index 2888daedc..7afa6aaef 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -86,8 +86,6 @@ public:
}
private:
- static constexpr u32 InvalidGraphMacroEntry = 0xFFFFFFFF;
-
/// Writes a single register in the engine bound to the specified subchannel
void WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params);
@@ -100,11 +98,6 @@ private:
std::unique_ptr<Engines::Fermi2D> fermi_2d;
/// Compute engine
std::unique_ptr<Engines::MaxwellCompute> maxwell_compute;
-
- /// Entry of the macro that is currently being uploaded
- u32 current_macro_entry = InvalidGraphMacroEntry;
- /// Code being uploaded for the current macro
- std::vector<u32> current_macro_code;
};
} // namespace Tegra