72 |
72 |
73 static void asc_shader_destroy_predefined(AscGLContext *ctx) { |
73 static void asc_shader_destroy_predefined(AscGLContext *ctx) { |
74 asc_shader_program_destroy(&ctx->shader.sprite.program); |
74 asc_shader_program_destroy(&ctx->shader.sprite.program); |
75 } |
75 } |
76 |
76 |
|
77 static int asc_texture_initialize_predefined(AscGLContext *ctx) { |
|
78 asc_texture_init_rectangle(&ctx->textures.empty_1x1_rect); |
|
79 asc_texture_init_2d(&ctx->textures.empty_1x1_2d); |
|
80 |
|
81 // Create a 1x1 surface with 32-bit RGBA format |
|
82 SDL_Surface* white1x1 = SDL_CreateRGBSurface( |
|
83 0, 1, 1, 32, |
|
84 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); |
|
85 if (white1x1 == NULL) { |
|
86 // TODO: merge error messages once asc_error allows formatting |
|
87 asc_error("Failed to create surface"); |
|
88 asc_error(SDL_GetError()); |
|
89 return 1; |
|
90 } |
|
91 SDL_FillRect(white1x1, NULL, 0xFFFFFFFF); |
|
92 |
|
93 // Initialize the empty textures with the white surface |
|
94 asc_texture_from_surface(&ctx->textures.empty_1x1_2d, white1x1); |
|
95 asc_texture_from_surface(&ctx->textures.empty_1x1_rect, white1x1); |
|
96 |
|
97 return asc_error_catch_all_gl(); |
|
98 } |
|
99 |
|
100 static void asc_texture_destroy_predefined(AscGLContext *ctx) { |
|
101 asc_texture_destroy(&ctx->textures.empty_1x1_2d); |
|
102 asc_texture_destroy(&ctx->textures.empty_1x1_rect); |
|
103 } |
|
104 |
77 bool asc_gl_context_initialize( |
105 bool asc_gl_context_initialize( |
78 AscGLContext *ctx, |
106 AscGLContext *ctx, |
79 SDL_Window *window, |
107 SDL_Window *window, |
80 AscGLContextSettings const *settings |
108 AscGLContextSettings const *settings |
81 ) { |
109 ) { |
107 asc_error("Initializing predefined shaders failed"); |
135 asc_error("Initializing predefined shaders failed"); |
108 SDL_GL_DeleteContext(ctx->glctx); |
136 SDL_GL_DeleteContext(ctx->glctx); |
109 return false; |
137 return false; |
110 } |
138 } |
111 |
139 |
|
140 if (asc_texture_initialize_predefined(ctx)) { |
|
141 asc_error("Initializing predefined textures failed"); |
|
142 return false; |
|
143 } |
|
144 |
112 return true; |
145 return true; |
113 } else { |
146 } else { |
114 asc_error(glewGetErrorString(err)); |
147 asc_error(glewGetErrorString(err)); |
115 SDL_GL_DeleteContext(ctx->glctx); |
148 SDL_GL_DeleteContext(ctx->glctx); |
116 return false; |
149 return false; |
119 |
152 |
120 void asc_gl_context_destroy(AscGLContext *ctx) { |
153 void asc_gl_context_destroy(AscGLContext *ctx) { |
121 if (ctx->glctx == NULL) return; |
154 if (ctx->glctx == NULL) return; |
122 SDL_GL_MakeCurrent(ctx->window, ctx->glctx); |
155 SDL_GL_MakeCurrent(ctx->window, ctx->glctx); |
123 |
156 |
|
157 asc_texture_destroy_predefined(ctx); |
124 asc_shader_destroy_predefined(ctx); |
158 asc_shader_destroy_predefined(ctx); |
125 asc_primitives_destroy(ctx); |
159 asc_primitives_destroy(ctx); |
126 |
160 |
127 // destroy the GL context and the window |
161 // destroy the GL context and the window |
128 SDL_GL_DeleteContext(ctx->glctx); |
162 SDL_GL_DeleteContext(ctx->glctx); |