mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	gl_rasterizer: Add a new dirty flag for any lighting lut.
This commit is contained in:
		
							parent
							
								
									a8396cdbed
								
							
						
					
					
						commit
						5a9cde138d
					
				
					 2 changed files with 23 additions and 17 deletions
				
			
		|  | @ -67,7 +67,8 @@ RasterizerOpenGL::RasterizerOpenGL() | |||
| 
 | ||||
|     uniform_block_data.dirty = true; | ||||
| 
 | ||||
|     uniform_block_data.lut_dirty.fill(true); | ||||
|     uniform_block_data.lighting_lut_dirty.fill(true); | ||||
|     uniform_block_data.lighting_lut_dirty_any = true; | ||||
| 
 | ||||
|     uniform_block_data.fog_lut_dirty = true; | ||||
| 
 | ||||
|  | @ -1382,7 +1383,8 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) { | |||
|     case PICA_REG_INDEX_WORKAROUND(lighting.lut_data[6], 0x1ce): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.lut_data[7], 0x1cf): { | ||||
|         auto& lut_config = regs.lighting.lut_config; | ||||
|         uniform_block_data.lut_dirty[lut_config.type] = true; | ||||
|         uniform_block_data.lighting_lut_dirty[lut_config.type] = true; | ||||
|         uniform_block_data.lighting_lut_dirty_any = true; | ||||
|         break; | ||||
|     } | ||||
|     } | ||||
|  | @ -1950,24 +1952,27 @@ void RasterizerOpenGL::SyncAndUploadLUTs() { | |||
|                                 sizeof(GLvec4) * 256;      // proctex diff
 | ||||
| 
 | ||||
|     // Sync the lighting luts
 | ||||
|     for (unsigned index = 0; index < uniform_block_data.lut_dirty.size(); index++) { | ||||
|         if (uniform_block_data.lut_dirty[index]) { | ||||
|             std::array<GLvec2, 256> new_data; | ||||
|             const auto& source_lut = Pica::g_state.lighting.luts[index]; | ||||
|             std::transform(source_lut.begin(), source_lut.end(), new_data.begin(), | ||||
|                            [](const auto& entry) { | ||||
|                                return GLvec2{entry.ToFloat(), entry.DiffToFloat()}; | ||||
|                            }); | ||||
|     if (uniform_block_data.lighting_lut_dirty_any) { | ||||
|         for (unsigned index = 0; index < uniform_block_data.lighting_lut_dirty.size(); index++) { | ||||
|             if (uniform_block_data.lighting_lut_dirty[index]) { | ||||
|                 std::array<GLvec2, 256> new_data; | ||||
|                 const auto& source_lut = Pica::g_state.lighting.luts[index]; | ||||
|                 std::transform(source_lut.begin(), source_lut.end(), new_data.begin(), | ||||
|                                [](const auto& entry) { | ||||
|                                    return GLvec2{entry.ToFloat(), entry.DiffToFloat()}; | ||||
|                                }); | ||||
| 
 | ||||
|             if (new_data != lighting_lut_data[index]) { | ||||
|                 lighting_lut_data[index] = new_data; | ||||
|                 glBindBuffer(GL_TEXTURE_BUFFER, lighting_lut_buffer.handle); | ||||
|                 glBufferSubData(GL_TEXTURE_BUFFER, index * new_data.size() * sizeof(GLvec2), | ||||
|                                 new_data.size() * sizeof(GLvec2), new_data.data()); | ||||
|                 if (new_data != lighting_lut_data[index]) { | ||||
|                     lighting_lut_data[index] = new_data; | ||||
|                     glBindBuffer(GL_TEXTURE_BUFFER, lighting_lut_buffer.handle); | ||||
|                     glBufferSubData(GL_TEXTURE_BUFFER, index * new_data.size() * sizeof(GLvec2), | ||||
|                                     new_data.size() * sizeof(GLvec2), new_data.data()); | ||||
|                 } | ||||
|                 uniform_block_data.lighting_lut_dirty[index] = false; | ||||
|             } | ||||
|             uniform_block_data.lut_dirty[index] = false; | ||||
|         } | ||||
|     } | ||||
|     uniform_block_data.lighting_lut_dirty_any = false; | ||||
| 
 | ||||
|     // Sync the fog lut
 | ||||
|     if (uniform_block_data.fog_lut_dirty) { | ||||
|  |  | |||
|  | @ -250,7 +250,8 @@ private: | |||
| 
 | ||||
|     struct { | ||||
|         UniformData data; | ||||
|         std::array<bool, Pica::LightingRegs::NumLightingSampler> lut_dirty; | ||||
|         std::array<bool, Pica::LightingRegs::NumLightingSampler> lighting_lut_dirty; | ||||
|         bool lighting_lut_dirty_any; | ||||
|         bool fog_lut_dirty; | ||||
|         bool proctex_noise_lut_dirty; | ||||
|         bool proctex_color_map_dirty; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue