This commit is contained in:
TheBrokenRail 2024-06-08 03:55:13 -04:00
parent c60428c600
commit 3414fb817c

View File

@ -22,77 +22,57 @@ CALL(11, glFogfv, void, (GLenum pname, const GLfloat *params))
} }
// Track GL State // Track GL State
struct gl_array_state_t { struct gl_array_details_t {
bool enabled = false; GLint size = -1;
GLint size = 0;
GLenum type = 0; GLenum type = 0;
GLsizei stride = 0; GLsizei stride = 0;
uint32_t pointer = 0; uint32_t pointer = 0;
bool operator==(const gl_array_state_t &other) const {
return enabled == other.enabled && size == other.size && type == other.type && stride == other.stride && pointer == other.pointer;
}
bool operator!=(const gl_array_state_t &other) const {
return !operator==(other);
}
}; };
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
struct {
gl_array_details_t glVertexPointer;
gl_array_details_t glColorPointer;
gl_array_details_t glTexCoordPointer;
} gl_array_details;
#endif
struct gl_state_t { struct gl_state_t {
GLuint bound_array_buffer = 0; GLuint bound_array_buffer = 0;
GLuint bound_texture = 0; GLuint bound_texture = 0;
gl_array_state_t vertex_array; bool vertex_array_enabled = false;
gl_array_state_t color_array; bool color_array_enabled = false;
gl_array_state_t tex_coord_array; bool tex_coord_array_enabled = false;
// Update State // Update State
static typeof(glVertexPointer) *get_array_pointer_function(const GLenum array) { bool &get_array_enabled(const GLenum array) {
switch (array) { switch (array) {
case GL_VERTEX_ARRAY: { case GL_VERTEX_ARRAY: {
return glVertexPointer; return vertex_array_enabled;
} }
case GL_COLOR_ARRAY: { case GL_COLOR_ARRAY: {
return glColorPointer; return color_array_enabled;
} }
case GL_TEXTURE_COORD_ARRAY: { case GL_TEXTURE_COORD_ARRAY: {
return glTexCoordPointer; return tex_coord_array_enabled;
} }
default: { default: {
ERR("Unsupported Array Type: %i", array); ERR("Unsupported Array Type: %i", array);
} }
} }
} }
gl_array_state_t &get_array_state(const GLenum array) { #ifndef MEDIA_LAYER_TRAMPOLINE_GUEST
switch (array) { void send_array_to_driver(const GLenum array) {
case GL_VERTEX_ARRAY: { const bool state = get_array_enabled(array);
return vertex_array; if (state) {
}
case GL_COLOR_ARRAY: {
return color_array;
}
case GL_TEXTURE_COORD_ARRAY: {
return tex_coord_array;
}
default: {
ERR("Unsupported Array Function");
}
}
}
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
void enable_disable_array(const GLenum array, const bool value) {
get_array_state(array).enabled = value;
}
#else
void send_array_to_driver(GLenum array) {
gl_array_state_t state = get_array_state(array);
if (state.enabled) {
glEnableClientState(array); glEnableClientState(array);
} else { } else {
glDisableClientState(array); glDisableClientState(array);
} }
typeof(glVertexPointer) *func = get_array_pointer_function(array);
func(state.size, state.type, state.stride, (const void *) uintptr_t(state.pointer));
} }
void send_arrays_to_driver() { void send_to_driver() {
send_array_to_driver(GL_VERTEX_ARRAY); send_array_to_driver(GL_VERTEX_ARRAY);
send_array_to_driver(GL_COLOR_ARRAY); send_array_to_driver(GL_COLOR_ARRAY);
send_array_to_driver(GL_TEXTURE_COORD_ARRAY); send_array_to_driver(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bound_array_buffer);
glBindTexture(GL_TEXTURE_2D, bound_texture);
} }
#endif #endif
}; };
@ -102,19 +82,27 @@ static gl_state_t gl_state;
// 'pointer' Is Only Supported As An Integer, Not As An Actual Pointer // 'pointer' Is Only Supported As An Integer, Not As An Actual Pointer
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
#define CALL_GL_POINTER(name, array) \ #define CALL_GL_POINTER(unique_id, name) \
void name(GLint size, GLenum type, GLsizei stride, const void *pointer) { \ CALL(unique_id, name, void, (GLint size, GLenum type, GLsizei stride, const void *pointer)) \
gl_array_state_t &state = gl_state.get_array_state(array); \ gl_array_details_t &state = gl_array_details.name; \
state.size = size; \ if (state.size != size || state.type != type || state.stride != stride || state.pointer != uint32_t(pointer)) { \
state.type = type; \ state.size = size; \
state.stride = stride; \ state.type = type; \
state.pointer = uint32_t(pointer); \ state.stride = stride; \
state.pointer = uint32_t(pointer); \
trampoline(state); \
} \
} }
#else #else
#define CALL_GL_POINTER(name, array) #define CALL_GL_POINTER(unique_id, name) \
CALL(unique_id, name, unused, ()) \
gl_array_details_t state = args.next<gl_array_details_t>(); \
func(state.size, state.type, state.stride, (const void *) uintptr_t(state.pointer)); \
return 0; \
}
#endif #endif
CALL_GL_POINTER(glVertexPointer, GL_VERTEX_ARRAY) CALL_GL_POINTER(12, glVertexPointer)
CALL(13, glLineWidth, void, (GLfloat width)) CALL(13, glLineWidth, void, (GLfloat width))
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
@ -141,9 +129,7 @@ CALL(15, glDrawArrays, void, (GLenum mode, GLint first, GLsizei count))
trampoline(gl_state, mode, first, count); trampoline(gl_state, mode, first, count);
#else #else
gl_state_t gl_state = args.next<gl_state_t>(); gl_state_t gl_state = args.next<gl_state_t>();
glBindBuffer(GL_ARRAY_BUFFER, gl_state.bound_array_buffer); gl_state.send_to_driver();
glBindTexture(GL_TEXTURE_2D, gl_state.bound_texture);
gl_state.send_arrays_to_driver();
GLenum mode = args.next<GLenum>(); GLenum mode = args.next<GLenum>();
GLint first = args.next<GLint>(); GLint first = args.next<GLint>();
GLsizei count = args.next<GLsizei>(); GLsizei count = args.next<GLsizei>();
@ -219,7 +205,7 @@ CALL(21, glMatrixMode, void, (GLenum mode))
#endif #endif
} }
CALL_GL_POINTER(glColorPointer, GL_COLOR_ARRAY) CALL_GL_POINTER(22, glColorPointer)
CALL(23, glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height)) CALL(23, glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height))
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
@ -313,7 +299,7 @@ CALL(26, glEnable, void, (GLenum cap))
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
void glEnableClientState(const GLenum array) { void glEnableClientState(const GLenum array) {
gl_state.enable_disable_array(array, true); gl_state.get_array_enabled(array) = true;
} }
#endif #endif
@ -328,11 +314,11 @@ CALL(28, glPolygonOffset, void, (GLfloat factor, GLfloat units))
#endif #endif
} }
CALL_GL_POINTER(glTexCoordPointer, GL_TEXTURE_COORD_ARRAY) CALL_GL_POINTER(41, glTexCoordPointer)
#ifdef MEDIA_LAYER_TRAMPOLINE_GUEST #ifdef MEDIA_LAYER_TRAMPOLINE_GUEST
void glDisableClientState(const GLenum array) { void glDisableClientState(const GLenum array) {
gl_state.enable_disable_array(array, false); gl_state.get_array_enabled(array) = false;
} }
#endif #endif