mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	VideoCore: Extract swrast-specific data from OutputVertex
This commit is contained in:
		
							parent
							
								
									8ed9f9d49f
								
							
						
					
					
						commit
						dcdffabfe6
					
				
					 5 changed files with 64 additions and 58 deletions
				
			
		|  | @ -26,7 +26,7 @@ OutputVertex OutputVertex::FromAttributeBuffer(const Regs& regs, AttributeBuffer | |||
|         OutputVertex ret{}; | ||||
|         std::array<float24, 24> vertex_slots; | ||||
|     }; | ||||
|     static_assert(sizeof(vertex_slots) <= sizeof(ret), "Struct and array have different sizes."); | ||||
|     static_assert(sizeof(vertex_slots) == sizeof(ret), "Struct and array have different sizes."); | ||||
| 
 | ||||
|     unsigned int num_attributes = regs.vs_output_total; | ||||
|     ASSERT(num_attributes <= 7); | ||||
|  |  | |||
|  | @ -28,9 +28,6 @@ struct AttributeBuffer { | |||
| }; | ||||
| 
 | ||||
| struct OutputVertex { | ||||
|     OutputVertex() = default; | ||||
| 
 | ||||
|     // VS output attributes
 | ||||
|     Math::Vec4<float24> pos; | ||||
|     Math::Vec4<float24> quat; | ||||
|     Math::Vec4<float24> color; | ||||
|  | @ -42,42 +39,22 @@ struct OutputVertex { | |||
|     INSERT_PADDING_WORDS(1); | ||||
|     Math::Vec2<float24> tc2; | ||||
| 
 | ||||
|     // Padding for optimal alignment
 | ||||
|     INSERT_PADDING_WORDS(4); | ||||
| 
 | ||||
|     // Attributes used to store intermediate results
 | ||||
| 
 | ||||
|     // position after perspective divide
 | ||||
|     Math::Vec3<float24> screenpos; | ||||
|     INSERT_PADDING_WORDS(1); | ||||
| 
 | ||||
|     // Linear interpolation
 | ||||
|     // factor: 0=this, 1=vtx
 | ||||
|     void Lerp(float24 factor, const OutputVertex& vtx) { | ||||
|         pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor); | ||||
| 
 | ||||
|         // TODO: Should perform perspective correct interpolation here...
 | ||||
|         tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor); | ||||
|         tc1 = tc1 * factor + vtx.tc1 * (float24::FromFloat32(1) - factor); | ||||
|         tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor); | ||||
| 
 | ||||
|         screenpos = screenpos * factor + vtx.screenpos * (float24::FromFloat32(1) - factor); | ||||
| 
 | ||||
|         color = color * factor + vtx.color * (float24::FromFloat32(1) - factor); | ||||
|     } | ||||
| 
 | ||||
|     // Linear interpolation
 | ||||
|     // factor: 0=v0, 1=v1
 | ||||
|     static OutputVertex Lerp(float24 factor, const OutputVertex& v0, const OutputVertex& v1) { | ||||
|         OutputVertex ret = v0; | ||||
|         ret.Lerp(factor, v1); | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     static OutputVertex FromAttributeBuffer(const Regs& regs, AttributeBuffer& output); | ||||
| }; | ||||
| #define ASSERT_POS(var, pos)                                                                       \ | ||||
|     static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong "       \ | ||||
|                                                                         "offset.") | ||||
| ASSERT_POS(pos, Regs::VSOutputAttributes::POSITION_X); | ||||
| ASSERT_POS(quat, Regs::VSOutputAttributes::QUATERNION_X); | ||||
| ASSERT_POS(color, Regs::VSOutputAttributes::COLOR_R); | ||||
| ASSERT_POS(tc0, Regs::VSOutputAttributes::TEXCOORD0_U); | ||||
| ASSERT_POS(tc1, Regs::VSOutputAttributes::TEXCOORD1_U); | ||||
| ASSERT_POS(tc0_w, Regs::VSOutputAttributes::TEXCOORD0_W); | ||||
| ASSERT_POS(view, Regs::VSOutputAttributes::VIEW_X); | ||||
| ASSERT_POS(tc2, Regs::VSOutputAttributes::TEXCOORD2_U); | ||||
| #undef ASSERT_POS | ||||
| static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD"); | ||||
| static_assert(sizeof(OutputVertex) == 32 * sizeof(float), "OutputVertex has invalid size"); | ||||
| static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size"); | ||||
| 
 | ||||
| /**
 | ||||
|  * This structure contains the state information that needs to be unique for a shader unit. The 3DS | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue