comparison src/video/qnxgf/SDL_gf_render.c @ 3092:cad1aefa2ed9

Date: Thu, 12 Mar 2009 15:14:38 +0200 From: "Mike Gorchak" Subject: New QNX patches In photon.tar.gz there are new files to be placed into ./src/video/photon/ directory. qnx3.diff - new patches for QNX support. Since I've found a lot of bugs in the new GF QNX Graphics Framework and I'm suspended development for GF driver until already found bugs will be fixed and switched to Photon driver implementation. sdl.diff - I've found that renderer creation result has not been checked and SDL shows error like: "there is no current renderer", now SDL will show correct error which was set be renderer.
author Sam Lantinga <slouken@libsdl.org>
date Tue, 17 Mar 2009 03:24:22 +0000
parents 0b6f51c29267
children 82e60908fab1
comparison
equal deleted inserted replaced
3091:32efcc94b3da 3092:cad1aefa2ed9
16 License along with this library; if not, write to the Free Software 16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 18
19 Sam Lantinga 19 Sam Lantinga
20 slouken@libsdl.org 20 slouken@libsdl.org
21
22 QNX Graphics Framework SDL driver
23 Copyright (C) 2009 Mike Gorchak
24 (mike@malva.ua, lestat@i.com.ua)
21 */ 25 */
22 26
23 #include "SDL_config.h" 27 #include "SDL_config.h"
24 28
25 #include "../SDL_pixels_c.h" 29 #include "../SDL_pixels_c.h"
26 #include "../SDL_yuv_sw_c.h" 30 #include "../SDL_yuv_sw_c.h"
27 31
28 #include "SDL_video.h" 32 #include "SDL_video.h"
29 33
30 #include "SDL_gf_render.h" 34 #include "SDL_gf_render.h"
31 35 #include "SDL_qnxgf.h"
32 static SDL_Renderer* GF_CreateRenderer(SDL_Window* window, Uint32 flags) 36
33 { 37 static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags);
34 } 38 static int gf_displaymodechanged(SDL_Renderer* renderer);
35 39 static int gf_activaterenderer(SDL_Renderer* renderer);
36 SDL_RenderDriver GF_RenderDriver= 40 static int gf_createtexture(SDL_Renderer* renderer, SDL_Texture* texture);
37 { 41 static int gf_querytexturepixels(SDL_Renderer* renderer, SDL_Texture* texture, void** pixels, int* pitch);
38 GF_CreateRenderer, 42 static int gf_settexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Color* colors, int firstcolor, int ncolors);
43 static int gf_gettexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Color* colors, int firstcolor, int ncolors);
44 static int gf_settexturecolormod(SDL_Renderer* renderer, SDL_Texture* texture);
45 static int gf_settexturealphamod(SDL_Renderer* renderer, SDL_Texture* texture);
46 static int gf_settextureblendmode(SDL_Renderer* renderer, SDL_Texture* texture);
47 static int gf_settexturescalemode(SDL_Renderer* renderer, SDL_Texture* texture);
48 static int gf_updatetexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, const void* pixels, int pitch);
49 static int gf_locktexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, int markDirty, void** pixels, int* pitch);
50 static void gf_unlocktexture(SDL_Renderer* renderer, SDL_Texture* texture);
51 static void gf_dirtytexture(SDL_Renderer* renderer, SDL_Texture* texture, int numrects, const SDL_Rect* rects);
52 static int gf_renderpoint(SDL_Renderer* renderer, int x, int y);
53 static int gf_renderline(SDL_Renderer* renderer, int x1, int y1, int x2, int y2);
54 static int gf_renderfill(SDL_Renderer* renderer, const SDL_Rect* rect);
55 static int gf_rendercopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect);
56 static void gf_renderpresent(SDL_Renderer* renderer);
57 static void gf_destroytexture(SDL_Renderer* renderer, SDL_Texture* texture);
58 static void gf_destroyrenderer(SDL_Renderer* renderer);
59
60 SDL_RenderDriver gf_renderdriver=
61 {
62 gf_createrenderer,
39 { 63 {
40 "qnxgf", 64 "qnxgf",
41 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | 65 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
42 SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | 66 SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
43 SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC | 67 SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_PRESENTDISCARD |
44 SDL_RENDERER_ACCELERATED), 68 SDL_RENDERER_ACCELERATED),
45 (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | 69 (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
46 SDL_TEXTUREMODULATE_ALPHA), 70 SDL_TEXTUREMODULATE_ALPHA),
47 (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | 71 (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
48 SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), 72 SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
65 }, 89 },
66 0, 90 0,
67 0 91 0
68 } 92 }
69 }; 93 };
94
95 static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags)
96 {
97 SDL_VideoDisplay* display = SDL_GetDisplayFromWindow(window);
98 SDL_DisplayData* didata = (SDL_DisplayData*)display->driverdata;
99 SDL_WindowData* wdata = (SDL_WindowData*)window->driverdata;
100 SDL_Renderer* renderer = NULL;
101 SDL_RenderData* rdata = NULL;
102 uint32_t it;
103 int32_t jt;
104 int32_t status;
105
106 /* Allocate new renderer structure */
107 renderer=(SDL_Renderer*)SDL_calloc(1, sizeof(SDL_Renderer));
108 if (renderer==NULL)
109 {
110 SDL_OutOfMemory();
111 return NULL;
112 }
113
114 /* Allocate renderer data */
115 rdata=(SDL_RenderData*)SDL_calloc(1, sizeof(SDL_RenderData));
116 if (rdata==NULL)
117 {
118 SDL_free(renderer);
119 SDL_OutOfMemory();
120 return NULL;
121 }
122
123 renderer->DisplayModeChanged=gf_displaymodechanged;
124 renderer->ActivateRenderer=gf_activaterenderer;
125 renderer->CreateTexture=gf_createtexture;
126 renderer->QueryTexturePixels=gf_querytexturepixels;
127 renderer->SetTexturePalette=gf_settexturepalette;
128 renderer->GetTexturePalette=gf_gettexturepalette;
129 renderer->SetTextureAlphaMod=gf_settexturealphamod;
130 renderer->SetTextureColorMod=gf_settexturecolormod;
131 renderer->SetTextureBlendMode=gf_settextureblendmode;
132 renderer->SetTextureScaleMode=gf_settexturescalemode;
133 renderer->UpdateTexture=gf_updatetexture;
134 renderer->LockTexture=gf_locktexture;
135 renderer->UnlockTexture=gf_unlocktexture;
136 renderer->DirtyTexture=gf_dirtytexture;
137 renderer->RenderPoint=gf_renderpoint;
138 renderer->RenderLine=gf_renderline;
139 renderer->RenderFill=gf_renderfill;
140 renderer->RenderCopy=gf_rendercopy;
141 renderer->RenderPresent = gf_renderpresent;
142 renderer->DestroyTexture = gf_destroytexture;
143 renderer->DestroyRenderer = gf_destroyrenderer;
144 renderer->info = gf_renderdriver.info;
145 renderer->window = window->id;
146 renderer->driverdata = rdata;
147
148 /* Set render acceleration flag in case it is accelerated */
149 if ((didata->caps & SDL_GF_ACCELERATED)==SDL_GF_ACCELERATED)
150 {
151 renderer->info.flags=SDL_RENDERER_ACCELERATED;
152 }
153 else
154 {
155 renderer->info.flags&=~(SDL_RENDERER_ACCELERATED);
156 }
157
158 rdata->window=window;
159
160 /* Check if upper level requested synchronization on vsync signal */
161 if ((flags & SDL_RENDERER_PRESENTVSYNC)==SDL_RENDERER_PRESENTVSYNC)
162 {
163 rdata->enable_vsync=SDL_TRUE;
164 }
165 else
166 {
167 rdata->enable_vsync=SDL_FALSE;
168 }
169
170 /* Check what buffer copy/flip scheme is requested */
171 rdata->surfaces_count=0;
172 if ((flags & SDL_RENDERER_SINGLEBUFFER)==SDL_RENDERER_SINGLEBUFFER)
173 {
174 if ((flags & SDL_RENDERER_PRESENTDISCARD)==SDL_RENDERER_PRESENTDISCARD)
175 {
176 renderer->info.flags|=SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD;
177 }
178 else
179 {
180 renderer->info.flags|=SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY;
181 }
182 rdata->surfaces_count=1;
183 rdata->surface_visible_idx=0;
184 rdata->surface_render_idx=0;
185 }
186 else
187 {
188 if ((flags & SDL_RENDERER_PRESENTFLIP2)==SDL_RENDERER_PRESENTFLIP2)
189 {
190 renderer->info.flags|=SDL_RENDERER_PRESENTFLIP2;
191 rdata->surfaces_count=2;
192 rdata->surface_visible_idx=0;
193 rdata->surface_render_idx=1;
194 }
195 else
196 {
197 if ((flags & SDL_RENDERER_PRESENTFLIP3)==SDL_RENDERER_PRESENTFLIP3)
198 {
199 renderer->info.flags|=SDL_RENDERER_PRESENTFLIP3;
200 rdata->surfaces_count=3;
201 rdata->surface_visible_idx=0;
202 rdata->surface_render_idx=1;
203 }
204 else
205 {
206 renderer->info.flags|=SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY;
207 rdata->surfaces_count=1;
208 rdata->surface_visible_idx=0;
209 rdata->surface_render_idx=0;
210 }
211 }
212 }
213
214 /* Create layer surfaces, which could be visible */
215 for (it=0; it<rdata->surfaces_count; it++)
216 {
217 /* TODO: add palette creation */
218 /* do not waste surfaces when using GL ES */
219
220 /* Create displayable surfaces */
221 status=gf_surface_create_layer(&rdata->surface[it], &didata->layer, 1, 0,
222 didata->current_mode.w, didata->current_mode.h,
223 qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format), NULL,
224 GF_SURFACE_CREATE_2D_ACCESSIBLE);
225
226 if (status!=GF_ERR_OK)
227 {
228 /* Free already allocated surfaces */
229 for (jt=it-1; jt>0; jt--)
230 {
231 gf_surface_free(rdata->surface[jt]);
232 }
233 SDL_free(rdata);
234 SDL_free(renderer);
235 if (status==GF_ERR_MEM)
236 {
237 SDL_SetError("unsufficient free video memory");
238 }
239 else
240 {
241 SDL_SetError("error during displayable surface creation");
242 }
243 return NULL;
244 }
245
246 /* Get detailed information about allocated surface */
247 gf_surface_get_info(rdata->surface[it], &rdata->surface_info[it]);
248 }
249
250 return renderer;
251 }
252
253 void gf_addrenderdriver(_THIS)
254 {
255 uint32_t it;
256
257 for (it=0; it<_this->num_displays; it++)
258 {
259 SDL_AddRenderDriver(it, &gf_renderdriver);
260 }
261 }
262
263 /****************************************************************************/
264 /* SDL render interface */
265 /****************************************************************************/
266 static int gf_displaymodechanged(SDL_Renderer* renderer)
267 {
268 SDL_RenderData* rdata=(SDL_RenderData*)renderer->driverdata;
269
270 /* Remove all allocated surfaces, they are no more valid */
271
272 /* TODO: Add video mode change detection and new parameters detection */
273
274 return 0;
275 }
276
277 static int gf_activaterenderer(SDL_Renderer* renderer)
278 {
279 SDL_RenderData* rdata=(SDL_RenderData*)renderer->driverdata;
280 SDL_VideoDisplay* display = SDL_GetDisplayFromWindow(rdata->window);
281 SDL_DisplayData* didata = (SDL_DisplayData*)display->driverdata;
282
283 /* Setup current surface as visible */
284 gf_layer_set_surfaces(didata->layer, &rdata->surface[rdata->surface_visible_idx], 1);
285
286 /* Set visible surface when hardware in idle state */
287 gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
288
289 return 0;
290 }
291
292 static int gf_createtexture(SDL_Renderer* renderer, SDL_Texture* texture)
293 {
294 SDL_RenderData* renderdata=(SDL_RenderData*)renderer->driverdata;
295 SDL_Window* window=SDL_GetWindowFromID(renderer->window);
296 SDL_VideoDisplay* display=SDL_GetDisplayFromWindow(window);
297 SDL_TextureData* tdata=NULL;
298
299 /* Allocate texture driver data */
300 tdata=(SDL_TextureData*)SDL_calloc(1, sizeof(SDL_TextureData));
301 if (tdata==NULL)
302 {
303 SDL_OutOfMemory();
304 return -1;
305 }
306
307 /* Set texture driver data */
308 texture->driverdata=tdata;
309
310 }
311
312 static int gf_querytexturepixels(SDL_Renderer* renderer, SDL_Texture* texture, void** pixels, int* pitch)
313 {
314 }
315
316 static int gf_settexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Color* colors, int firstcolor, int ncolors)
317 {
318 }
319
320 static int gf_gettexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Color* colors, int firstcolor, int ncolors)
321 {
322 }
323
324 static int gf_settexturecolormod(SDL_Renderer* renderer, SDL_Texture* texture)
325 {
326 }
327
328 static int gf_settexturealphamod(SDL_Renderer* renderer, SDL_Texture* texture)
329 {
330 }
331
332 static int gf_settextureblendmode(SDL_Renderer* renderer, SDL_Texture* texture)
333 {
334 }
335
336 static int gf_settexturescalemode(SDL_Renderer* renderer, SDL_Texture* texture)
337 {
338 }
339
340 static int gf_updatetexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, const void* pixels, int pitch)
341 {
342 }
343
344 static int gf_locktexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, int markDirty, void** pixels, int* pitch)
345 {
346 }
347
348 static void gf_unlocktexture(SDL_Renderer* renderer, SDL_Texture* texture)
349 {
350 }
351
352 static void gf_dirtytexture(SDL_Renderer* renderer, SDL_Texture* texture, int numrects, const SDL_Rect* rects)
353 {
354 }
355
356 static int gf_renderpoint(SDL_Renderer* renderer, int x, int y)
357 {
358 }
359
360 static int gf_renderline(SDL_Renderer* renderer, int x1, int y1, int x2, int y2)
361 {
362 }
363
364 static int gf_renderfill(SDL_Renderer* renderer, const SDL_Rect* rect)
365 {
366 }
367
368 static int gf_rendercopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect)
369 {
370 }
371
372 static void gf_renderpresent(SDL_Renderer* renderer)
373 {
374 }
375
376 static void gf_destroytexture(SDL_Renderer* renderer, SDL_Texture* texture)
377 {
378 }
379
380 static void gf_destroyrenderer(SDL_Renderer* renderer)
381 {
382 SDL_RenderData* rdata=(SDL_RenderData*)renderer->driverdata;
383 uint32_t it;
384
385 for (it=0; it<rdata->surfaces_count; it++)
386 {
387 gf_surface_free(rdata->surface[it]);
388 }
389 }
390
391 /* vi: set ts=4 sw=4 expandtab: */