gl_rend_state massive overhaul. Created render_data_context

This commit is contained in:
korenkonder
2025-04-30 12:02:57 +03:00
parent 29a4a0e682
commit de9fec234a
68 changed files with 6077 additions and 4253 deletions
+92 -86
View File
@@ -4,6 +4,7 @@
*/
#include "sprite.hpp"
#include "gl_state.hpp"
#include "render_context.hpp"
#include "shader_ft.hpp"
#include <Helpers.h>
@@ -93,7 +94,8 @@ namespace spr {
mat4 mat;
resolution_mode resolution_mode;
void Draw(int32_t index, bool font, texture* overlay_tex);
void Draw(render_data_context& rend_data_ctx,
int32_t index, bool font, texture* overlay_tex);
void PostDraw();
void PreDraw();
};
@@ -111,12 +113,13 @@ namespace spr {
static void add_draw_sprite(spr::SprArgs** args_array, int32_t count, bool font,
spr::SprArgsInner& args_inner, std::vector<sprite_draw_param>& draw_param_buffer,
std::vector<sprite_draw_vertex>& vertex_buffer, std::vector<uint32_t>& index_buffer);
static void draw_sprite(const SprArgs& args, const mat4& mat,
static void draw_sprite(render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat,
int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex);
static void draw_sprite_begin();
static void draw_sprite_copy_overlay_texture(const SprArgs& args, const mat4& mat,
const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max);
static void draw_sprite_end();
static void draw_sprite_begin(render_data_context& rend_data_ctx);
static void draw_sprite_copy_overlay_texture(
render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx,
int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max);
static void draw_sprite_end(render_data_context& rend_data_ctx);
static void draw_sprite_scale(spr::SprArgs* args);
}
@@ -138,16 +141,16 @@ static const GLenum spr_blend_param[6][4] = {
};
namespace spr {
SpriteManager::RenderData::RenderData() {
SpriteManager::RenderData::RenderData() : vao() {
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
gl_state.bind_vertex_array(vao);
vbo_vertex_count = 4096;
static const GLsizei buffer_size = sizeof(sprite_draw_vertex);
vbo.Create(buffer_size * vbo_vertex_count);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
vbo.Create(gl_state, buffer_size * vbo_vertex_count);
gl_state.bind_array_buffer(vbo, true);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size,
@@ -161,12 +164,12 @@ namespace spr {
ebo_index_count = 4096;
ebo.Create(sizeof(uint32_t) * ebo_index_count);
ebo.Bind();
ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count);
gl_state.bind_element_array_buffer(ebo, true);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl_state.bind_array_buffer(0);
gl_state.bind_vertex_array(0);
gl_state.bind_element_array_buffer(0);
}
SpriteManager::RenderData::~RenderData() {
@@ -194,10 +197,10 @@ namespace spr {
vbo.Destroy();
glBindVertexArray(vao);
gl_state.bind_vertex_array(vao);
vbo.Create(buffer_size * vbo_vertex_count);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
vbo.Create(gl_state, buffer_size * vbo_vertex_count);
gl_state.bind_array_buffer(vbo, true);
glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size
* vertex_buffer.size()), vertex_buffer.data());
@@ -212,11 +215,11 @@ namespace spr {
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, buffer_size,
(void*)offsetof(sprite_draw_vertex, uv));
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
gl_state.bind_array_buffer(0);
gl_state.bind_vertex_array(0);
}
else
vbo.WriteMemory(0, buffer_size * vertex_buffer.size(), vertex_buffer.data());
vbo.WriteMemory(gl_state, 0, buffer_size * vertex_buffer.size(), vertex_buffer.data());
if (ebo_index_count < index_buffer.size()) {
while (ebo_index_count < index_buffer.size())
@@ -224,23 +227,24 @@ namespace spr {
ebo.Destroy();
glBindVertexArray(vao);
gl_state.bind_vertex_array(vao);
ebo.Create(sizeof(uint32_t) * ebo_index_count);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count);
gl_state.bind_element_array_buffer(ebo, true);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t)
* index_buffer.size()), index_buffer.data());
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl_state.bind_vertex_array(0);
gl_state.bind_element_array_buffer(0);
}
else
ebo.WriteMemory(0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data());
ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data());
}
void SpriteManager::Draw(int32_t index, bool font, texture* overlay_tex) {
draw_sprite_begin();
void SpriteManager::Draw(render_data_context& rend_data_ctx,
int32_t index, bool font, texture* overlay_tex) {
draw_sprite_begin(rend_data_ctx);
size_t count = 0;
for (auto& i : reqlist[index])
@@ -251,7 +255,7 @@ namespace spr {
if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX)
res_window_get()->resolution_mode = resolution_mode;
gl_rend_state_rect viewport_rect = gl_rend_state.get_viewport();
gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport();
for (int32_t i = 0; i < 2; i++) {
auto reqlist = this->reqlist[index][i];
@@ -298,7 +302,7 @@ namespace spr {
y_min = (int32_t)min.y;
x_max = (int32_t)(max.x - min.x);
y_max = (int32_t)(max.y - min.y);
gl_rend_state.set_viewport(x_min, y_min, x_max, y_max);
rend_data_ctx.state.set_viewport(x_min, y_min, x_max, y_max);
}
else {
view_projection = view_projection_aet;
@@ -333,23 +337,23 @@ namespace spr {
1.0f / (float_t)overlay_tex->height, 0.0f, 0.0f
};
shader_data.g_transform = view_projection;
rctx->sprite_scene_ubo.WriteMemory(shader_data);
rctx->sprite_scene_ubo.Bind(0);
rctx->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data);
rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->sprite_scene_ubo);
RenderData& render_data = *sprite_manager_render_data;
gl_rend_state.bind_vertex_array(render_data.vao);
rend_data_ctx.state.bind_vertex_array(render_data.vao);
for (uint32_t j = SPR_PRIO_MAX; j; j--, reqlist++)
for (auto& k : *reqlist)
if (k.sprite_draw_param_index >= 0)
draw_sprite(k, mat, x_min, y_min, x_max, y_max, overlay_tex);
gl_rend_state.bind_vertex_array(0);
draw_sprite(rend_data_ctx, k, mat, x_min, y_min, x_max, y_max, overlay_tex);
rend_data_ctx.state.bind_vertex_array(0);
}
if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX)
res_window_get()->resolution_mode = mode;
draw_sprite_end();
draw_sprite_end(rend_data_ctx);
}
void SpriteManager::PostDraw() {
@@ -1067,7 +1071,7 @@ namespace spr {
args_array[i]->sprite_draw_param_index = -1;
}
static void draw_sprite(const SprArgs& args, const mat4& mat,
static void draw_sprite(render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat,
int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) {
sprite_draw_param& draw_param
= sprite_manager_render_data->draw_param_buffer.data()[args.sprite_draw_param_index];
@@ -1075,8 +1079,9 @@ namespace spr {
int32_t combiner = 0;
if (draw_param.attrib.m.enable_blend) {
if (draw_param.attrib.m.blend == 5) {
gl_rend_state.active_bind_texture_2d(7, overlay_tex->glid);
draw_sprite_copy_overlay_texture(args, mat, draw_param.vtx, x_min, y_min, x_max, y_max);
rend_data_ctx.state.active_bind_texture_2d(7, overlay_tex->glid);
draw_sprite_copy_overlay_texture(rend_data_ctx,
args, mat, draw_param.vtx, x_min, y_min, x_max, y_max);
combiner = 2;
}
else
@@ -1084,11 +1089,11 @@ namespace spr {
const GLenum* blend = spr_blend_param[draw_param.attrib.m.blend];
gl_rend_state.enable_blend();
gl_rend_state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]);
rend_data_ctx.state.enable_blend();
rend_data_ctx.state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]);
}
else
gl_rend_state.disable_blend();
rend_data_ctx.state.disable_blend();
if (draw_param.shader == SHADER_FT_SPRITE) {
int32_t tex_0_type = 0;
@@ -1111,51 +1116,50 @@ namespace spr {
}
}
uniform->arr[U_TEX_0_TYPE] = tex_0_type;
uniform->arr[U_TEX_1_TYPE] = tex_1_type;
uniform->arr[U_COMBINER] = combiner;
rend_data_ctx.shader_flags.arr[U_TEX_0_TYPE] = tex_0_type;
rend_data_ctx.shader_flags.arr[U_TEX_1_TYPE] = tex_1_type;
rend_data_ctx.shader_flags.arr[U_COMBINER] = combiner;
}
if (draw_param.textures[0]) {
gl_rend_state.active_bind_texture_2d(0, draw_param.textures[0]->glid);
gl_rend_state.bind_sampler(0, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
rend_data_ctx.state.active_bind_texture_2d(0, draw_param.textures[0]->glid);
rend_data_ctx.state.bind_sampler(0, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
if (draw_param.textures[1]) {
gl_rend_state.active_bind_texture_2d(1, draw_param.textures[1]->glid);
gl_rend_state.bind_sampler(1, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
rend_data_ctx.state.active_bind_texture_2d(1, draw_param.textures[1]->glid);
rend_data_ctx.state.bind_sampler(1, rctx->sprite_samplers[draw_param.attrib.m.sampler]);
}
else if (!gl_rend_state.texture_binding_2d[1])
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
else
rend_data_ctx.state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
}
else {
if (!gl_rend_state.texture_binding_2d[0])
gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid);
if (!gl_rend_state.texture_binding_2d[1])
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
rend_data_ctx.state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid);
rend_data_ctx.state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
}
shaders_ft.set(draw_param.shader);
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, draw_param.shader);
if (draw_param.attrib.m.primitive != GL_TRIANGLES)
shaders_ft.draw_arrays(draw_param.attrib.m.primitive, draw_param.first, draw_param.count);
rend_data_ctx.state.draw_arrays(draw_param.attrib.m.primitive, draw_param.first, draw_param.count);
else
shaders_ft.draw_range_elements(draw_param.attrib.m.primitive, draw_param.start, draw_param.end,
rend_data_ctx.state.draw_range_elements(draw_param.attrib.m.primitive, draw_param.start, draw_param.end,
draw_param.count, GL_UNSIGNED_INT, (void*)draw_param.offset);
}
static void draw_sprite_begin() {
gl_rend_state.disable_blend(true);
gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid, true);
gl_rend_state.bind_sampler(0, 0, true);
gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid, true);
gl_rend_state.bind_sampler(1, 0, true);
gl_rend_state.bind_sampler(7, 0, true);
gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO, true);
gl_rend_state.bind_vertex_array(0, true);
gl_rend_state.bind_uniform_buffer_base(0, 0, true);
static void draw_sprite_begin(render_data_context& rend_data_ctx) {
rend_data_ctx.state.disable_blend();
rend_data_ctx.state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid);
rend_data_ctx.state.bind_sampler(0, 0);
rend_data_ctx.state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid);
rend_data_ctx.state.bind_sampler(1, 0);
rend_data_ctx.state.bind_sampler(7, 0);
rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
rend_data_ctx.state.bind_vertex_array(0);
rend_data_ctx.state.bind_uniform_buffer_base(0, 0);
}
static void draw_sprite_copy_overlay_texture(const SprArgs& args, const mat4& mat,
const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) {
static void draw_sprite_copy_overlay_texture(
render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx,
int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) {
if (args.num_vertex || args.kind != SPR_KIND_NORMAL)
return;
@@ -1210,21 +1214,21 @@ namespace spr {
const int32_t width = x_max - x_min + 1;
const int32_t height = y_max - y_min + 1;
if (width * height > 0) {
gl_rend_state.active_texture(7);
glCopyTexSubImage2DDLL(GL_TEXTURE_2D, 0, x_min, y_min, x_min, y_min, width, height);
rend_data_ctx.state.active_texture(7);
rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, x_min, y_min, x_min, y_min, width, height);
}
}
static void draw_sprite_end() {
gl_rend_state.disable_blend();
gl_rend_state.active_bind_texture_2d(0, 0);
gl_rend_state.bind_sampler(0, 0);
gl_rend_state.active_bind_texture_2d(1, 0);
gl_rend_state.bind_sampler(1, 0);
gl_rend_state.active_bind_texture_2d(7, 0);
gl_rend_state.bind_sampler(7, 0);
gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
shaders_ft.set(-1);
static void draw_sprite_end(render_data_context& rend_data_ctx) {
rend_data_ctx.state.disable_blend();
rend_data_ctx.state.active_bind_texture_2d(0, 0);
rend_data_ctx.state.bind_sampler(0, 0);
rend_data_ctx.state.active_bind_texture_2d(1, 0);
rend_data_ctx.state.bind_sampler(1, 0);
rend_data_ctx.state.active_bind_texture_2d(7, 0);
rend_data_ctx.state.bind_sampler(7, 0);
rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
shader::unbind(rend_data_ctx.state);
}
static void draw_sprite_scale(spr::SprArgs* args) {
@@ -1266,8 +1270,9 @@ void sprite_manager_init() {
sprite_manager_render_data = new spr::SpriteManager::RenderData;
}
void sprite_manager_draw(int32_t index, bool font, texture* overlay_tex) {
sprite_manager->Draw(index, font, overlay_tex);
void sprite_manager_draw(render_data_context& rend_data_ctx,
int32_t index, bool font, texture* overlay_tex) {
sprite_manager->Draw(rend_data_ctx, index, font, overlay_tex);
}
void sprite_manager_post_draw() {
@@ -1308,7 +1313,8 @@ HOOK(void, FASTCALL, spr__SprArgs__Reset, 0x000000014063CA10, spr::SprArgs* This
}
HOOK(void, FASTCALL, sprite_manager_draw, 0x000000014063F870, int32_t index, bool font, texture* tex) {
sprite_manager_draw(index, font, tex);
render_data_context rend_data_ctx(GL_REND_STATE_POST_2D);
sprite_manager_draw(rend_data_ctx, index, font, tex);
}
void sprite_patch() {