mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #619 from Subv/flip_cull
GPU: Flip the triangle front face winding if the GPU is configured to not flip the triangles.
This commit is contained in:
		
						commit
						2355460d7c
					
				| @ -478,7 +478,9 @@ public: | |||||||
| 
 | 
 | ||||||
|                 u32 depth_write_enabled; |                 u32 depth_write_enabled; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS(0x8); |                 INSERT_PADDING_WORDS(0x7); | ||||||
|  | 
 | ||||||
|  |                 u32 d3d_cull_mode; | ||||||
| 
 | 
 | ||||||
|                 BitField<0, 3, ComparisonOp> depth_test_func; |                 BitField<0, 3, ComparisonOp> depth_test_func; | ||||||
| 
 | 
 | ||||||
| @ -498,7 +500,13 @@ public: | |||||||
|                     u32 enable[NumRenderTargets]; |                     u32 enable[NumRenderTargets]; | ||||||
|                 } blend; |                 } blend; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS(0x2D); |                 INSERT_PADDING_WORDS(0xB); | ||||||
|  | 
 | ||||||
|  |                 union { | ||||||
|  |                     BitField<4, 1, u32> triangle_rast_flip; | ||||||
|  |                 } screen_y_control; | ||||||
|  | 
 | ||||||
|  |                 INSERT_PADDING_WORDS(0x21); | ||||||
| 
 | 
 | ||||||
|                 u32 vb_element_base; |                 u32 vb_element_base; | ||||||
| 
 | 
 | ||||||
| @ -528,7 +536,12 @@ public: | |||||||
|                     } |                     } | ||||||
|                 } tic; |                 } tic; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS(0x22); |                 INSERT_PADDING_WORDS(0x21); | ||||||
|  | 
 | ||||||
|  |                 union { | ||||||
|  |                     BitField<2, 1, u32> coord_origin; | ||||||
|  |                     BitField<3, 10, u32> enable; | ||||||
|  |                 } point_coord_replace; | ||||||
| 
 | 
 | ||||||
|                 struct { |                 struct { | ||||||
|                     u32 code_address_high; |                     u32 code_address_high; | ||||||
| @ -818,11 +831,14 @@ ASSERT_REG_POSITION(rt_control, 0x487); | |||||||
| ASSERT_REG_POSITION(depth_test_enable, 0x4B3); | ASSERT_REG_POSITION(depth_test_enable, 0x4B3); | ||||||
| ASSERT_REG_POSITION(independent_blend_enable, 0x4B9); | ASSERT_REG_POSITION(independent_blend_enable, 0x4B9); | ||||||
| ASSERT_REG_POSITION(depth_write_enabled, 0x4BA); | ASSERT_REG_POSITION(depth_write_enabled, 0x4BA); | ||||||
|  | ASSERT_REG_POSITION(d3d_cull_mode, 0x4C2); | ||||||
| ASSERT_REG_POSITION(depth_test_func, 0x4C3); | ASSERT_REG_POSITION(depth_test_func, 0x4C3); | ||||||
| ASSERT_REG_POSITION(blend, 0x4CF); | ASSERT_REG_POSITION(blend, 0x4CF); | ||||||
|  | ASSERT_REG_POSITION(screen_y_control, 0x4EB); | ||||||
| ASSERT_REG_POSITION(vb_element_base, 0x50D); | ASSERT_REG_POSITION(vb_element_base, 0x50D); | ||||||
| ASSERT_REG_POSITION(tsc, 0x557); | ASSERT_REG_POSITION(tsc, 0x557); | ||||||
| ASSERT_REG_POSITION(tic, 0x55D); | ASSERT_REG_POSITION(tic, 0x55D); | ||||||
|  | ASSERT_REG_POSITION(point_coord_replace, 0x581); | ||||||
| ASSERT_REG_POSITION(code_address, 0x582); | ASSERT_REG_POSITION(code_address, 0x582); | ||||||
| ASSERT_REG_POSITION(draw, 0x585); | ASSERT_REG_POSITION(draw, 0x585); | ||||||
| ASSERT_REG_POSITION(index_array, 0x5F2); | ASSERT_REG_POSITION(index_array, 0x5F2); | ||||||
|  | |||||||
| @ -771,6 +771,16 @@ void RasterizerOpenGL::SyncCullMode() { | |||||||
|     if (state.cull.enabled) { |     if (state.cull.enabled) { | ||||||
|         state.cull.front_face = MaxwellToGL::FrontFace(regs.cull.front_face); |         state.cull.front_face = MaxwellToGL::FrontFace(regs.cull.front_face); | ||||||
|         state.cull.mode = MaxwellToGL::CullFace(regs.cull.cull_face); |         state.cull.mode = MaxwellToGL::CullFace(regs.cull.cull_face); | ||||||
|  | 
 | ||||||
|  |         // If the GPU is configured to flip the rasterized triangles, then we need to flip the
 | ||||||
|  |         // notion of front and back. Note: We flip the triangles when the value of the register is 0
 | ||||||
|  |         // because OpenGL already does it for us.
 | ||||||
|  |         if (regs.screen_y_control.triangle_rast_flip == 0) { | ||||||
|  |             if (state.cull.front_face == GL_CCW) | ||||||
|  |                 state.cull.front_face = GL_CW; | ||||||
|  |             else if (state.cull.front_face == GL_CW) | ||||||
|  |                 state.cull.front_face = GL_CCW; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei