mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
113 lines
3.2 KiB
C++
113 lines
3.2 KiB
C++
#pragma once
|
|
#include <sstream>
|
|
#include <string_view>
|
|
|
|
#include "GLSLTypes.h"
|
|
#include "ShaderParam.h"
|
|
|
|
struct RSXFragmentProgram;
|
|
|
|
namespace rsx
|
|
{
|
|
// TODO: Move this somewhere else once more compilers are supported other than glsl
|
|
enum texture_control_bits
|
|
{
|
|
GAMMA_A = 0,
|
|
GAMMA_R,
|
|
GAMMA_G,
|
|
GAMMA_B,
|
|
ALPHAKILL,
|
|
RENORMALIZE,
|
|
EXPAND_A,
|
|
EXPAND_R,
|
|
EXPAND_G,
|
|
EXPAND_B,
|
|
DEPTH_FLOAT,
|
|
DEPTH_COMPARE_OP,
|
|
DEPTH_COMPARE_1,
|
|
DEPTH_COMPARE_2,
|
|
FILTERED_MAG,
|
|
FILTERED_MIN,
|
|
UNNORMALIZED_COORDS,
|
|
CLAMP_TEXCOORDS_BIT,
|
|
|
|
GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A),
|
|
EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A),
|
|
EXPAND_OFFSET = EXPAND_A
|
|
};
|
|
|
|
enum ROP_control_bits : u32
|
|
{
|
|
// Commands. These trigger explicit action.
|
|
ALPHA_TEST_ENABLE_BIT = 0,
|
|
SRGB_FRAMEBUFFER_BIT = 1,
|
|
ALPHA_TO_COVERAGE_ENABLE_BIT = 2,
|
|
POLYGON_STIPPLE_ENABLE_BIT = 3,
|
|
|
|
// Auxilliary config
|
|
INT_FRAMEBUFFER_BIT = 16,
|
|
MSAA_WRITE_ENABLE_BIT = 17,
|
|
|
|
// Data
|
|
ALPHA_FUNC_OFFSET = 18,
|
|
MSAA_SAMPLE_CTRL_OFFSET = 21,
|
|
|
|
// Data lengths
|
|
ALPHA_FUNC_NUM_BITS = 3,
|
|
MSAA_SAMPLE_CTRL_NUM_BITS = 2,
|
|
|
|
// Meta
|
|
ROP_CMD_MASK = 0xF // Commands are encoded in the lower 16 bits
|
|
};
|
|
|
|
struct ROP_control_t
|
|
{
|
|
u32 value = 0;
|
|
|
|
void enable_alpha_test() { value |= (1u << ROP_control_bits::ALPHA_TEST_ENABLE_BIT); }
|
|
void enable_framebuffer_sRGB() { value |= (1u << ROP_control_bits::SRGB_FRAMEBUFFER_BIT); }
|
|
void enable_alpha_to_coverage() { value |= (1u << ROP_control_bits::ALPHA_TO_COVERAGE_ENABLE_BIT); }
|
|
void enable_polygon_stipple() { value |= (1u << ROP_control_bits::POLYGON_STIPPLE_ENABLE_BIT); }
|
|
|
|
void enable_framebuffer_INT() { value |= (1u << ROP_control_bits::INT_FRAMEBUFFER_BIT); }
|
|
void enable_MSAA_writes() { value |= (1u << ROP_control_bits::MSAA_WRITE_ENABLE_BIT); }
|
|
|
|
void set_alpha_test_func(uint func) { value |= (func << ROP_control_bits::ALPHA_FUNC_OFFSET); }
|
|
void set_msaa_control(uint ctrl) { value |= (ctrl << ROP_control_bits::MSAA_SAMPLE_CTRL_OFFSET); }
|
|
};
|
|
}
|
|
|
|
namespace glsl
|
|
{
|
|
struct two_sided_lighting_config
|
|
{
|
|
bool two_sided_color;
|
|
bool two_sided_specular;
|
|
};
|
|
|
|
struct extension_flavour
|
|
{
|
|
static constexpr std::string_view
|
|
EXT = "EXT",
|
|
KHR = "KHR",
|
|
NV = "NV";
|
|
};
|
|
|
|
std::string getFloatTypeNameImpl(usz elementCount);
|
|
std::string getHalfTypeNameImpl(usz elementCount);
|
|
std::string compareFunctionImpl(COMPARE f, const std::string &Op0, const std::string &Op1, bool scalar = false);
|
|
void insert_vertex_input_fetch(std::stringstream& OS, glsl_rules rules, bool glsl4_compliant=true);
|
|
void insert_rop_init(std::ostream& OS);
|
|
void insert_rop(std::ostream& OS, const shader_properties& props);
|
|
void insert_glsl_legacy_function(std::ostream& OS, const shader_properties& props);
|
|
std::string getFunctionImpl(FUNCTION f);
|
|
void insert_subheader_block(std::ostream& OS);
|
|
|
|
void insert_fragment_shader_inputs_block(
|
|
std::stringstream& OS,
|
|
const std::string_view bary_coords_extenstion_type,
|
|
const RSXFragmentProgram& prog,
|
|
const std::vector<ParamType>& params,
|
|
const two_sided_lighting_config& _2sided_lighting,
|
|
std::function<int(std::string_view)> varying_location);
|
|
}
|