mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-29 17:54:06 +01:00 
			
		
		
		
	shader/transform_feedback: Add host API friendly TFB builder
This commit is contained in:
		
							parent
							
								
									666d431ad8
								
							
						
					
					
						commit
						3dcaa84ba4
					
				| @ -102,6 +102,8 @@ set(HASH_FILES | ||||
|     "${VIDEO_CORE}/shader/shader_ir.cpp" | ||||
|     "${VIDEO_CORE}/shader/shader_ir.h" | ||||
|     "${VIDEO_CORE}/shader/track.cpp" | ||||
|     "${VIDEO_CORE}/shader/transform_feedback.cpp" | ||||
|     "${VIDEO_CORE}/shader/transform_feedback.h" | ||||
| ) | ||||
| set(COMBINED "") | ||||
| foreach (F IN LISTS HASH_FILES) | ||||
|  | ||||
| @ -83,6 +83,8 @@ add_custom_command(OUTPUT scm_rev.cpp | ||||
|       "${VIDEO_CORE}/shader/shader_ir.cpp" | ||||
|       "${VIDEO_CORE}/shader/shader_ir.h" | ||||
|       "${VIDEO_CORE}/shader/track.cpp" | ||||
|       "${VIDEO_CORE}/shader/transform_feedback.cpp" | ||||
|       "${VIDEO_CORE}/shader/transform_feedback.h" | ||||
|       # and also check that the scm_rev files haven't changed | ||||
|       "${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp.in" | ||||
|       "${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.h" | ||||
|  | ||||
| @ -129,6 +129,8 @@ add_library(video_core STATIC | ||||
|     shader/shader_ir.cpp | ||||
|     shader/shader_ir.h | ||||
|     shader/track.cpp | ||||
|     shader/transform_feedback.cpp | ||||
|     shader/transform_feedback.h | ||||
|     surface.cpp | ||||
|     surface.h | ||||
|     texture_cache/format_lookup_table.cpp | ||||
|  | ||||
							
								
								
									
										114
									
								
								src/video_core/shader/transform_feedback.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/video_core/shader/transform_feedback.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | ||||
| // Copyright 2020 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <array> | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "video_core/engines/maxwell_3d.h" | ||||
| #include "video_core/shader/registry.h" | ||||
| #include "video_core/shader/transform_feedback.h" | ||||
| 
 | ||||
| namespace VideoCommon::Shader { | ||||
| 
 | ||||
| namespace { | ||||
| 
 | ||||
| using Maxwell = Tegra::Engines::Maxwell3D::Regs; | ||||
| 
 | ||||
| // TODO(Rodrigo): Change this to constexpr std::unordered_set in C++20
 | ||||
| 
 | ||||
| /// Attribute offsets that describe a vector
 | ||||
| constexpr std::array VECTORS = { | ||||
|     28,  // gl_Position
 | ||||
|     32,  // Generic 0
 | ||||
|     36,  // Generic 1
 | ||||
|     40,  // Generic 2
 | ||||
|     44,  // Generic 3
 | ||||
|     48,  // Generic 4
 | ||||
|     52,  // Generic 5
 | ||||
|     56,  // Generic 6
 | ||||
|     60,  // Generic 7
 | ||||
|     64,  // Generic 8
 | ||||
|     68,  // Generic 9
 | ||||
|     72,  // Generic 10
 | ||||
|     76,  // Generic 11
 | ||||
|     80,  // Generic 12
 | ||||
|     84,  // Generic 13
 | ||||
|     88,  // Generic 14
 | ||||
|     92,  // Generic 15
 | ||||
|     96,  // Generic 16
 | ||||
|     100, // Generic 17
 | ||||
|     104, // Generic 18
 | ||||
|     108, // Generic 19
 | ||||
|     112, // Generic 20
 | ||||
|     116, // Generic 21
 | ||||
|     120, // Generic 22
 | ||||
|     124, // Generic 23
 | ||||
|     128, // Generic 24
 | ||||
|     132, // Generic 25
 | ||||
|     136, // Generic 26
 | ||||
|     140, // Generic 27
 | ||||
|     144, // Generic 28
 | ||||
|     148, // Generic 29
 | ||||
|     152, // Generic 30
 | ||||
|     156, // Generic 31
 | ||||
|     160, // gl_FrontColor
 | ||||
|     164, // gl_FrontSecondaryColor
 | ||||
|     160, // gl_BackColor
 | ||||
|     164, // gl_BackSecondaryColor
 | ||||
|     192, // gl_TexCoord[0]
 | ||||
|     196, // gl_TexCoord[1]
 | ||||
|     200, // gl_TexCoord[2]
 | ||||
|     204, // gl_TexCoord[3]
 | ||||
|     208, // gl_TexCoord[4]
 | ||||
|     212, // gl_TexCoord[5]
 | ||||
|     216, // gl_TexCoord[6]
 | ||||
|     220, // gl_TexCoord[7]
 | ||||
| }; | ||||
| } // namespace
 | ||||
| 
 | ||||
| std::unordered_map<u8, VaryingTFB> BuildTransformFeedback(const GraphicsInfo& info) { | ||||
| 
 | ||||
|     std::unordered_map<u8, VaryingTFB> tfb; | ||||
| 
 | ||||
|     for (std::size_t buffer = 0; buffer < Maxwell::NumTransformFeedbackBuffers; ++buffer) { | ||||
|         const auto& locations = info.tfb_varying_locs[buffer]; | ||||
|         const auto& layout = info.tfb_layouts[buffer]; | ||||
|         const std::size_t varying_count = layout.varying_count; | ||||
| 
 | ||||
|         std::size_t highest = 0; | ||||
| 
 | ||||
|         for (std::size_t offset = 0; offset < varying_count; ++offset) { | ||||
|             const std::size_t base_offset = offset; | ||||
|             const u8 location = locations[offset]; | ||||
| 
 | ||||
|             VaryingTFB varying; | ||||
|             varying.buffer = layout.stream; | ||||
|             varying.offset = offset * sizeof(u32); | ||||
|             varying.components = 1; | ||||
| 
 | ||||
|             if (std::find(VECTORS.begin(), VECTORS.end(), location / 4 * 4) != VECTORS.end()) { | ||||
|                 UNIMPLEMENTED_IF_MSG(location % 4 != 0, "Unaligned TFB"); | ||||
| 
 | ||||
|                 const u8 base_index = location / 4; | ||||
|                 while (offset + 1 < varying_count && base_index == locations[offset + 1] / 4) { | ||||
|                     ++offset; | ||||
|                     ++varying.components; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             [[maybe_unused]] const bool inserted = tfb.emplace(location, varying).second; | ||||
|             UNIMPLEMENTED_IF_MSG(!inserted, "Varying already stored"); | ||||
| 
 | ||||
|             highest = std::max(highest, (base_offset + varying.components) * sizeof(u32)); | ||||
|         } | ||||
| 
 | ||||
|         UNIMPLEMENTED_IF(highest != layout.stride); | ||||
|     } | ||||
|     return tfb; | ||||
| } | ||||
| 
 | ||||
| } // namespace VideoCommon::Shader
 | ||||
							
								
								
									
										22
									
								
								src/video_core/shader/transform_feedback.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/video_core/shader/transform_feedback.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| // Copyright 2020 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "video_core/shader/registry.h" | ||||
| 
 | ||||
| namespace VideoCommon::Shader { | ||||
| 
 | ||||
| struct VaryingTFB { | ||||
|     std::size_t buffer; | ||||
|     std::size_t offset; | ||||
|     std::size_t components; | ||||
| }; | ||||
| 
 | ||||
| std::unordered_map<u8, VaryingTFB> BuildTransformFeedback(const GraphicsInfo& info); | ||||
| 
 | ||||
| } // namespace VideoCommon::Shader
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user