1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

fix GL_OUT_OF_MEMORY error issues on high resolutions such as 8k and above

This commit is contained in:
FunkyFr3sh 2024-07-21 04:01:00 +02:00
parent 1f532f9f6f
commit f4f5c2d71b
2 changed files with 45 additions and 29 deletions

View File

@ -16,7 +16,6 @@ typedef struct OGLRENDERER
BOOL got_error; BOOL got_error;
int surface_tex_width; int surface_tex_width;
int surface_tex_height; int surface_tex_height;
int* surface_tex;
GLenum surface_format; GLenum surface_format;
GLenum surface_type; GLenum surface_type;
GLuint surface_tex_ids[TEXTURE_COUNT]; GLuint surface_tex_ids[TEXTURE_COUNT];

View File

@ -248,13 +248,10 @@ static void ogl_create_textures(int width, int height)
int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height;
g_ogl.surface_tex_width = g_ogl.surface_tex_width =
w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w <= 16384 ? 16384 : w; w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w;
g_ogl.surface_tex_height = g_ogl.surface_tex_height =
h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h <= 16384 ? 16384 : h; h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h;
g_ogl.surface_tex =
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int));
g_ogl.scale_w = (float)width / g_ogl.surface_tex_width; g_ogl.scale_w = (float)width / g_ogl.surface_tex_width;
g_ogl.scale_h = (float)height / g_ogl.surface_tex_height; g_ogl.scale_h = (float)height / g_ogl.surface_tex_height;
@ -638,7 +635,7 @@ static void ogl_init_shader1_program()
0, 0,
GL_RGBA, GL_RGBA,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
g_ogl.surface_tex); 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0);
@ -704,6 +701,10 @@ static void ogl_init_shader1_program()
break; break;
} }
else
{
glClear(GL_COLOR_BUFFER_BIT);
}
} }
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
@ -1213,9 +1214,6 @@ static void ogl_render()
static void ogl_delete_context(HGLRC context) static void ogl_delete_context(HGLRC context)
{ {
if (g_ogl.surface_tex)
HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex);
glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids);
if (g_ddraw.bpp == 8) if (g_ddraw.bpp == 8)
@ -1277,7 +1275,13 @@ static void ogl_delete_context(HGLRC context)
static BOOL ogl_texture_upload_test() static BOOL ogl_texture_upload_test()
{ {
if (!g_ogl.surface_tex) if (g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096)
return TRUE;
int* surface_tex =
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int));
if (!surface_tex)
return TRUE; return TRUE;
static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 };
@ -1285,7 +1289,7 @@ static BOOL ogl_texture_upload_test()
int i; int i;
for (i = 0; i < TEXTURE_COUNT; i++) for (i = 0; i < TEXTURE_COUNT; i++)
{ {
memcpy(g_ogl.surface_tex, test_data, sizeof(test_data)); memcpy(surface_tex, test_data, sizeof(test_data));
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[i]); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[i]);
@ -1298,14 +1302,17 @@ static BOOL ogl_texture_upload_test()
g_ddraw.height, g_ddraw.height,
g_ogl.surface_format, g_ogl.surface_format,
g_ogl.surface_type, g_ogl.surface_type,
g_ogl.surface_tex); surface_tex);
memset(g_ogl.surface_tex, 0, sizeof(test_data)); memset(surface_tex, 0, sizeof(test_data));
glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, surface_tex);
if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0)
{
HeapFree(GetProcessHeap(), 0, surface_tex);
return FALSE; return FALSE;
}
} }
if (g_ddraw.bpp == 8) if (g_ddraw.bpp == 8)
@ -1323,32 +1330,41 @@ static BOOL ogl_texture_upload_test()
1, 1,
GL_RGBA, GL_RGBA,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
g_ogl.surface_tex); surface_tex);
memset(g_ogl.surface_tex, 0, sizeof(test_data)); memset(surface_tex, 0, sizeof(test_data));
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex);
if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0)
{
HeapFree(GetProcessHeap(), 0, surface_tex);
return FALSE; return FALSE;
}
} }
} }
HeapFree(GetProcessHeap(), 0, surface_tex);
return TRUE; return TRUE;
} }
static BOOL ogl_shader_test() static BOOL ogl_shader_test()
{ {
if (!g_ogl.surface_tex)
return TRUE;
BOOL result = TRUE; BOOL result = TRUE;
if (g_ddraw.bpp != 8) if (g_ddraw.bpp != 8 || g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096)
return result; return result;
int* surface_tex =
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int));
if (!surface_tex)
return TRUE;
if (g_oglu_got_version3 && g_ogl.main_program) if (g_oglu_got_version3 && g_ogl.main_program)
{ {
memset(g_ogl.surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); memset(surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int));
GLuint fbo_id = 0; GLuint fbo_id = 0;
glGenFramebuffers(1, &fbo_id); glGenFramebuffers(1, &fbo_id);
@ -1369,7 +1385,7 @@ static BOOL ogl_shader_test()
0, 0,
GL_RGBA, GL_RGBA,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
g_ogl.surface_tex); surface_tex);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex_id, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex_id, 0);
@ -1404,7 +1420,7 @@ static BOOL ogl_shader_test()
g_ogl.surface_tex_height, g_ogl.surface_tex_height,
g_ogl.surface_format, g_ogl.surface_format,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
g_ogl.surface_tex); surface_tex);
glViewport(0, 0, g_ogl.surface_tex_width, g_ogl.surface_tex_height); glViewport(0, 0, g_ogl.surface_tex_width, g_ogl.surface_tex_height);
@ -1423,12 +1439,12 @@ static BOOL ogl_shader_test()
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo_tex_id); glBindTexture(GL_TEXTURE_2D, fbo_tex_id);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex);
int i; int i;
for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++)
{ {
if (g_ogl.surface_tex[i] != 0x80808080) if (surface_tex[i] != 0x80808080)
{ {
result = FALSE; result = FALSE;
break; break;
@ -1446,5 +1462,6 @@ static BOOL ogl_shader_test()
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
HeapFree(GetProcessHeap(), 0, surface_tex);
return result; return result;
} }