mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	GPU: Handle writes to the CB_DATA method.
Writing to this method will cause the written value to be stored in the currently-set ConstBuffer plus CB_POS. This method is usually used to upload uniforms or other shader-visible data.
This commit is contained in:
		
							parent
							
								
									a64b936cbe
								
							
						
					
					
						commit
						85d820b1b4
					
				| @ -83,6 +83,25 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) { | |||||||
|         ASSERT_MSG(regs.code_address.CodeAddress() == 0, "Unexpected CODE_ADDRESS register value."); |         ASSERT_MSG(regs.code_address.CodeAddress() == 0, "Unexpected CODE_ADDRESS register value."); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[3]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[4]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[5]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[6]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[7]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[8]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[9]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[10]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[11]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[12]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[13]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[14]): | ||||||
|  |     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[15]): { | ||||||
|  |         ProcessCBData(value); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|     case MAXWELL3D_REG_INDEX(cb_bind[0].raw_config): { |     case MAXWELL3D_REG_INDEX(cb_bind[0].raw_config): { | ||||||
|         ProcessCBBind(Regs::ShaderStage::Vertex); |         ProcessCBBind(Regs::ShaderStage::Vertex); | ||||||
|         break; |         break; | ||||||
| @ -194,5 +213,22 @@ void Maxwell3D::ProcessCBBind(Regs::ShaderStage stage) { | |||||||
|     buffer.size = regs.const_buffer.cb_size; |     buffer.size = regs.const_buffer.cb_size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Maxwell3D::ProcessCBData(u32 value) { | ||||||
|  |     // Write the input value to the current const buffer at the current position.
 | ||||||
|  |     GPUVAddr buffer_address = regs.const_buffer.BufferAddress(); | ||||||
|  |     ASSERT(buffer_address != 0); | ||||||
|  | 
 | ||||||
|  |     // Don't allow writing past the end of the buffer.
 | ||||||
|  |     ASSERT(regs.const_buffer.cb_pos + sizeof(u32) <= regs.const_buffer.cb_size); | ||||||
|  | 
 | ||||||
|  |     VAddr address = | ||||||
|  |         memory_manager.PhysicalToVirtualAddress(buffer_address + regs.const_buffer.cb_pos); | ||||||
|  | 
 | ||||||
|  |     Memory::Write32(address, value); | ||||||
|  | 
 | ||||||
|  |     // Increment the current buffer position.
 | ||||||
|  |     regs.const_buffer.cb_pos = regs.const_buffer.cb_pos + 4; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Engines
 | } // namespace Engines
 | ||||||
| } // namespace Tegra
 | } // namespace Tegra
 | ||||||
|  | |||||||
| @ -218,6 +218,9 @@ private: | |||||||
|     /// Handles a write to the QUERY_GET register.
 |     /// Handles a write to the QUERY_GET register.
 | ||||||
|     void ProcessQueryGet(); |     void ProcessQueryGet(); | ||||||
| 
 | 
 | ||||||
|  |     /// Handles a write to the CB_DATA[i] register.
 | ||||||
|  |     void ProcessCBData(u32 value); | ||||||
|  | 
 | ||||||
|     /// Handles a write to the CB_BIND register.
 |     /// Handles a write to the CB_BIND register.
 | ||||||
|     void ProcessCBBind(Regs::ShaderStage stage); |     void ProcessCBBind(Regs::ShaderStage stage); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Subv
						Subv