gl_shader_gen: Add uniform handling for indirect const buffer access.
This commit is contained in:
		| @@ -654,7 +654,16 @@ u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint progr | |||||||
|         buffer_draw_state.bindpoint = current_bindpoint + bindpoint; |         buffer_draw_state.bindpoint = current_bindpoint + bindpoint; | ||||||
|  |  | ||||||
|         boost::optional<VAddr> addr = gpu.memory_manager->GpuToCpuAddress(buffer.address); |         boost::optional<VAddr> addr = gpu.memory_manager->GpuToCpuAddress(buffer.address); | ||||||
|         std::vector<u8> data(used_buffer.GetSize() * sizeof(float)); |  | ||||||
|  |         std::vector<u8> data; | ||||||
|  |         if (used_buffer.IsIndirect()) { | ||||||
|  |             // Buffer is accessed indirectly, so upload the entire thing | ||||||
|  |             data.resize(buffer.size * sizeof(float)); | ||||||
|  |         } else { | ||||||
|  |             // Buffer is accessed directly, upload just what we use | ||||||
|  |             data.resize(used_buffer.GetSize() * sizeof(float)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         Memory::ReadBlock(*addr, data.data(), data.size()); |         Memory::ReadBlock(*addr, data.data(), data.size()); | ||||||
|  |  | ||||||
|         glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer_draw_state.ssbo); |         glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer_draw_state.ssbo); | ||||||
|   | |||||||
| @@ -377,6 +377,21 @@ public: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     std::string GetUniformIndirect(u64 index, s64 offset, const Register& index_reg, | ||||||
|  |                                    GLSLRegister::Type type) { | ||||||
|  |         declr_const_buffers[index].MarkAsUsedIndirect(index, stage); | ||||||
|  |         std::string value = 'c' + std::to_string(index) + "[(floatBitsToInt(" + | ||||||
|  |                             GetRegister(index_reg, 0) + ") + " + std::to_string(offset) + ") / 4]"; | ||||||
|  |  | ||||||
|  |         if (type == GLSLRegister::Type::Float) { | ||||||
|  |             return value; | ||||||
|  |         } else if (type == GLSLRegister::Type::Integer) { | ||||||
|  |             return "floatBitsToInt(" + value + ')'; | ||||||
|  |         } else { | ||||||
|  |             UNREACHABLE(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Add declarations for registers |     /// Add declarations for registers | ||||||
|     void GenerateDeclarations() { |     void GenerateDeclarations() { | ||||||
|         for (const auto& reg : regs) { |         for (const auto& reg : regs) { | ||||||
|   | |||||||
| @@ -22,17 +22,28 @@ class ConstBufferEntry { | |||||||
|     using Maxwell = Tegra::Engines::Maxwell3D::Regs; |     using Maxwell = Tegra::Engines::Maxwell3D::Regs; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     void MarkAsUsed(unsigned index, unsigned offset, Maxwell::ShaderStage stage) { |     void MarkAsUsed(u64 index, u64 offset, Maxwell::ShaderStage stage) { | ||||||
|         is_used = true; |         is_used = true; | ||||||
|         this->index = index; |         this->index = static_cast<unsigned>(index); | ||||||
|  |         this->stage = stage; | ||||||
|  |         max_offset = std::max(max_offset, static_cast<unsigned>(offset)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void MarkAsUsedIndirect(u64 index, Maxwell::ShaderStage stage) { | ||||||
|  |         is_used = true; | ||||||
|  |         is_indirect = true; | ||||||
|  |         this->index = static_cast<unsigned>(index); | ||||||
|         this->stage = stage; |         this->stage = stage; | ||||||
|         max_offset = std::max(max_offset, offset); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool IsUsed() const { |     bool IsUsed() const { | ||||||
|         return is_used; |         return is_used; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     bool IsIndirect() const { | ||||||
|  |         return is_indirect; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     unsigned GetIndex() const { |     unsigned GetIndex() const { | ||||||
|         return index; |         return index; | ||||||
|     } |     } | ||||||
| @@ -51,6 +62,7 @@ private: | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     bool is_used{}; |     bool is_used{}; | ||||||
|  |     bool is_indirect{}; | ||||||
|     unsigned index{}; |     unsigned index{}; | ||||||
|     unsigned max_offset{}; |     unsigned max_offset{}; | ||||||
|     Maxwell::ShaderStage stage; |     Maxwell::ShaderStage stage; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei