mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	gl_rasterizer: sync spot light status
This commit is contained in:
		
							parent
							
								
									b5addf8fb8
								
							
						
					
					
						commit
						686cbf3ac6
					
				| @ -735,6 +735,40 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) { | ||||
|         SyncLightPosition(7); | ||||
|         break; | ||||
| 
 | ||||
|     // Fragment spot lighting direction
 | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[0].spot_x, 0x146 + 0 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[0].spot_z, 0x147 + 0 * 0x10): | ||||
|         SyncLightSpotDirection(0); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[1].spot_x, 0x146 + 1 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[1].spot_z, 0x147 + 1 * 0x10): | ||||
|         SyncLightSpotDirection(1); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[2].spot_x, 0x146 + 2 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[2].spot_z, 0x147 + 2 * 0x10): | ||||
|         SyncLightSpotDirection(2); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[3].spot_x, 0x146 + 3 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[3].spot_z, 0x147 + 3 * 0x10): | ||||
|         SyncLightSpotDirection(3); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[4].spot_x, 0x146 + 4 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[4].spot_z, 0x147 + 4 * 0x10): | ||||
|         SyncLightSpotDirection(4); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[5].spot_x, 0x146 + 5 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[5].spot_z, 0x147 + 5 * 0x10): | ||||
|         SyncLightSpotDirection(5); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[6].spot_x, 0x146 + 6 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[6].spot_z, 0x147 + 6 * 0x10): | ||||
|         SyncLightSpotDirection(6); | ||||
|         break; | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[7].spot_x, 0x146 + 7 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[7].spot_z, 0x147 + 7 * 0x10): | ||||
|         SyncLightSpotDirection(7); | ||||
|         break; | ||||
| 
 | ||||
|     // Fragment lighting light source config
 | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[0].config, 0x149 + 0 * 0x10): | ||||
|     case PICA_REG_INDEX_WORKAROUND(lighting.light[1].config, 0x149 + 1 * 0x10): | ||||
| @ -1595,6 +1629,17 @@ void RasterizerOpenGL::SyncLightPosition(int light_index) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void RasterizerOpenGL::SyncLightSpotDirection(int light_index) { | ||||
|     const auto& light = Pica::g_state.regs.lighting.light[light_index]; | ||||
|     GLvec3 spot_direction = {light.spot_x / 2047.0f, light.spot_y / 2047.0f, | ||||
|                              light.spot_z / 2047.0f}; | ||||
| 
 | ||||
|     if (spot_direction != uniform_block_data.data.light_src[light_index].spot_direction) { | ||||
|         uniform_block_data.data.light_src[light_index].spot_direction = spot_direction; | ||||
|         uniform_block_data.dirty = true; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void RasterizerOpenGL::SyncLightDistanceAttenuationBias(int light_index) { | ||||
|     GLfloat dist_atten_bias = | ||||
|         Pica::float20::FromRaw(Pica::g_state.regs.lighting.light[light_index].dist_atten_bias) | ||||
|  | ||||
| @ -125,6 +125,7 @@ private: | ||||
|         alignas(16) GLvec3 diffuse; | ||||
|         alignas(16) GLvec3 ambient; | ||||
|         alignas(16) GLvec3 position; | ||||
|         alignas(16) GLvec3 spot_direction; // negated
 | ||||
|         GLfloat dist_atten_bias; | ||||
|         GLfloat dist_atten_scale; | ||||
|     }; | ||||
| @ -153,7 +154,7 @@ private: | ||||
|     }; | ||||
| 
 | ||||
|     static_assert( | ||||
|         sizeof(UniformData) == 0x3E0, | ||||
|         sizeof(UniformData) == 0x460, | ||||
|         "The size of the UniformData structure has changed, update the structure in the shader"); | ||||
|     static_assert(sizeof(UniformData) < 16384, | ||||
|                   "UniformData structure must be less than 16kb as per the OpenGL spec"); | ||||
| @ -241,6 +242,9 @@ private: | ||||
|     /// Syncs the specified light's position to match the PICA register
 | ||||
|     void SyncLightPosition(int light_index); | ||||
| 
 | ||||
|     /// Syncs the specified spot light direcition to match the PICA register
 | ||||
|     void SyncLightSpotDirection(int light_index); | ||||
| 
 | ||||
|     /// Syncs the specified light's distance attenuation bias to match the PICA register
 | ||||
|     void SyncLightDistanceAttenuationBias(int light_index); | ||||
| 
 | ||||
|  | ||||
| @ -75,6 +75,8 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) { | ||||
|         state.lighting.light[light_index].two_sided_diffuse = light.config.two_sided_diffuse != 0; | ||||
|         state.lighting.light[light_index].dist_atten_enable = | ||||
|             !regs.lighting.IsDistAttenDisabled(num); | ||||
|         state.lighting.light[light_index].spot_atten_enable = | ||||
|             !regs.lighting.IsSpotAttenDisabled(num); | ||||
|     } | ||||
| 
 | ||||
|     state.lighting.lut_d0.enable = regs.lighting.config1.disable_lut_d0 == 0; | ||||
| @ -87,6 +89,12 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) { | ||||
|     state.lighting.lut_d1.type = regs.lighting.lut_input.d1.Value(); | ||||
|     state.lighting.lut_d1.scale = regs.lighting.lut_scale.GetScale(regs.lighting.lut_scale.d1); | ||||
| 
 | ||||
|     // this is a dummy field due to lack of the corresponding register
 | ||||
|     state.lighting.lut_sp.enable = true; | ||||
|     state.lighting.lut_sp.abs_input = regs.lighting.abs_lut_input.disable_sp == 0; | ||||
|     state.lighting.lut_sp.type = regs.lighting.lut_input.sp.Value(); | ||||
|     state.lighting.lut_sp.scale = regs.lighting.lut_scale.GetScale(regs.lighting.lut_scale.sp); | ||||
| 
 | ||||
|     state.lighting.lut_fr.enable = regs.lighting.config1.disable_lut_fr == 0; | ||||
|     state.lighting.lut_fr.abs_input = regs.lighting.abs_lut_input.disable_fr == 0; | ||||
|     state.lighting.lut_fr.type = regs.lighting.lut_input.fr.Value(); | ||||
| @ -968,6 +976,7 @@ struct LightSrc { | ||||
|     vec3 diffuse; | ||||
|     vec3 ambient; | ||||
|     vec3 position; | ||||
|     vec3 spot_direction; | ||||
|     float dist_atten_bias; | ||||
|     float dist_atten_scale; | ||||
| }; | ||||
|  | ||||
| @ -93,6 +93,7 @@ union PicaShaderConfig { | ||||
|                 bool directional; | ||||
|                 bool two_sided_diffuse; | ||||
|                 bool dist_atten_enable; | ||||
|                 bool spot_atten_enable; | ||||
|             } light[8]; | ||||
| 
 | ||||
|             bool enable; | ||||
| @ -110,7 +111,7 @@ union PicaShaderConfig { | ||||
|                 bool abs_input; | ||||
|                 Pica::LightingRegs::LightingLutInput type; | ||||
|                 float scale; | ||||
|             } lut_d0, lut_d1, lut_fr, lut_rr, lut_rg, lut_rb; | ||||
|             } lut_d0, lut_d1, lut_sp, lut_fr, lut_rr, lut_rg, lut_rb; | ||||
|         } lighting; | ||||
| 
 | ||||
|         struct { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 wwylele
						wwylele