Mercurial > sdl-ios-xcode
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: */ |