gl_rasterizer: Use the shared texture buffer for the fog lut.

This commit is contained in:
Markus Wick 2018-05-19 15:16:49 +02:00
parent 4679487640
commit 63fb7dcc1b
6 changed files with 8 additions and 36 deletions

View file

@ -135,16 +135,6 @@ RasterizerOpenGL::RasterizerOpenGL()
glActiveTexture(TextureUnits::TextureBufferLUT_RGBA.Enum()); glActiveTexture(TextureUnits::TextureBufferLUT_RGBA.Enum());
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, texture_buffer.GetHandle()); glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, texture_buffer.GetHandle());
// Setup the LUT for the fog
fog_lut.Create();
state.fog_lut.texture_buffer = fog_lut.handle;
state.Apply();
fog_lut_buffer.Create();
glBindBuffer(GL_TEXTURE_BUFFER, fog_lut_buffer.handle);
glBufferData(GL_TEXTURE_BUFFER, sizeof(GLfloat) * 2 * 128, nullptr, GL_DYNAMIC_DRAW);
glActiveTexture(TextureUnits::FogLUT.Enum());
glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, fog_lut_buffer.handle);
// Setup the noise LUT for proctex // Setup the noise LUT for proctex
proctex_noise_lut.Create(); proctex_noise_lut.Create();
state.proctex_noise_lut.texture_buffer = proctex_noise_lut.handle; state.proctex_noise_lut.texture_buffer = proctex_noise_lut.handle;
@ -1978,7 +1968,7 @@ void RasterizerOpenGL::SyncAndUploadLUTs() {
uniform_block_data.lighting_lut_dirty_any = false; uniform_block_data.lighting_lut_dirty_any = false;
// Sync the fog lut // Sync the fog lut
if (uniform_block_data.fog_lut_dirty) { if (uniform_block_data.fog_lut_dirty || invalidate) {
std::array<GLvec2, 128> new_data; std::array<GLvec2, 128> new_data;
std::transform(Pica::g_state.fog.lut.begin(), Pica::g_state.fog.lut.end(), new_data.begin(), std::transform(Pica::g_state.fog.lut.begin(), Pica::g_state.fog.lut.end(), new_data.begin(),
@ -1986,11 +1976,12 @@ void RasterizerOpenGL::SyncAndUploadLUTs() {
return GLvec2{entry.ToFloat(), entry.DiffToFloat()}; return GLvec2{entry.ToFloat(), entry.DiffToFloat()};
}); });
if (new_data != fog_lut_data) { if (new_data != fog_lut_data || invalidate) {
fog_lut_data = new_data; fog_lut_data = new_data;
glBindBuffer(GL_TEXTURE_BUFFER, fog_lut_buffer.handle); std::memcpy(buffer + bytes_used, new_data.data(), new_data.size() * sizeof(GLvec2));
glBufferSubData(GL_TEXTURE_BUFFER, 0, new_data.size() * sizeof(GLvec2), uniform_block_data.data.fog_lut_offset = (offset + bytes_used) / sizeof(GLvec2);
new_data.data()); uniform_block_data.dirty = true;
bytes_used += new_data.size() * sizeof(GLvec2);
} }
uniform_block_data.fog_lut_dirty = false; uniform_block_data.fog_lut_dirty = false;
} }

View file

@ -290,9 +290,6 @@ private:
OGLTexture texture_buffer_lut_rgba; OGLTexture texture_buffer_lut_rgba;
std::array<std::array<GLvec2, 256>, Pica::LightingRegs::NumLightingSampler> lighting_lut_data{}; std::array<std::array<GLvec2, 256>, Pica::LightingRegs::NumLightingSampler> lighting_lut_data{};
OGLBuffer fog_lut_buffer;
OGLTexture fog_lut;
std::array<GLvec2, 128> fog_lut_data{}; std::array<GLvec2, 128> fog_lut_data{};
OGLBuffer proctex_noise_lut_buffer; OGLBuffer proctex_noise_lut_buffer;

View file

@ -1224,7 +1224,6 @@ uniform sampler2D tex2;
uniform samplerCube tex_cube; uniform samplerCube tex_cube;
uniform samplerBuffer texture_buffer_lut_rg; uniform samplerBuffer texture_buffer_lut_rg;
uniform samplerBuffer texture_buffer_lut_rgba; uniform samplerBuffer texture_buffer_lut_rgba;
uniform samplerBuffer fog_lut;
uniform samplerBuffer proctex_noise_lut; uniform samplerBuffer proctex_noise_lut;
uniform samplerBuffer proctex_color_map; uniform samplerBuffer proctex_color_map;
uniform samplerBuffer proctex_alpha_map; uniform samplerBuffer proctex_alpha_map;
@ -1494,7 +1493,8 @@ vec4 secondary_fragment_color = vec4(0.0);
// Generate clamped fog factor from LUT for given fog index // Generate clamped fog factor from LUT for given fog index
out += "float fog_i = clamp(floor(fog_index), 0.0, 127.0);\n"; out += "float fog_i = clamp(floor(fog_index), 0.0, 127.0);\n";
out += "float fog_f = fog_index - fog_i;\n"; out += "float fog_f = fog_index - fog_i;\n";
out += "vec2 fog_lut_entry = texelFetch(fog_lut, int(fog_i) + fog_lut_offset).rg;\n"; out += "vec2 fog_lut_entry = texelFetch(texture_buffer_lut_rg, int(fog_i) + "
"fog_lut_offset).rg;\n";
out += "float fog_factor = fog_lut_entry.r + fog_lut_entry.g * fog_f;\n"; out += "float fog_factor = fog_lut_entry.r + fog_lut_entry.g * fog_f;\n";
out += "fog_factor = clamp(fog_factor, 0.0, 1.0);\n"; out += "fog_factor = clamp(fog_factor, 0.0, 1.0);\n";

View file

@ -57,7 +57,6 @@ static void SetShaderSamplerBindings(GLuint shader) {
// Set the texture samplers to correspond to different lookup table texture units // Set the texture samplers to correspond to different lookup table texture units
SetShaderSamplerBinding(shader, "texture_buffer_lut_rg", TextureUnits::TextureBufferLUT_RG); SetShaderSamplerBinding(shader, "texture_buffer_lut_rg", TextureUnits::TextureBufferLUT_RG);
SetShaderSamplerBinding(shader, "texture_buffer_lut_rgba", TextureUnits::TextureBufferLUT_RGBA); SetShaderSamplerBinding(shader, "texture_buffer_lut_rgba", TextureUnits::TextureBufferLUT_RGBA);
SetShaderSamplerBinding(shader, "fog_lut", TextureUnits::FogLUT);
SetShaderSamplerBinding(shader, "proctex_noise_lut", TextureUnits::ProcTexNoiseLUT); SetShaderSamplerBinding(shader, "proctex_noise_lut", TextureUnits::ProcTexNoiseLUT);
SetShaderSamplerBinding(shader, "proctex_color_map", TextureUnits::ProcTexColorMap); SetShaderSamplerBinding(shader, "proctex_color_map", TextureUnits::ProcTexColorMap);
SetShaderSamplerBinding(shader, "proctex_alpha_map", TextureUnits::ProcTexAlphaMap); SetShaderSamplerBinding(shader, "proctex_alpha_map", TextureUnits::ProcTexAlphaMap);

View file

@ -58,8 +58,6 @@ OpenGLState::OpenGLState() {
texture_buffer_lut_rg.texture_buffer = 0; texture_buffer_lut_rg.texture_buffer = 0;
texture_buffer_lut_rgba.texture_buffer = 0; texture_buffer_lut_rgba.texture_buffer = 0;
fog_lut.texture_buffer = 0;
proctex_lut.texture_buffer = 0; proctex_lut.texture_buffer = 0;
proctex_diff_lut.texture_buffer = 0; proctex_diff_lut.texture_buffer = 0;
proctex_color_map.texture_buffer = 0; proctex_color_map.texture_buffer = 0;
@ -235,12 +233,6 @@ void OpenGLState::Apply() const {
glBindTexture(GL_TEXTURE_BUFFER, texture_buffer_lut_rgba.texture_buffer); glBindTexture(GL_TEXTURE_BUFFER, texture_buffer_lut_rgba.texture_buffer);
} }
// Fog LUT
if (fog_lut.texture_buffer != cur_state.fog_lut.texture_buffer) {
glActiveTexture(TextureUnits::FogLUT.Enum());
glBindTexture(GL_TEXTURE_BUFFER, fog_lut.texture_buffer);
}
// ProcTex Noise LUT // ProcTex Noise LUT
if (proctex_noise_lut.texture_buffer != cur_state.proctex_noise_lut.texture_buffer) { if (proctex_noise_lut.texture_buffer != cur_state.proctex_noise_lut.texture_buffer) {
glActiveTexture(TextureUnits::ProcTexNoiseLUT.Enum()); glActiveTexture(TextureUnits::ProcTexNoiseLUT.Enum());
@ -386,8 +378,6 @@ OpenGLState& OpenGLState::ResetTexture(GLuint handle) {
texture_buffer_lut_rg.texture_buffer = 0; texture_buffer_lut_rg.texture_buffer = 0;
if (texture_buffer_lut_rgba.texture_buffer == handle) if (texture_buffer_lut_rgba.texture_buffer == handle)
texture_buffer_lut_rgba.texture_buffer = 0; texture_buffer_lut_rgba.texture_buffer = 0;
if (fog_lut.texture_buffer == handle)
fog_lut.texture_buffer = 0;
if (proctex_noise_lut.texture_buffer == handle) if (proctex_noise_lut.texture_buffer == handle)
proctex_noise_lut.texture_buffer = 0; proctex_noise_lut.texture_buffer = 0;
if (proctex_color_map.texture_buffer == handle) if (proctex_color_map.texture_buffer == handle)

View file

@ -20,7 +20,6 @@ constexpr TextureUnit PicaTexture(int unit) {
return TextureUnit{unit}; return TextureUnit{unit};
} }
constexpr TextureUnit FogLUT{4};
constexpr TextureUnit ProcTexNoiseLUT{5}; constexpr TextureUnit ProcTexNoiseLUT{5};
constexpr TextureUnit ProcTexColorMap{6}; constexpr TextureUnit ProcTexColorMap{6};
constexpr TextureUnit ProcTexAlphaMap{7}; constexpr TextureUnit ProcTexAlphaMap{7};
@ -112,10 +111,6 @@ public:
GLuint texture_buffer; // GL_TEXTURE_BINDING_BUFFER GLuint texture_buffer; // GL_TEXTURE_BINDING_BUFFER
} texture_buffer_lut_rgba; } texture_buffer_lut_rgba;
struct {
GLuint texture_buffer; // GL_TEXTURE_BINDING_BUFFER
} fog_lut;
struct { struct {
GLuint texture_buffer; // GL_TEXTURE_BINDING_BUFFER GLuint texture_buffer; // GL_TEXTURE_BINDING_BUFFER
} proctex_noise_lut; } proctex_noise_lut;