9 changed files with 116 additions and 102 deletions
-
1src/video_core/CMakeLists.txt
-
2src/video_core/debug_utils/debug_utils.cpp
-
2src/video_core/debug_utils/debug_utils.h
-
97src/video_core/pica.h
-
104src/video_core/regs_shader.h
-
4src/video_core/shader/shader.cpp
-
4src/video_core/shader/shader.h
-
2src/video_core/shader/shader_interpreter.cpp
-
2src/video_core/shader/shader_interpreter.h
@ -0,0 +1,104 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <array> |
|||
|
|||
#include "common/bit_field.h" |
|||
#include "common/common_funcs.h" |
|||
#include "common/common_types.h" |
|||
|
|||
namespace Pica { |
|||
|
|||
struct ShaderRegs { |
|||
BitField<0, 16, u32> bool_uniforms; |
|||
|
|||
union { |
|||
BitField<0, 8, u32> x; |
|||
BitField<8, 8, u32> y; |
|||
BitField<16, 8, u32> z; |
|||
BitField<24, 8, u32> w; |
|||
} int_uniforms[4]; |
|||
|
|||
INSERT_PADDING_WORDS(0x4); |
|||
|
|||
union { |
|||
// Number of input attributes to shader unit - 1 |
|||
BitField<0, 4, u32> max_input_attribute_index; |
|||
}; |
|||
|
|||
// Offset to shader program entry point (in words) |
|||
BitField<0, 16, u32> main_offset; |
|||
|
|||
/// Maps input attributes to registers. 4-bits per attribute, specifying a register index |
|||
u32 input_attribute_to_register_map_low; |
|||
u32 input_attribute_to_register_map_high; |
|||
|
|||
unsigned int GetRegisterForAttribute(unsigned int attribute_index) const { |
|||
u64 map = ((u64)input_attribute_to_register_map_high << 32) | |
|||
(u64)input_attribute_to_register_map_low; |
|||
return (map >> (attribute_index * 4)) & 0b1111; |
|||
} |
|||
|
|||
BitField<0, 16, u32> output_mask; |
|||
|
|||
// 0x28E, CODETRANSFER_END |
|||
INSERT_PADDING_WORDS(0x2); |
|||
|
|||
struct { |
|||
enum Format : u32 { |
|||
FLOAT24 = 0, |
|||
FLOAT32 = 1, |
|||
}; |
|||
|
|||
bool IsFloat32() const { |
|||
return format == FLOAT32; |
|||
} |
|||
|
|||
union { |
|||
// Index of the next uniform to write to |
|||
// TODO: ctrulib uses 8 bits for this, however that seems to yield lots of invalid |
|||
// indices |
|||
// TODO: Maybe the uppermost index is for the geometry shader? Investigate! |
|||
BitField<0, 7, u32> index; |
|||
|
|||
BitField<31, 1, Format> format; |
|||
}; |
|||
|
|||
// Writing to these registers sets the current uniform. |
|||
u32 set_value[8]; |
|||
|
|||
} uniform_setup; |
|||
|
|||
INSERT_PADDING_WORDS(0x2); |
|||
|
|||
struct { |
|||
// Offset of the next instruction to write code to. |
|||
// Incremented with each instruction write. |
|||
u32 offset; |
|||
|
|||
// Writing to these registers sets the "current" word in the shader program. |
|||
u32 set_word[8]; |
|||
} program; |
|||
|
|||
INSERT_PADDING_WORDS(0x1); |
|||
|
|||
// This register group is used to load an internal table of swizzling patterns, |
|||
// which are indexed by each shader instruction to specify vector component swizzling. |
|||
struct { |
|||
// Offset of the next swizzle pattern to write code to. |
|||
// Incremented with each instruction write. |
|||
u32 offset; |
|||
|
|||
// Writing to these registers sets the current swizzle pattern in the table. |
|||
u32 set_word[8]; |
|||
} swizzle_patterns; |
|||
|
|||
INSERT_PADDING_WORDS(0x2); |
|||
}; |
|||
|
|||
static_assert(sizeof(ShaderRegs) == 0x30 * sizeof(u32), "ShaderRegs struct has incorrect size"); |
|||
|
|||
} // namespace Pica |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue