Feat[renderer]: add version detection and add more shader types

This commit is contained in:
Maksim Belov 2024-09-23 13:01:58 +03:00 committed by artdeell
parent 0d74bd2f62
commit 0ad661b8a8
6 changed files with 37 additions and 15 deletions

View File

@ -111,14 +111,15 @@ void build_extension_string(context_t* context) {
static void find_esversion(context_t* context) {
const char* version = (const char*) es3_functions.glGetString(GL_VERSION);
const size_t len = strlen(version);
if(len < 12) goto fail;
const char* versionstart = strchr(version + 9, ' ');
int esmajor = 0, esminor = 0;
sscanf(versionstart, " %i.%i ", &esmajor, &esminor);
printf("LTW: Running on OpenGL ES %i.%i\n", esmajor, esminor);
if(esmajor == 0 && esminor == 0) return;
if(esmajor < 3) {
const char* shader_version = (const char*) es3_functions.glGetString(GL_SHADING_LANGUAGE_VERSION);
int esmajor = 0, esminor = 0, shadermajor = 3, shaderminor = 0;
sscanf(version, " OpenGL ES %i.%i", &esmajor, &esminor);
sscanf(shader_version, " OpenGL ES GLSL ES %i.%i", &shadermajor, &shaderminor);
context->shader_version = shadermajor * 100 + shaderminor;
printf("LTW: Running on OpenGL ES %i.%i with ESSL %i\n", esmajor, esminor, context->shader_version);
if(esmajor == 0 && esminor == 0) goto fail;
if(esmajor < 3 || context->shader_version < 300) {
printf("Unsupported OpenGL ES version. This will cause you problems down the line.\n");
return;
}
@ -136,7 +137,7 @@ static void find_esversion(context_t* context) {
return;
fail:
printf("LTW: Failed to detect GL ES version");
printf("LTW: Failed to detect OpenGL ES version");
}
void basevertex_init(context_t* context);

View File

@ -58,6 +58,7 @@ typedef struct {
EGLContext phys_context;
bool context_rdy;
bool es31, es32, buffer_storage;
GLint shader_version;
basevertex_renderer_t basevertex;
GLuint multidraw_element_buffer;
framebuffer_copier_t framebuffer_copier;

View File

@ -6,18 +6,36 @@
#include "c_wrapper.h"
#include "GlslConvert.h"
GlslConvert::ShaderStage getStageForGlEnum(GLenum shader_type) {
switch(shader_type) {
case GL_VERTEX_SHADER: return GlslConvert::MESA_SHADER_VERTEX;
case GL_FRAGMENT_SHADER: return GlslConvert::MESA_SHADER_FRAGMENT;
case GL_COMPUTE_SHADER: return GlslConvert::MESA_SHADER_COMPUTE;
case GL_GEOMETRY_SHADER: return GlslConvert::MESA_SHADER_GEOMETRY;
case GL_TESS_CONTROL_SHADER: return GlslConvert::MESA_SHADER_TESS_CTRL;
case GL_TESS_EVALUATION_SHADER: return GlslConvert::MESA_SHADER_TESS_EVAL;
default: return GlslConvert::MESA_SHADER_NONE;
}
}
#ifdef __cplusplus
extern "C" {
#endif
GlslConvert::OptimizationStruct optimizationStruct {}; // Default struct with everything enabled
char *optimize_shader(char *source, int isVertex, int vGLSLVersion, int vTargetGLSLVersion) {
GlslConvert& converter = GlslConvert::Instance();
char *optimize_shader(char *source, GLenum type, int vGLSLVersion, int vTargetGLSLVersion) {
GlslConvert& converter = GlslConvert::Instance();
GlslConvert::ShaderStage stage = getStageForGlEnum(type);
if(stage == GlslConvert::MESA_SHADER_NONE) {
printf("Unknown shader type %x\n", type);
return nullptr;
}
char * optimized_shader = converter.Optimize(
source,
isVertex ? GlslConvert::MESA_SHADER_VERTEX : GlslConvert::MESA_SHADER_FRAGMENT,
stage,
GlslConvert::API_OPENGL_COMPAT,
GlslConvert::LANGUAGE_TARGET_GLSL,
vGLSLVersion,

View File

@ -7,11 +7,13 @@
#ifndef GL4ES_C_WRAPPER_H
#define GL4ES_C_WRAPPER_H
#include "GL/gl.h"
#ifdef __cplusplus
extern "C" {
#endif
char *optimize_shader(char *source, int isVertex, int vGLSLVersion, int vTargetGLSLVersion );
char *optimize_shader(char *source, GLenum type, int vGLSLVersion, int vTargetGLSLVersion );
#ifdef __cplusplus
} /* extern C */

View File

@ -1302,7 +1302,7 @@ IR_TO_GLSL::visit(ir_texture* ir)
// Handle forward/back porting
if (is_shadow) {
printf("stateversion: %i, %i\n", state->language_version, state->original_language_version);
//printf("stateversion: %i, %i\n", state->language_version, state->original_language_version);
if (state->language_version >= 130 && ir->type->vector_elements > 2){
printf("closing vec4 wrapper");
generated_source.append(")"); // Close the vec4 wrapper

View File

@ -170,7 +170,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, co
target_string[target_length] = 0;
#undef SRC_LEN
GLchar* new_source = optimize_shader(target_string, shader_info->shader_type == GL_VERTEX_SHADER, 460, 300);
GLchar* new_source = optimize_shader(target_string, shader_info->shader_type, 460, current_context->shader_version);
//printf("\n\n\nShader Result\n%s\n\n\n", new_source);
if(shader_info->source != NULL) free((void*)shader_info->source);
shader_info->source = new_source;