Synced shader changes from ReDIVA

This commit is contained in:
korenkonder
2024-08-28 23:55:05 +03:00
parent 41a83134c0
commit b16fc1f5fb
17 changed files with 113 additions and 225 deletions
Binary file not shown.
-24
View File
@@ -82,30 +82,6 @@ namespace GL {
return 0;
}
void* ArrayBuffer::MapMemory(size_t offset, size_t length) {
if (!buffer)
return 0;
void* data;
if (GL_VERSION_4_5)
data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(buffer);
data = glMapBufferRange(GL_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
}
if (data)
return data;
if (GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
return 0;
}
void ArrayBuffer::UnmapMemory() {
if (!buffer)
return;
-1
View File
@@ -31,7 +31,6 @@ namespace GL {
void Create(size_t size, const void* data, bool dynamic = false);
void Destroy();
void* MapMemory();
void* MapMemory(size_t offset, size_t length);
void UnmapMemory();
void WriteMemory(size_t offset, size_t size, const void* data);
-24
View File
@@ -82,30 +82,6 @@ namespace GL {
return 0;
}
void* ElementArrayBuffer::MapMemory(size_t offset, size_t length) {
if (!buffer)
return 0;
void* data;
if (GL_VERSION_4_5)
data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
else {
gl_state_bind_element_array_buffer(buffer);
data = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
}
if (data)
return data;
if (GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
gl_state_bind_element_array_buffer(0);
}
return 0;
}
void ElementArrayBuffer::UnmapMemory() {
if (!buffer)
return;
+4 -1
View File
@@ -18,6 +18,10 @@ namespace GL {
}
inline ElementArrayBuffer(GLuint buffer) : buffer(buffer) {
}
inline ~ElementArrayBuffer() {
}
@@ -27,7 +31,6 @@ namespace GL {
void Create(size_t size, const void* data, bool dynamic = false);
void Destroy();
void* MapMemory();
void* MapMemory(size_t offset, size_t length);
void UnmapMemory();
void WriteMemory(size_t offset, size_t size, const void* data);
-24
View File
@@ -82,30 +82,6 @@ namespace GL {
return 0;
}
void* ShaderStorageBuffer::MapMemory(size_t offset, size_t length) {
if (!buffer)
return 0;
void* data;
if (GL_VERSION_4_5)
data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
else {
gl_state_bind_shader_storage_buffer(buffer);
data = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
}
if (data)
return data;
if (GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
gl_state_bind_shader_storage_buffer(0);
}
return 0;
}
void ShaderStorageBuffer::UnmapMemory() {
if (!buffer)
return;
+4 -1
View File
@@ -18,6 +18,10 @@ namespace GL {
}
inline ShaderStorageBuffer(GLuint buffer) : buffer(buffer) {
}
inline ~ShaderStorageBuffer() {
}
@@ -27,7 +31,6 @@ namespace GL {
void Create(size_t size, const void* data, bool dynamic = false);
void Destroy();
void* MapMemory();
void* MapMemory(size_t offset, size_t length);
void UnmapMemory();
void WriteMemory(size_t offset, size_t size, const void* data);
-24
View File
@@ -82,30 +82,6 @@ namespace GL {
return 0;
}
void* UniformBuffer::MapMemory(size_t offset, size_t length) {
if (!buffer)
return 0;
void* data;
if (GL_VERSION_4_5)
data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
else {
gl_state_bind_uniform_buffer(buffer);
data = glMapBufferRange(GL_UNIFORM_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY);
}
if (data)
return data;
if (GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_UNIFORM_BUFFER);
gl_state_bind_uniform_buffer(0);
}
return 0;
}
void UniformBuffer::UnmapMemory() {
if (!buffer)
return;
+4 -1
View File
@@ -18,6 +18,10 @@ namespace GL {
}
inline UniformBuffer(GLuint buffer) : buffer(buffer) {
}
inline ~UniformBuffer() {
}
@@ -27,7 +31,6 @@ namespace GL {
void Create(size_t size, const void* data, bool dynamic = false);
void Destroy();
void* MapMemory();
void* MapMemory(size_t offset, size_t length);
void UnmapMemory();
void WriteMemory(size_t offset, size_t size, const void* data);
+1 -1
View File
@@ -1961,7 +1961,7 @@ void water_particle::draw(mat4* mat) {
shaders_ft.set(SHADER_FT_W_PTCL);
gl_state_bind_vertex_array(rctx->common_vao);
water_particle_scene_ubo.Bind(5);
water_particle_scene_ubo.Bind(0);
ssbo.Bind(0);
texture* tex = texture_manager_get_texture(splash_tex_id);
if (tex)
-10
View File
@@ -1989,11 +1989,6 @@ namespace mdl {
uniform_value_reset();
gl_state_get();
rctx->obj_shader_ubo.Bind(0);
rctx->obj_scene_ubo.Bind(1);
rctx->obj_batch_ubo.Bind(2);
rctx->obj_skinning_ubo.Bind(4);
switch (type) {
case OBJ_TYPE_TRANSLUCENT:
case OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS:
@@ -2149,11 +2144,6 @@ namespace mdl {
uniform_value_reset();
gl_state_get();
rctx->obj_shader_ubo.Bind(0);
rctx->obj_scene_ubo.Bind(1);
rctx->obj_batch_ubo.Bind(2);
rctx->obj_skinning_ubo.Bind(4);
switch (type) {
case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1:
case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2:
+7 -1
View File
@@ -56,6 +56,10 @@ namespace mdl {
rctx->obj_shader_ubo.WriteMemory(rctx->obj_shader);
rctx->obj_batch_ubo.WriteMemory(rctx->obj_batch);
rctx->obj_shader_ubo.Bind(0);
rctx->obj_scene_ubo.Bind(1);
rctx->obj_batch_ubo.Bind(2);
if (primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP && index_format == OBJ_INDEX_U16)
shaders_ft.draw_range_elements(GL_TRIANGLE_STRIP,
start, end, count, GL_UNSIGNED_SHORT, (void*)indices);
@@ -206,7 +210,9 @@ namespace mdl {
g_joint_transforms[2] = mat.row2;
}
rctx->obj_skinning_ubo.WriteMemory(rctx->obj_skinning);
rctx->obj_skinning_ssbo.WriteMemory(rctx->obj_skinning);
rctx->obj_skinning_ssbo.Bind(0);
rctx->obj_batch.set_transforms(mat4_identity, rctx->view_mat, rctx->proj_mat);
+2 -2
View File
@@ -349,7 +349,7 @@ samplers(), render_samplers(), sprite_samplers(), screen_width(), screen_height(
obj_shader_ubo.Create(sizeof(obj_shader_shader_data));
obj_scene_ubo.Create(sizeof(obj_scene_shader_data));
obj_batch_ubo.Create(sizeof(obj_batch_shader_data));
obj_skinning_ubo.Create(sizeof(obj_skinning_shader_data));
obj_skinning_ssbo.Create(sizeof(obj_skinning_shader_data));
static const vec4 border_color = 0.0f;
@@ -449,7 +449,7 @@ render_context::~render_context() {
glDeleteSamplers(4, render_samplers);
glDeleteSamplers(18, samplers);
obj_skinning_ubo.Destroy();
obj_skinning_ssbo.Destroy();
obj_batch_ubo.Destroy();
obj_scene_ubo.Destroy();
obj_shader_ubo.Destroy();
+2 -1
View File
@@ -9,6 +9,7 @@
#include "../KKdLib/mat.hpp"
#include "../KKdLib/vec.hpp"
#include "GL/array_buffer.hpp"
#include "GL/shader_storage_buffer.hpp"
#include "GL/uniform_buffer.hpp"
#include "light_param/fog.hpp"
#include "light_param/light.hpp"
@@ -411,7 +412,7 @@ struct render_context {
GL::UniformBuffer obj_shader_ubo;
GL::UniformBuffer obj_scene_ubo;
GL::UniformBuffer obj_batch_ubo;
GL::UniformBuffer obj_skinning_ubo;
GL::ShaderStorageBuffer obj_skinning_ssbo;
texture* empty_texture_2d;
texture* empty_texture_cube_map;
+86 -107
View File
@@ -25,7 +25,7 @@ static GLuint shader_compile(const char* vert, const char* frag, const char* vp,
static GLuint shader_compile_binary(const char* vert, const char* frag, const char* vp, const char* fp,
program_binary* bin, GLsizei* buffer_size, void** binary);
static bool shader_load_binary_shader(program_binary* bin, GLuint* program, const char* vp, const char* fp);
static void shader_update_data(shader_set_data* set);
static bool shader_update_data(shader_set_data* set);
int32_t shader::bind(shader_set_data* set, uint32_t sub_index) {
set->curr_program = 0;
@@ -62,104 +62,79 @@ int32_t shader::bind(shader_set_data* set, uint32_t sub_index) {
return 0;
}
bool shader::parse_define(const char* data, char** temp, size_t* temp_size) {
static void parse_define_inner(std::string& temp) {
size_t off = 0;
while (true) {
size_t pos_set = temp.find("set = ", off);
size_t pos_binding = temp.find("binding = ", off);
if (pos_set == -1 || pos_binding == -1)
break;
temp.erase(pos_set, pos_binding - pos_set);
off = pos_set + 10;
}
}
bool shader::parse_define(const char* data, std::string& temp) {
if (!data)
return false;
const char* def = strstr(data, "//DEF\n");
if (!def) {
size_t len = utf8_length(data);
if (len + 1 > *temp_size) {
free_def(*temp);
*temp_size = len + 1;
*temp = force_malloc<char>(*temp_size);
}
if (def) {
temp.clear();
memcpy(*temp, data, len);
(*temp)[len] = 0;
return true;
size_t len_a = def - data;
def += 5;
if (*def == '\n')
def++;
size_t len_b = utf8_length(def);
size_t pos = 0;
temp.insert(pos, data, len_a);
pos += len_a;
temp.insert(pos, def, len_b);
pos += len_b;
}
else
temp.assign(data);
size_t len_a = def - data;
def += 5;
if (*def == '\n')
def++;
size_t len_b = utf8_length(def);
size_t len = 0;
len += len_a + len_b;
if (len + 1 > *temp_size) {
free_def(*temp);
*temp_size = len + 1;
*temp = force_malloc<char>(*temp_size);
}
size_t pos = 0;
memcpy(*temp + pos, data, len_a);
pos += len_a;
memcpy(*temp + pos, def, len_b);
pos += len_b;
(*temp)[pos] = 0;
parse_define_inner(temp);
return true;
}
bool shader::parse_define(const char* data, int32_t num_uniform,
int32_t* uniform_value, char** temp, size_t* temp_size) {
int32_t* uniform_value, std::string& temp) {
if (!data)
return false;
const char* def = strstr(data, "//DEF\n");
if (!def) {
size_t len = utf8_length(data);
if (len + 1 > *temp_size) {
free_def(*temp);
*temp_size = len + 1;
*temp = force_malloc<char>(*temp_size);
if (def) {
temp.clear();
size_t len_a = def - data;
def += 5;
if (*def == '\n')
def++;
size_t len_b = utf8_length(def);
size_t pos = 0;
temp.insert(pos, data, len_a);
pos += len_a;
for (int32_t i = 0; i < num_uniform; i++) {
char t[0x100];
int32_t len = sprintf_s(t, sizeof(t), "#define _%d %d\n", i, uniform_value[i]);
temp.insert(pos, t, len);
pos += len;
}
memcpy(*temp, data, len);
(*temp)[len] = 0;
return true;
temp.insert(pos, def, len_b);
pos += len_b;
}
else
temp.assign(data);
const int32_t s = min_def(0x100, num_uniform);
size_t t_len[0x100];
char t[0x100] = {};
for (int32_t i = 0; i < s; i++) {
sprintf_s(t, sizeof(t), "#define _%d %d\n", i, uniform_value[i]);
t_len[i] = utf8_length(t);
}
size_t len_a = def - data;
def += 5;
size_t len_b = utf8_length(def);
size_t len = 0;
for (int32_t i = 0; i < s; i++)
len += t_len[i];
if (!len)
def++;
len += len_a + len_b;
if (len + 1 > *temp_size) {
free_def(*temp);
*temp_size = len + 1;
*temp = force_malloc<char>(*temp_size);
}
size_t pos = 0;
memcpy(*temp + pos, data, len_a);
pos += len_a;
for (int32_t i = 0; i < s; i++) {
sprintf_s(t, sizeof(t), "#define _%d %d\n", i, uniform_value[i]);
memcpy(*temp + pos, t, t_len[i]);
pos += t_len[i];
}
memcpy(*temp + pos, def, len_b);
pos += len_b;
(*temp)[pos] = 0;
parse_define_inner(temp);
return true;
}
@@ -288,7 +263,9 @@ void shader_set_data::disable_primitive_restart() {
}
void shader_set_data::draw_arrays(GLenum mode, GLint first, GLsizei count) {
shader_update_data(this);
if (!shader_update_data(this))
return;
glDrawArraysDLL(mode, first, count);
}
@@ -317,7 +294,9 @@ void shader_set_data::draw_elements(GLenum mode,
break;
}
shader_update_data(this);
if (!shader_update_data(this))
return;
glDrawElementsDLL(mode, count, type, indices);
switch (mode) {
@@ -352,7 +331,9 @@ void shader_set_data::draw_range_elements(GLenum mode,
break;
}
shader_update_data(this);
if (!shader_update_data(this))
return;
glDrawRangeElements(mode, start, end, count, type, indices);
switch (mode) {
@@ -411,10 +392,8 @@ void shader_set_data::load(farc* f, bool ignore_cache,
GLsizei buffer_size = 0x100000;
void* binary = force_malloc(buffer_size);
size_t temp_vert_size = 0x10000;
char* temp_vert = force_malloc<char>(temp_vert_size);
size_t temp_frag_size = 0x10000;
char* temp_frag = force_malloc<char>(temp_frag_size);
std::string temp_vert;
std::string temp_frag;
std::vector<int32_t> vec_vert;
std::vector<int32_t> vec_frag;
std::vector<program_binary> program_data_binary;
@@ -589,18 +568,18 @@ void shader_set_data::load(farc* f, bool ignore_cache,
if (!bin || !bin->binary_format || !bin->length
|| !shader_load_binary_shader(bin, &programs[k], vert_buf, frag_buf)) {
bool vert_succ = shader::parse_define(vert_data, num_uniform,
vec_vert_data, &temp_vert, &temp_vert_size);
bool frag_succ = shader::parse_define(frag_data, num_uniform,
vec_frag_data, &temp_frag, &temp_frag_size);
bool vert_succ = shader::parse_define(vert_data,
num_uniform, vec_vert_data, temp_vert);
bool frag_succ = shader::parse_define(frag_data,
num_uniform, vec_frag_data, temp_frag);
if (ignore_cache)
programs[k] = shader_compile(vert_succ ? temp_vert : 0,
frag_succ ? temp_frag : 0, vert_buf, frag_buf);
programs[k] = shader_compile(vert_succ ? temp_vert.c_str() : 0,
frag_succ ? temp_frag.c_str() : 0, vert_buf, frag_buf);
else {
program_data_binary.push_back({});
programs[k] = shader_compile_binary(vert_succ ? temp_vert : 0,
frag_succ ? temp_frag : 0, vert_buf, frag_buf,
programs[k] = shader_compile_binary(vert_succ ? temp_vert.c_str() : 0,
frag_succ ? temp_frag.c_str() : 0, vert_buf, frag_buf,
&program_data_binary.back(), &buffer_size, &binary);
}
shader_cache_changed |= programs[k] ? true : false;
@@ -631,16 +610,16 @@ void shader_set_data::load(farc* f, bool ignore_cache,
if (!bin || !bin->binary_format || !bin->length
|| !shader_load_binary_shader(bin, &programs[0], vert_buf, frag_buf)) {
bool vert_succ = shader::parse_define(vert_data, &temp_vert, &temp_vert_size);
bool frag_succ = shader::parse_define(frag_data, &temp_frag, &temp_frag_size);
bool vert_succ = shader::parse_define(vert_data, temp_vert);
bool frag_succ = shader::parse_define(frag_data, temp_frag);
if (ignore_cache)
programs[0] = shader_compile(vert_succ ? temp_vert : 0,
frag_succ ? temp_frag : 0, vert_buf, frag_buf);
programs[0] = shader_compile(vert_succ ? temp_vert.c_str() : 0,
frag_succ ? temp_frag.c_str() : 0, vert_buf, frag_buf);
else {
program_data_binary.push_back({});
programs[0] = shader_compile_binary(vert_succ ? temp_vert : 0,
frag_succ ? temp_frag : 0, vert_buf, frag_buf,
programs[0] = shader_compile_binary(vert_succ ? temp_vert.c_str() : 0,
frag_succ ? temp_frag.c_str() : 0, vert_buf, frag_buf,
&program_data_binary.back(), &buffer_size, &binary);
}
shader_cache_changed |= programs[0] ? true : false;
@@ -710,8 +689,6 @@ void shader_set_data::load(farc* f, bool ignore_cache,
}
}
free_def(binary);
free_def(temp_vert);
free_def(temp_frag);
if (shader_cache_changed)
shader_cache_farc.write(temp_buf, FARC_FArC, FARC_NONE, true, false);
@@ -1010,9 +987,9 @@ static bool shader_load_binary_shader(program_binary* bin, GLuint* program, cons
return true;
}
static void shader_update_data(shader_set_data* set) {
if (!set)
return;
static bool shader_update_data(shader_set_data* set) {
if (!set || !set->curr_program)
return false;
if (set->primitive_restart) {
gl_state_enable_primitive_restart();
@@ -1020,4 +997,6 @@ static void shader_update_data(shader_set_data* set) {
}
else
gl_state_disable_primitive_restart();
return true;
}
+2 -2
View File
@@ -61,9 +61,9 @@ struct shader {
int32_t bind(shader_set_data* set, uint32_t sub_index);
static bool parse_define(const char* data, char** temp, size_t* temp_size);
static bool parse_define(const char* data, std::string& temp);
static bool parse_define(const char* data, int32_t num_uniform,
int32_t* uniform_value, char** temp, size_t* temp_size);
int32_t* uniform_value, std::string& temp);
static char* parse_include(char* data, farc* f);
static void unbind();
};
+1 -1
View File
@@ -1468,7 +1468,7 @@ static void glass_eye_set(glass_eye_struct* glass_eye) {
glass_eye_batch.g_tex_scale = temp;
rctx->glass_eye_batch_ubo.WriteMemory(glass_eye_batch);
rctx->glass_eye_batch_ubo.Bind(5);
rctx->glass_eye_batch_ubo.Bind(3);
}
static void shader_bind_blinn(shader_set_data* set, shader* shad) {