SDL  2.0
SDL_DirectFB_render.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../../SDL_internal.h"
22 
23 #if SDL_VIDEO_DRIVER_DIRECTFB
24 #include "SDL_DirectFB_window.h"
25 #include "SDL_DirectFB_modes.h"
26 
27 #include "SDL_syswm.h"
28 #include "SDL_DirectFB_shape.h"
29 
30 #include "../SDL_sysvideo.h"
31 #include "../../render/SDL_sysrender.h"
32 
33 #ifndef DFB_VERSION_ATLEAST
34 
35 #define DFB_VERSIONNUM(X, Y, Z) \
36  ((X)*1000 + (Y)*100 + (Z))
37 
38 #define DFB_COMPILEDVERSION \
39  DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION)
40 
41 #define DFB_VERSION_ATLEAST(X, Y, Z) \
42  (DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z))
43 
44 #define SDL_DFB_CHECK(x) x
45 
46 #endif
47 
48 /* the following is not yet tested ... */
49 #define USE_DISPLAY_PALETTE (0)
50 
51 
52 #define SDL_DFB_RENDERERDATA(rend) DirectFB_RenderData *renddata = ((rend) ? (DirectFB_RenderData *) (rend)->driverdata : NULL)
53 #define SDL_DFB_WINDOWSURFACE(win) IDirectFBSurface *destsurf = ((DFB_WindowData *) ((win)->driverdata))->surface;
54 
55 typedef struct
56 {
58  DFBSurfaceFlipFlags flipflags;
59  int size_changed;
60  int lastBlendMode;
61  DFBSurfaceBlittingFlags blitFlags;
62  DFBSurfaceDrawingFlags drawFlags;
63  IDirectFBSurface* target;
64 } DirectFB_RenderData;
65 
66 typedef struct
67 {
68  IDirectFBSurface *surface;
69  Uint32 format;
70  void *pixels;
71  int pitch;
72  IDirectFBPalette *palette;
73  int isDirty;
74 
75  SDL_VideoDisplay *display; /* only for yuv textures */
76 
77 #if (DFB_VERSION_ATLEAST(1,2,0))
78  DFBSurfaceRenderOptions render_options;
79 #endif
80 } DirectFB_TextureData;
81 
82 static SDL_INLINE void
83 SDLtoDFBRect(const SDL_Rect * sr, DFBRectangle * dr)
84 {
85  dr->x = sr->x;
86  dr->y = sr->y;
87  dr->h = sr->h;
88  dr->w = sr->w;
89 }
90 static SDL_INLINE void
91 SDLtoDFBRect_Float(const SDL_FRect * sr, DFBRectangle * dr)
92 {
93  dr->x = sr->x;
94  dr->y = sr->y;
95  dr->h = sr->h;
96  dr->w = sr->w;
97 }
98 
99 
100 static int
101 TextureHasAlpha(DirectFB_TextureData * data)
102 {
103  /* Drawing primitive ? */
104  if (!data)
105  return 0;
106 
107  return (DFB_PIXELFORMAT_HAS_ALPHA(DirectFB_SDLToDFBPixelFormat(data->format)) ? 1 : 0);
108 #if 0
109  switch (data->format) {
119  return 1;
120  default:
121  return 0;
122  }
123 #endif
124 }
125 
126 static SDL_INLINE IDirectFBSurface *get_dfb_surface(SDL_Window *window)
127 {
128  SDL_SysWMinfo wm_info;
129  SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo));
130 
131  SDL_VERSION(&wm_info.version);
132  if (!SDL_GetWindowWMInfo(window, &wm_info)) {
133  return NULL;
134  }
135 
136  return wm_info.info.dfb.surface;
137 }
138 
139 static SDL_INLINE IDirectFBWindow *get_dfb_window(SDL_Window *window)
140 {
141  SDL_SysWMinfo wm_info;
142  SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo));
143 
144  SDL_VERSION(&wm_info.version);
145  if (!SDL_GetWindowWMInfo(window, &wm_info)) {
146  return NULL;
147  }
148 
149  return wm_info.info.dfb.window;
150 }
151 
152 static void
153 SetBlendMode(DirectFB_RenderData * data, int blendMode,
154  DirectFB_TextureData * source)
155 {
156  IDirectFBSurface *destsurf = data->target;
157 
158  /* FIXME: check for format change */
159  if (1 || data->lastBlendMode != blendMode) {
160  switch (blendMode) {
161  case SDL_BLENDMODE_NONE:
162  /**< No blending */
163  data->blitFlags = DSBLIT_NOFX;
164  data->drawFlags = DSDRAW_NOFX;
165  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE));
166  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO));
167  break;
168 #if 0
169  case SDL_BLENDMODE_MASK:
170  data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
171  data->drawFlags = DSDRAW_BLEND;
172  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
173  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA));
174  break;
175 #endif
176  case SDL_BLENDMODE_BLEND:
177  data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
178  data->drawFlags = DSDRAW_BLEND;
179  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
180  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA));
181  break;
182  case SDL_BLENDMODE_ADD:
183  data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
184  data->drawFlags = DSDRAW_BLEND;
185  /* FIXME: SRCALPHA kills performance on radeon ...
186  * It will be cheaper to copy the surface to a temporary surface and premultiply
187  */
188  if (source && TextureHasAlpha(source))
189  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
190  else
191  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE));
192  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ONE));
193  break;
194  case SDL_BLENDMODE_MOD:
195  data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
196  data->drawFlags = DSDRAW_BLEND;
197  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ZERO));
198  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_SRCCOLOR));
199 
200  break;
201  }
202  case SDL_BLENDMODE_MUL:
203  data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
204  data->drawFlags = DSDRAW_BLEND;
205  SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_DSTCOLOR));
206  SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA));
207 
208  break;
209  }
210  data->lastBlendMode = blendMode;
211  }
212 }
213 
214 static int
215 PrepareDraw(SDL_Renderer * renderer, const SDL_RenderCommand *cmd)
216 {
217  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
218  IDirectFBSurface *destsurf = data->target;
219  Uint8 r = cmd->data.draw.r;
220  Uint8 g = cmd->data.draw.g;
221  Uint8 b = cmd->data.draw.b;
222  Uint8 a = cmd->data.draw.a;
223 
224  SetBlendMode(data, cmd->data.draw.blend, NULL);
225  SDL_DFB_CHECKERR(destsurf->SetDrawingFlags(destsurf, data->drawFlags));
226 
227  switch (renderer->blendMode) {
228  case SDL_BLENDMODE_NONE:
229  /* case SDL_BLENDMODE_MASK: */
230  case SDL_BLENDMODE_BLEND:
231  break;
232  case SDL_BLENDMODE_ADD:
233  case SDL_BLENDMODE_MOD:
234  case SDL_BLENDMODE_MUL:
235  r = ((int) r * (int) a) / 255;
236  g = ((int) g * (int) a) / 255;
237  b = ((int) b * (int) a) / 255;
238  a = 255;
239  break;
240  case SDL_BLENDMODE_INVALID: break;
241  }
242 
243  SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, r, g, b, a));
244  return 0;
245  error:
246  return -1;
247 }
248 
249 static void
250 DirectFB_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
251 {
252  SDL_DFB_RENDERERDATA(renderer);
253 
254  if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
255  /* Rebind the context to the window area and update matrices */
256  /* SDL_CurrentContext = NULL; */
257  /* data->updateSize = SDL_TRUE; */
258  renddata->size_changed = SDL_TRUE;
259  }
260 }
261 
262 static void
263 DirectFB_ActivateRenderer(SDL_Renderer * renderer)
264 {
265  SDL_DFB_RENDERERDATA(renderer);
266 
267  if (renddata->size_changed /* || windata->wm_needs_redraw */) {
268  renddata->size_changed = SDL_FALSE;
269  }
270 }
271 
272 static int
273 DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture)
274 {
277  SDL_DFB_DEVICEDATA(display->device);
278  DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
279  DirectFB_TextureData *data = texture->driverdata;
280  DFBDisplayLayerConfig layconf;
281  DFBResult ret;
282 
283  if (devdata->use_yuv_direct && (dispdata->vidID >= 0)
284  && (!dispdata->vidIDinuse)
285  && SDL_ISPIXELFORMAT_FOURCC(data->format)) {
286  layconf.flags =
287  DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT |
288  DLCONF_SURFACE_CAPS;
289  layconf.width = texture->w;
290  layconf.height = texture->h;
291  layconf.pixelformat = DirectFB_SDLToDFBPixelFormat(data->format);
292  layconf.surface_caps = DSCAPS_VIDEOONLY | DSCAPS_DOUBLE;
293 
294  SDL_DFB_CHECKERR(devdata->dfb->GetDisplayLayer(devdata->dfb,
295  dispdata->vidID,
296  &dispdata->vidlayer));
297  SDL_DFB_CHECKERR(dispdata->
298  vidlayer->SetCooperativeLevel(dispdata->vidlayer,
299  DLSCL_EXCLUSIVE));
300 
301  if (devdata->use_yuv_underlays) {
302  ret = dispdata->vidlayer->SetLevel(dispdata->vidlayer, -1);
303  if (ret != DFB_OK)
304  SDL_DFB_DEBUG("Underlay Setlevel not supported\n");
305  }
306  SDL_DFB_CHECKERR(dispdata->
307  vidlayer->SetConfiguration(dispdata->vidlayer,
308  &layconf));
309  SDL_DFB_CHECKERR(dispdata->
310  vidlayer->GetSurface(dispdata->vidlayer,
311  &data->surface));
312  dispdata->vidIDinuse = 1;
313  data->display = display;
314  return 0;
315  }
316  return 1;
317  error:
318  if (dispdata->vidlayer) {
319  SDL_DFB_RELEASE(data->surface);
320  SDL_DFB_CHECKERR(dispdata->
321  vidlayer->SetCooperativeLevel(dispdata->vidlayer,
322  DLSCL_ADMINISTRATIVE));
323  SDL_DFB_RELEASE(dispdata->vidlayer);
324  }
325  return 1;
326 }
327 
328 static int
329 DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
330 {
333  SDL_DFB_DEVICEDATA(display->device);
334  DirectFB_TextureData *data;
335  DFBSurfaceDescription dsc;
336  DFBSurfacePixelFormat pixelformat;
337 
338  DirectFB_ActivateRenderer(renderer);
339 
340  SDL_DFB_ALLOC_CLEAR(data, sizeof(*data));
341  texture->driverdata = data;
342 
343  /* find the right pixelformat */
344  pixelformat = DirectFB_SDLToDFBPixelFormat(texture->format);
345  if (pixelformat == DSPF_UNKNOWN) {
346  SDL_SetError("Unknown pixel format %d", data->format);
347  goto error;
348  }
349 
350  data->format = texture->format;
351  data->pitch = texture->w * DFB_BYTES_PER_PIXEL(pixelformat);
352 
353  if (DirectFB_AcquireVidLayer(renderer, texture) != 0) {
354  /* fill surface description */
355  dsc.flags =
356  DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
357  dsc.width = texture->w;
358  dsc.height = texture->h;
359  if(texture->format == SDL_PIXELFORMAT_YV12 ||
360  texture->format == SDL_PIXELFORMAT_IYUV) {
361  /* dfb has problems with odd sizes -make them even internally */
362  dsc.width += (dsc.width % 2);
363  dsc.height += (dsc.height % 2);
364  }
365  /* <1.2 Never use DSCAPS_VIDEOONLY here. It kills performance
366  * No DSCAPS_SYSTEMONLY either - let dfb decide
367  * 1.2: DSCAPS_SYSTEMONLY boosts performance by factor ~8
368  * Depends on other settings as well. Let dfb decide.
369  */
370  dsc.caps = DSCAPS_PREMULTIPLIED;
371 #if 0
372  if (texture->access == SDL_TEXTUREACCESS_STREAMING)
373  dsc.caps |= DSCAPS_SYSTEMONLY;
374  else
375  dsc.caps |= DSCAPS_VIDEOONLY;
376 #endif
377 
378  dsc.pixelformat = pixelformat;
379  data->pixels = NULL;
380 
381  /* Create the surface */
382  SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
383  &data->surface));
384  if (SDL_ISPIXELFORMAT_INDEXED(data->format)
385  && !SDL_ISPIXELFORMAT_FOURCC(data->format)) {
386 #if 1
387  SDL_DFB_CHECKERR(data->surface->GetPalette(data->surface, &data->palette));
388 #else
389  /* DFB has issues with blitting LUT8 surfaces.
390  * Creating a new palette does not help.
391  */
392  DFBPaletteDescription pal_desc;
393  pal_desc.flags = DPDESC_SIZE; /* | DPDESC_ENTRIES */
394  pal_desc.size = 256;
395  SDL_DFB_CHECKERR(devdata->dfb->CreatePalette(devdata->dfb, &pal_desc,&data->palette));
396  SDL_DFB_CHECKERR(data->surface->SetPalette(data->surface, data->palette));
397 #endif
398  }
399 
400  }
401 #if (DFB_VERSION_ATLEAST(1,2,0))
402  data->render_options = DSRO_NONE;
403 #endif
404  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
405  /* 3 plane YUVs return 1 bpp, but we need more space for other planes */
406  if(texture->format == SDL_PIXELFORMAT_YV12 ||
407  texture->format == SDL_PIXELFORMAT_IYUV) {
408  SDL_DFB_ALLOC_CLEAR(data->pixels, (texture->h * data->pitch + ((texture->h + texture->h % 2) * (data->pitch + data->pitch % 2) * 2) / 4));
409  } else {
410  SDL_DFB_ALLOC_CLEAR(data->pixels, texture->h * data->pitch);
411  }
412  }
413 
414  return 0;
415 
416  error:
417  SDL_DFB_RELEASE(data->palette);
418  SDL_DFB_RELEASE(data->surface);
419  SDL_DFB_FREE(texture->driverdata);
420  return -1;
421 }
422 
423 #if 0
424 static int
425 DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
426 {
427 #if (DFB_VERSION_ATLEAST(1,2,0))
428 
429  DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
430 
431  switch (texture->scaleMode) {
432  case SDL_SCALEMODE_NONE:
433  case SDL_SCALEMODE_FAST:
434  data->render_options = DSRO_NONE;
435  break;
436  case SDL_SCALEMODE_SLOW:
437  data->render_options = DSRO_SMOOTH_UPSCALE | DSRO_SMOOTH_DOWNSCALE;
438  break;
439  case SDL_SCALEMODE_BEST:
440  data->render_options =
441  DSRO_SMOOTH_UPSCALE | DSRO_SMOOTH_DOWNSCALE | DSRO_ANTIALIAS;
442  break;
443  default:
444  data->render_options = DSRO_NONE;
445  texture->scaleMode = SDL_SCALEMODE_NONE;
446  return SDL_Unsupported();
447  }
448 #endif
449  return 0;
450 }
451 #endif
452 
453 static int
454 DirectFB_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
455  const SDL_Rect * rect, const void *pixels, int pitch)
456 {
457  DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
458  Uint8 *dpixels;
459  int dpitch;
460  Uint8 *src, *dst;
461  int row;
462  size_t length;
463  int bpp = DFB_BYTES_PER_PIXEL(DirectFB_SDLToDFBPixelFormat(texture->format));
464  /* FIXME: SDL_BYTESPERPIXEL(texture->format) broken for yuv yv12 3 planes */
465 
466  DirectFB_ActivateRenderer(renderer);
467 
468  if ((texture->format == SDL_PIXELFORMAT_YV12) ||
469  (texture->format == SDL_PIXELFORMAT_IYUV)) {
470  bpp = 1;
471  }
472 
473  SDL_DFB_CHECKERR(data->surface->Lock(data->surface,
474  DSLF_WRITE | DSLF_READ,
475  ((void **) &dpixels), &dpitch));
476  src = (Uint8 *) pixels;
477  dst = (Uint8 *) dpixels + rect->y * dpitch + rect->x * bpp;
478  length = rect->w * bpp;
479  for (row = 0; row < rect->h; ++row) {
481  src += pitch;
482  dst += dpitch;
483  }
484  /* copy other planes for 3 plane formats */
485  if ((texture->format == SDL_PIXELFORMAT_YV12) ||
486  (texture->format == SDL_PIXELFORMAT_IYUV)) {
487  src = (Uint8 *) pixels + texture->h * pitch;
488  dst = (Uint8 *) dpixels + texture->h * dpitch + rect->y * dpitch / 4 + rect->x * bpp / 2;
489  for (row = 0; row < rect->h / 2 + (rect->h & 1); ++row) {
490  SDL_memcpy(dst, src, length / 2);
491  src += pitch / 2;
492  dst += dpitch / 2;
493  }
494  src = (Uint8 *) pixels + texture->h * pitch + texture->h * pitch / 4;
495  dst = (Uint8 *) dpixels + texture->h * dpitch + texture->h * dpitch / 4 + rect->y * dpitch / 4 + rect->x * bpp / 2;
496  for (row = 0; row < rect->h / 2 + (rect->h & 1); ++row) {
497  SDL_memcpy(dst, src, length / 2);
498  src += pitch / 2;
499  dst += dpitch / 2;
500  }
501  }
502  SDL_DFB_CHECKERR(data->surface->Unlock(data->surface));
503  data->isDirty = 0;
504  return 0;
505  error:
506  return 1;
507 
508 }
509 
510 static int
511 DirectFB_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
512  const SDL_Rect * rect, void **pixels, int *pitch)
513 {
514  DirectFB_TextureData *texturedata =
515  (DirectFB_TextureData *) texture->driverdata;
516 
517  DirectFB_ActivateRenderer(renderer);
518 
519 #if 0
520  if (markDirty) {
521  SDL_AddDirtyRect(&texturedata->dirty, rect);
522  }
523 #endif
524 
525  if (texturedata->display) {
526  void *fdata;
527  int fpitch;
528 
529  SDL_DFB_CHECKERR(texturedata->surface->Lock(texturedata->surface,
530  DSLF_WRITE | DSLF_READ,
531  &fdata, &fpitch));
532  *pitch = fpitch;
533  *pixels = fdata;
534  } else {
535  *pixels =
536  (void *) ((Uint8 *) texturedata->pixels +
537  rect->y * texturedata->pitch +
538  rect->x * DFB_BYTES_PER_PIXEL(DirectFB_SDLToDFBPixelFormat(texture->format)));
539  *pitch = texturedata->pitch;
540  texturedata->isDirty = 1;
541  }
542  return 0;
543 
544  error:
545  return -1;
546 }
547 
548 static void
549 DirectFB_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
550 {
551  DirectFB_TextureData *texturedata =
552  (DirectFB_TextureData *) texture->driverdata;
553 
554  DirectFB_ActivateRenderer(renderer);
555 
556  if (texturedata->display) {
557  SDL_DFB_CHECK(texturedata->surface->Unlock(texturedata->surface));
558  texturedata->pixels = NULL;
559  }
560 }
561 
562 static void
563 DirectFB_SetTextureScaleMode()
564 {
565 }
566 
567 #if 0
568 static void
569 DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
570  int numrects, const SDL_Rect * rects)
571 {
572  DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
573  int i;
574 
575  for (i = 0; i < numrects; ++i) {
576  SDL_AddDirtyRect(&data->dirty, &rects[i]);
577  }
578 }
579 #endif
580 
581 static int DirectFB_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
582 {
583  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
584  DirectFB_TextureData *tex_data = NULL;
585 
586  DirectFB_ActivateRenderer(renderer);
587  if (texture) {
588  tex_data = (DirectFB_TextureData *) texture->driverdata;
589  data->target = tex_data->surface;
590  } else {
591  data->target = get_dfb_surface(data->window);
592  }
593  data->lastBlendMode = 0;
594  return 0;
595 }
596 
597 
598 static int
599 DirectFB_QueueSetViewport(SDL_Renderer * renderer, SDL_RenderCommand *cmd)
600 {
601  return 0; /* nothing to do in this backend. */
602 }
603 
604 static int
605 DirectFB_QueueDrawPoints(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
606 {
607  const size_t len = count * sizeof (SDL_FPoint);
608  SDL_FPoint *verts = (SDL_FPoint *) SDL_AllocateRenderVertices(renderer, len, 0, &cmd->data.draw.first);
609 
610  if (!verts) {
611  return -1;
612  }
613 
614  cmd->data.draw.count = count;
615  SDL_memcpy(verts, points, len);
616  return 0;
617 }
618 
619 static int
620 DirectFB_QueueFillRects(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects, int count)
621 {
622  const size_t len = count * sizeof (SDL_FRect);
623  SDL_FRect *verts = (SDL_FRect *) SDL_AllocateRenderVertices(renderer, len, 0, &cmd->data.draw.first);
624 
625  if (!verts) {
626  return -1;
627  }
628 
629  cmd->data.draw.count = count;
630  SDL_memcpy(verts, rects, count);
631  return 0;
632 }
633 
634 static int
635 DirectFB_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
636  const SDL_Rect * srcrect, const SDL_FRect * dstrect)
637 {
638  DFBRectangle *verts = (DFBRectangle *) SDL_AllocateRenderVertices(renderer, 2 * sizeof (DFBRectangle), 0, &cmd->data.draw.first);
639 
640  if (!verts) {
641  return -1;
642  }
643 
644  cmd->data.draw.count = 1;
645 
646  SDLtoDFBRect(srcrect, verts++);
647  SDLtoDFBRect_Float(dstrect, verts);
648 
649  return 0;
650 }
651 
652 static int
653 DirectFB_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
654  const SDL_Rect * srcrect, const SDL_FRect * dstrect,
655  const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
656 {
657  return SDL_Unsupported();
658 }
659 
660 
661 static int
662 DirectFB_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
663 {
664  /* !!! FIXME: there are probably some good optimization wins in here if someone wants to look it over. */
665  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
666  IDirectFBSurface *destsurf = data->target;
667  DFBRegion clip_region;
668  size_t i;
669 
670  DirectFB_ActivateRenderer(renderer);
671 
672  SDL_zero(clip_region); /* in theory, this always gets set before use. */
673 
674  while (cmd) {
675  switch (cmd->command) {
677  break; /* not used here */
678 
680  const SDL_Rect *viewport = &cmd->data.viewport.rect;
681  clip_region.x1 = viewport->x;
682  clip_region.y1 = viewport->y;
683  clip_region.x2 = clip_region.x1 + viewport->w - 1;
684  clip_region.y2 = clip_region.y1 + viewport->h - 1;
685  destsurf->SetClip(destsurf, &clip_region);
686  break;
687  }
688 
690  /* !!! FIXME: how does this SetClip interact with the one in SETVIEWPORT? */
691  if (cmd->data.cliprect.enabled) {
692  const SDL_Rect *rect = &cmd->data.cliprect.rect;
693  clip_region.x1 = rect->x;
694  clip_region.x2 = rect->x + rect->w;
695  clip_region.y1 = rect->y;
696  clip_region.y2 = rect->y + rect->h;
697  destsurf->SetClip(destsurf, &clip_region);
698  }
699  break;
700  }
701 
702  case SDL_RENDERCMD_CLEAR: {
703  const Uint8 r = cmd->data.color.r;
704  const Uint8 g = cmd->data.color.g;
705  const Uint8 b = cmd->data.color.b;
706  const Uint8 a = cmd->data.color.a;
707  destsurf->Clear(destsurf, r, g, b, a);
708  break;
709  }
710 
712  const size_t count = cmd->data.draw.count;
713  const SDL_FPoint *points = (SDL_FPoint *) (((Uint8 *) vertices) + cmd->data.draw.first);
714  PrepareDraw(renderer, cmd);
715  for (i = 0; i < count; i++) {
716  const int x = points[i].x + clip_region.x1;
717  const int y = points[i].y + clip_region.y1;
718  destsurf->DrawLine(destsurf, x, y, x, y);
719  }
720  break;
721  }
722 
724  const SDL_FPoint *points = (SDL_FPoint *) (((Uint8 *) vertices) + cmd->data.draw.first);
725  const size_t count = cmd->data.draw.count;
726 
727  PrepareDraw(renderer, cmd);
728 
729  #if (DFB_VERSION_ATLEAST(1,2,0)) /* !!! FIXME: should this be set once, somewhere else? */
730  destsurf->SetRenderOptions(destsurf, DSRO_ANTIALIAS);
731  #endif
732 
733  for (i = 0; i < count - 1; i++) {
734  const int x1 = points[i].x + clip_region.x1;
735  const int y1 = points[i].y + clip_region.y1;
736  const int x2 = points[i + 1].x + clip_region.x1;
737  const int y2 = points[i + 1].y + clip_region.y1;
738  destsurf->DrawLine(destsurf, x1, y1, x2, y2);
739  }
740  break;
741  }
742 
744  const SDL_FRect *rects = (SDL_FRect *) (((Uint8 *) vertices) + cmd->data.draw.first);
745  const size_t count = cmd->data.draw.count;
746 
747  PrepareDraw(renderer, cmd);
748 
749  for (i = 0; i < count; i++, rects++) {
750  destsurf->FillRectangle(destsurf, rects->x + clip_region.x1, rects->y + clip_region.y1, rects->w, rects->h);
751  }
752  break;
753  }
754 
755  case SDL_RENDERCMD_COPY: {
756  SDL_Texture *texture = cmd->data.draw.texture;
757  const Uint8 r = cmd->data.draw.r;
758  const Uint8 g = cmd->data.draw.g;
759  const Uint8 b = cmd->data.draw.b;
760  const Uint8 a = cmd->data.draw.a;
761  DFBRectangle *verts = (DFBRectangle *) (((Uint8 *) vertices) + cmd->data.draw.first);
762  DirectFB_TextureData *texturedata = (DirectFB_TextureData *) texture->driverdata;
763  DFBRectangle *sr = verts++;
764  DFBRectangle *dr = verts;
765 
766  dr->x += clip_region.x1;
767  dr->y += clip_region.y1;
768 
769  if (texturedata->display) {
770  int px, py;
772  IDirectFBWindow *dfbwin = get_dfb_window(window);
774  SDL_VideoDisplay *display = texturedata->display;
775  DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
776 
777  dispdata->vidlayer->SetSourceRectangle(dispdata->vidlayer, sr->x, sr->y, sr->w, sr->h);
778  dfbwin->GetPosition(dfbwin, &px, &py);
779  px += windata->client.x;
780  py += windata->client.y;
781  dispdata->vidlayer->SetScreenRectangle(dispdata->vidlayer, px + dr->x, py + dr->y, dr->w, dr->h);
782  } else {
783  DFBSurfaceBlittingFlags flags = 0;
784  if (texturedata->isDirty) {
785  const SDL_Rect rect = { 0, 0, texture->w, texture->h };
786  DirectFB_UpdateTexture(renderer, texture, &rect, texturedata->pixels, texturedata->pitch);
787  }
788 
789  if (a != 0xFF) {
790  flags |= DSBLIT_BLEND_COLORALPHA;
791  }
792 
793  if ((r & g & b) != 0xFF) {
794  flags |= DSBLIT_COLORIZE;
795  }
796 
797  destsurf->SetColor(destsurf, r, g, b, a);
798 
799  /* ???? flags |= DSBLIT_SRC_PREMULTCOLOR; */
800 
801  SetBlendMode(data, texture->blendMode, texturedata);
802 
803  destsurf->SetBlittingFlags(destsurf, data->blitFlags | flags);
804 
805 #if (DFB_VERSION_ATLEAST(1,2,0))
806  destsurf->SetRenderOptions(destsurf, texturedata->render_options);
807 #endif
808 
809  if (sr->w == dr->w && sr->h == dr->h) {
810  destsurf->Blit(destsurf, texturedata->surface, sr, dr->x, dr->y);
811  } else {
812  destsurf->StretchBlit(destsurf, texturedata->surface, sr, dr);
813  }
814  }
815  break;
816  }
817 
819  break; /* unsupported */
820 
821  case SDL_RENDERCMD_NO_OP:
822  break;
823  }
824 
825  cmd = cmd->next;
826  }
827 
828  return 0;
829 }
830 
831 
832 static void
833 DirectFB_RenderPresent(SDL_Renderer * renderer)
834 {
835  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
838  SDL_ShapeData *shape_data = (window->shaper ? window->shaper->driverdata : NULL);
839 
840  DirectFB_ActivateRenderer(renderer);
841 
842  if (shape_data && shape_data->surface) {
843  /* saturate the window surface alpha channel */
844  SDL_DFB_CHECK(windata->window_surface->SetSrcBlendFunction(windata->window_surface, DSBF_ONE));
845  SDL_DFB_CHECK(windata->window_surface->SetDstBlendFunction(windata->window_surface, DSBF_ONE));
846  SDL_DFB_CHECK(windata->window_surface->SetDrawingFlags(windata->window_surface, DSDRAW_BLEND));
847  SDL_DFB_CHECK(windata->window_surface->SetColor(windata->window_surface, 0, 0, 0, 0xff));
848  SDL_DFB_CHECK(windata->window_surface->FillRectangle(windata->window_surface, 0,0, windata->size.w, windata->size.h));
849 
850  /* blit the mask */
851  SDL_DFB_CHECK(windata->surface->SetSrcBlendFunction(windata->surface, DSBF_DESTCOLOR));
852  SDL_DFB_CHECK(windata->surface->SetDstBlendFunction(windata->surface, DSBF_ZERO));
853  SDL_DFB_CHECK(windata->surface->SetBlittingFlags(windata->surface, DSBLIT_BLEND_ALPHACHANNEL));
854 #if (DFB_VERSION_ATLEAST(1,2,0))
855  SDL_DFB_CHECK(windata->surface->SetRenderOptions(windata->surface, DSRO_NONE));
856 #endif
857  SDL_DFB_CHECK(windata->surface->Blit(windata->surface, shape_data->surface, NULL, 0, 0));
858  }
859 
860  /* Send the data to the display */
861  SDL_DFB_CHECK(windata->window_surface->Flip(windata->window_surface, NULL,
862  data->flipflags));
863 }
864 
865 static void
866 DirectFB_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
867 {
868  DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
869 
870  DirectFB_ActivateRenderer(renderer);
871 
872  if (!data) {
873  return;
874  }
875  SDL_DFB_RELEASE(data->palette);
876  SDL_DFB_RELEASE(data->surface);
877  if (data->display) {
878  DFB_DisplayData *dispdata =
879  (DFB_DisplayData *) data->display->driverdata;
880  dispdata->vidIDinuse = 0;
881  /* FIXME: Shouldn't we reset the cooperative level */
882  SDL_DFB_CHECK(dispdata->vidlayer->SetCooperativeLevel(dispdata->vidlayer,
883  DLSCL_ADMINISTRATIVE));
884  SDL_DFB_RELEASE(dispdata->vidlayer);
885  }
886  SDL_DFB_FREE(data->pixels);
887  SDL_free(data);
888  texture->driverdata = NULL;
889 }
890 
891 static void
892 DirectFB_DestroyRenderer(SDL_Renderer * renderer)
893 {
894  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
895 #if 0
896  SDL_VideoDisplay *display = SDL_GetDisplayForWindow(data->window);
897  if (display->palette) {
898  SDL_DelPaletteWatch(display->palette, DisplayPaletteChanged, data);
899  }
900 #endif
901 
902  SDL_free(data);
904 }
905 
906 static int
907 DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
908  Uint32 format, void * pixels, int pitch)
909 {
910  Uint32 sdl_format;
911  unsigned char* laypixels;
912  int laypitch;
913  DFBSurfacePixelFormat dfb_format;
914  DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
915  IDirectFBSurface *winsurf = data->target;
916 
917  DirectFB_ActivateRenderer(renderer);
918 
919  winsurf->GetPixelFormat(winsurf, &dfb_format);
920  sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format);
921  winsurf->Lock(winsurf, DSLF_READ, (void **) &laypixels, &laypitch);
922 
923  laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) );
925  sdl_format, laypixels, laypitch,
926  format, pixels, pitch);
927 
928  winsurf->Unlock(winsurf);
929 
930  return 0;
931 }
932 
933 #if 0
934 static int
935 DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
936  Uint32 format, const void * pixels, int pitch)
937 {
940  Uint32 sdl_format;
941  unsigned char* laypixels;
942  int laypitch;
943  DFBSurfacePixelFormat dfb_format;
944 
945  SDL_DFB_CHECK(windata->surface->GetPixelFormat(windata->surface, &dfb_format));
946  sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format);
947 
948  SDL_DFB_CHECK(windata->surface->Lock(windata->surface, DSLF_WRITE, (void **) &laypixels, &laypitch));
949 
950  laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) );
952  format, pixels, pitch,
953  sdl_format, laypixels, laypitch);
954 
955  SDL_DFB_CHECK(windata->surface->Unlock(windata->surface));
956 
957  return 0;
958 }
959 #endif
960 
961 
962 SDL_Renderer *
963 DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
964 {
965  IDirectFBSurface *winsurf = get_dfb_surface(window);
966  /*SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);*/
968  DirectFB_RenderData *data = NULL;
969  DFBSurfaceCapabilities scaps;
970 
971  if (!winsurf) {
972  return NULL;
973  }
974 
976  SDL_DFB_ALLOC_CLEAR(data, sizeof(*data));
977 
978  renderer->WindowEvent = DirectFB_WindowEvent;
979  renderer->CreateTexture = DirectFB_CreateTexture;
980  renderer->UpdateTexture = DirectFB_UpdateTexture;
981  renderer->LockTexture = DirectFB_LockTexture;
982  renderer->UnlockTexture = DirectFB_UnlockTexture;
983  renderer->SetTextureScaleMode = DirectFB_SetTextureScaleMode;
984  renderer->QueueSetViewport = DirectFB_QueueSetViewport;
985  renderer->QueueSetDrawColor = DirectFB_QueueSetViewport; /* SetViewport and SetDrawColor are (currently) no-ops. */
986  renderer->QueueDrawPoints = DirectFB_QueueDrawPoints;
987  renderer->QueueDrawLines = DirectFB_QueueDrawPoints; /* lines and points queue vertices the same way. */
988  renderer->QueueFillRects = DirectFB_QueueFillRects;
989  renderer->QueueCopy = DirectFB_QueueCopy;
990  renderer->QueueCopyEx = DirectFB_QueueCopyEx;
991  renderer->RunCommandQueue = DirectFB_RunCommandQueue;
992  renderer->RenderPresent = DirectFB_RenderPresent;
993 
994  /* FIXME: Yet to be tested */
995  renderer->RenderReadPixels = DirectFB_RenderReadPixels;
996  /* renderer->RenderWritePixels = DirectFB_RenderWritePixels; */
997 
998  renderer->DestroyTexture = DirectFB_DestroyTexture;
999  renderer->DestroyRenderer = DirectFB_DestroyRenderer;
1000  renderer->SetRenderTarget = DirectFB_SetRenderTarget;
1001 
1003  renderer->window = window; /* SDL window */
1005 
1006  renderer->info.flags =
1008 
1009  data->window = window;
1010  data->target = winsurf;
1011 
1012  data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT;
1013 
1015  data->flipflags |= DSFLIP_WAITFORSYNC | DSFLIP_ONSYNC;
1017  } else
1018  data->flipflags |= DSFLIP_ONSYNC;
1019 
1020  SDL_DFB_CHECKERR(winsurf->GetCapabilities(winsurf, &scaps));
1021 
1022 #if 0
1023  if (scaps & DSCAPS_DOUBLE)
1024  renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
1025  else if (scaps & DSCAPS_TRIPLE)
1026  renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
1027  else
1028  renderer->info.flags |= SDL_RENDERER_SINGLEBUFFER;
1029 #endif
1030 
1032 
1033 #if 0
1034  /* Set up a palette watch on the display palette */
1035  if (display-> palette) {
1036  SDL_AddPaletteWatch(display->palette, DisplayPaletteChanged, data);
1037  }
1038 #endif
1039 
1040  return renderer;
1041 
1042  error:
1044  SDL_DFB_FREE(data);
1045  return NULL;
1046 }
1047 
1048 
1050  DirectFB_CreateRenderer,
1051  {
1052  "directfb",
1054  /* (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
1055  SDL_TEXTUREMODULATE_ALPHA),
1056  (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND |
1057  SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
1058  (SDL_SCALEMODE_NONE | SDL_SCALEMODE_FAST |
1059  SDL_SCALEMODE_SLOW | SDL_SCALEMODE_BEST), */
1060  0,
1061  {
1062  /* formats filled in later */
1063  },
1064  0,
1065  0}
1066 };
1067 
1068 #endif /* SDL_VIDEO_DRIVER_DIRECTFB */
1069 
1070 /* vi: set ts=4 sw=4 expandtab: */
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:418
DirectFB_RenderDriver
SDL_RenderDriver DirectFB_RenderDriver
SDL_Renderer::blendMode
SDL_BlendMode blendMode
Definition: SDL_sysrender.h:198
format
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
points
GLfixed GLfixed GLint GLint GLfixed points
Definition: SDL_opengl_glext.h:4561
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386
SDL_PIXELFORMAT_ARGB1555
@ SDL_PIXELFORMAT_ARGB1555
Definition: SDL_pixels.h:215
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
target
GLenum target
Definition: SDL_opengl_glext.h:1554
blendMode
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
if
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
Definition: pixman-arm-neon-asm.h:469
DirectFB_SetSupportedPixelFormats
void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo *ri)
SDL_Renderer::QueueCopyEx
int(* QueueCopyEx)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcquad, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
Definition: SDL_sysrender.h:127
SDL_BLENDMODE_ADD
@ SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
SDL_AllocateRenderVertices
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
Definition: SDL_render.c:263
SDL_Renderer::RunCommandQueue
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
Definition: SDL_sysrender.h:130
source
GLsizei GLsizei GLchar * source
Definition: SDL_opengl_glext.h:680
SDL_FRect::h
float h
Definition: SDL_rect.h:92
NULL
#define NULL
Definition: begin_code.h:167
surface
EGLSurface surface
Definition: eglext.h:248
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1112
SDL_Renderer::SetRenderTarget
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:143
SDL_VideoDisplay::device
SDL_VideoDevice * device
Definition: SDL_sysvideo.h:138
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1112
SDL_VERSION
#define SDL_VERSION(x)
Macro to determine SDL version program was compiled against.
Definition: SDL_version.h:79
SDL_SysWMinfo
Definition: SDL_syswm.h:201
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_RenderCommand::next
struct SDL_RenderCommand * next
Definition: SDL_sysrender.h:104
SDL_GetDisplayForWindow
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
Definition: SDL_video.c:1110
SDL_SysWMinfo::window
Window window
Definition: SDL_syswm.h:225
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
viewport
static SDL_Rect viewport
Definition: testviewport.c:28
SDL_RenderDriver
Definition: SDL_sysrender.h:222
SDL_FRect::x
float x
Definition: SDL_rect.h:89
SDL_ISPIXELFORMAT_INDEXED
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:134
SDL_Renderer::WindowEvent
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Definition: SDL_sysrender.h:113
DirectFB_DFBToSDLPixelFormat
Uint32 DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat)
x1
GLuint GLfloat GLfloat GLfloat x1
Definition: SDL_opengl_glext.h:8586
a
GLboolean GLboolean GLboolean GLboolean a
Definition: SDL_opengl_glext.h:1112
SDL_RendererFlip
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
Definition: SDL_render.h:121
length
GLuint GLsizei GLsizei * length
Definition: SDL_opengl_glext.h:672
SDL_DirectFB_window.h
SDL_Rect::x
int x
Definition: SDL_rect.h:79
SDL_RENDERCMD_COPY
@ SDL_RENDERCMD_COPY
Definition: SDL_sysrender.h:76
SDL_RENDERCMD_SETCLIPRECT
@ SDL_RENDERCMD_SETCLIPRECT
Definition: SDL_sysrender.h:70
SDL_PIXELFORMAT_IYUV
@ SDL_PIXELFORMAT_IYUV
Definition: SDL_pixels.h:282
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_Rect::w
int w
Definition: SDL_rect.h:80
row
GLenum GLenum void * row
Definition: SDL_opengl_glext.h:3141
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:74
SDL_ShapeData::surface
IDirectFBSurface * surface
Definition: SDL_DirectFB_shape.h:31
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1740
SDL_ShapeData
Definition: SDL_cocoashape.h:32
SDL_BLENDMODE_MOD
@ SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
len
GLenum GLsizei len
Definition: SDL_opengl_glext.h:2929
SDL_BLENDMODE_NONE
@ SDL_BLENDMODE_NONE
Definition: SDL_blendmode.h:42
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:387
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2652
SDL_Renderer
Definition: SDL_sysrender.h:109
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_Renderer::QueueSetDrawColor
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Definition: SDL_sysrender.h:118
SDL_DirectFB_shape.h
SDL_FPoint
The structure that defines a point (floating point)
Definition: SDL_rect.h:60
SDL_Renderer::driverdata
void * driverdata
Definition: SDL_sysrender.h:218
SDL_FRect::y
float y
Definition: SDL_rect.h:90
SDL_RenderCommand::color
struct SDL_RenderCommand::@23::@27 color
SDL_FRect::w
float w
Definition: SDL_rect.h:91
SDL_PIXELFORMAT_ARGB4444
@ SDL_PIXELFORMAT_ARGB4444
Definition: SDL_pixels.h:203
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Renderer::SetTextureScaleMode
void(* SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
Definition: SDL_sysrender.h:142
SDL_RendererInfo::flags
Uint32 flags
Definition: SDL_render.h:81
SDL_Rect::y
int y
Definition: SDL_rect.h:79
SDL_DirectFB_modes.h
SDL_INLINE
#define SDL_INLINE
Definition: begin_code.h:134
SDL_Rect::h
int h
Definition: SDL_rect.h:80
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_RENDERCMD_SETVIEWPORT
@ SDL_RENDERCMD_SETVIEWPORT
Definition: SDL_sysrender.h:69
SDL_BLENDMODE_MUL
@ SDL_BLENDMODE_MUL
Definition: SDL_blendmode.h:53
SDL_Renderer::QueueDrawLines
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
Definition: SDL_sysrender.h:121
SDL_RENDERER_PRESENTVSYNC
@ SDL_RENDERER_PRESENTVSYNC
Definition: SDL_render.h:69
SDL_PIXELFORMAT_ARGB2101010
@ SDL_PIXELFORMAT_ARGB2101010
Definition: SDL_pixels.h:263
SDL_RENDERCMD_DRAW_POINTS
@ SDL_RENDERCMD_DRAW_POINTS
Definition: SDL_sysrender.h:73
rect
SDL_Rect rect
Definition: testrelative.c:27
SDL_DFB_RELEASE
#define SDL_DFB_RELEASE(x)
Definition: SDL_DirectFB_video.h:78
DirectFB_SDLToDFBPixelFormat
DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format)
SDL_DFB_DEVICEDATA
#define SDL_DFB_DEVICEDATA(dev)
Definition: SDL_DirectFB_video.h:126
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:155
SDL_RenderCommand::command
SDL_RenderCommandType command
Definition: SDL_sysrender.h:82
SDL_RENDERCMD_NO_OP
@ SDL_RENDERCMD_NO_OP
Definition: SDL_sysrender.h:68
SDL_Renderer::QueueSetViewport
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Definition: SDL_sysrender.h:117
SDL_PIXELFORMAT_ARGB8888
@ SDL_PIXELFORMAT_ARGB8888
Definition: SDL_pixels.h:251
SDL_DFB_CHECK
#define SDL_DFB_CHECK(x...)
Definition: SDL_DirectFB_video.h:99
SDL_DFB_WINDOWDATA
#define SDL_DFB_WINDOWDATA(win)
Definition: SDL_DirectFB_window.h:28
SDL_VideoDisplay::driverdata
void * driverdata
Definition: SDL_sysvideo.h:140
SDL_RENDERCMD_DRAW_LINES
@ SDL_RENDERCMD_DRAW_LINES
Definition: SDL_sysrender.h:74
pixels
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
SDL_DFB_DEBUG
#define SDL_DFB_DEBUG(x...)
Definition: SDL_DirectFB_video.h:89
SDL_Renderer::CreateTexture
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:116
SDL_BLENDMODE_BLEND
@ SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44
SDL_RenderCommand::data
union SDL_RenderCommand::@23 data
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
bpp
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp
Definition: pixman-arm-neon-asm.h:146
SDL_RENDERCMD_FILL_RECTS
@ SDL_RENDERCMD_FILL_RECTS
Definition: SDL_sysrender.h:75
SDL_Renderer::DestroyRenderer
void(* DestroyRenderer)(SDL_Renderer *renderer)
Definition: SDL_sysrender.h:149
SDL_Renderer::LockTexture
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_sysrender.h:139
SDL_DFB_ALLOC_CLEAR
#define SDL_DFB_ALLOC_CLEAR(r, s)
Definition: SDL_DirectFB_video.h:122
SDL_BLENDMODE_INVALID
@ SDL_BLENDMODE_INVALID
Definition: SDL_blendmode.h:56
SDL_Renderer::RenderReadPixels
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
Definition: SDL_sysrender.h:144
SDL_RENDERCMD_COPY_EX
@ SDL_RENDERCMD_COPY_EX
Definition: SDL_sysrender.h:77
SDL_GetWindowWMInfo
#define SDL_GetWindowWMInfo
Definition: SDL_dynapi_overrides.h:473
src
GLenum src
Definition: SDL_opengl_glext.h:1740
SDL_RenderCommand
Definition: SDL_sysrender.h:80
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_PIXELFORMAT_INDEX4LSB
@ SDL_PIXELFORMAT_INDEX4LSB
Definition: SDL_pixels.h:180
SDL_ISPIXELFORMAT_FOURCC
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
SDL_DFB_FREE
#define SDL_DFB_FREE(x)
Definition: SDL_DirectFB_video.h:79
SDL_RenderCommand::cliprect
struct SDL_RenderCommand::@23::@25 cliprect
SDL_SysWMinfo::version
SDL_version version
Definition: SDL_syswm.h:203
SDL_Renderer::info
SDL_RendererInfo info
Definition: SDL_sysrender.h:158
SDL_RENDERER_TARGETTEXTURE
@ SDL_RENDERER_TARGETTEXTURE
Definition: SDL_render.h:71
SDL_PIXELFORMAT_RGBA8888
@ SDL_PIXELFORMAT_RGBA8888
Definition: SDL_pixels.h:254
SDL_VideoDisplay
Definition: SDL_sysvideo.h:126
x2
GLfixed GLfixed x2
Definition: SDL_opengl_glext.h:4586
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_Renderer::RenderPresent
void(* RenderPresent)(SDL_Renderer *renderer)
Definition: SDL_sysrender.h:146
SDL_BYTESPERPIXEL
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
SDL_Rect
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:77
SDL_Texture
Definition: SDL_sysrender.h:36
SDL_Renderer::QueueFillRects
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
Definition: SDL_sysrender.h:123
SDL_Renderer::UpdateTexture
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_sysrender.h:131
y1
GLfixed y1
Definition: SDL_opengl_glext.h:4586
SDL_WindowEvent
Window state change event data (event.window.*)
Definition: SDL_events.h:195
SDL_PIXELFORMAT_BGRA8888
@ SDL_PIXELFORMAT_BGRA8888
Definition: SDL_pixels.h:260
SDL_FRect
A rectangle, with the origin at the upper left (floating point).
Definition: SDL_rect.h:87
y2
GLfixed GLfixed GLfixed y2
Definition: SDL_opengl_glext.h:4586
SDL_RenderDriver::info
SDL_RendererInfo info
Definition: SDL_sysrender.h:227
SDL_ConvertPixels
#define SDL_ConvertPixels
Definition: SDL_dynapi_overrides.h:465
SDL_SysWMinfo::info
union SDL_SysWMinfo::@10 info
angle
GLfloat angle
Definition: SDL_opengl_glext.h:6100
SDL_DFB_CHECKERR
#define SDL_DFB_CHECKERR(x...)
Definition: SDL_DirectFB_video.h:100
SDL_Renderer::QueueDrawPoints
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
Definition: SDL_sysrender.h:119
SDL_PIXELFORMAT_INDEX4MSB
@ SDL_PIXELFORMAT_INDEX4MSB
Definition: SDL_pixels.h:183
SDL_Unsupported
#define SDL_Unsupported()
Definition: SDL_error.h:53
SDL_RENDERER_ACCELERATED
@ SDL_RENDERER_ACCELERATED
Definition: SDL_render.h:67
SDL_PIXELFORMAT_YV12
@ SDL_PIXELFORMAT_YV12
Definition: SDL_pixels.h:280
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1483
SDL_RENDERCMD_SETDRAWCOLOR
@ SDL_RENDERCMD_SETDRAWCOLOR
Definition: SDL_sysrender.h:71
SDL_Renderer::QueueCopy
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
Definition: SDL_sysrender.h:125
SDL_Renderer::window
SDL_Window * window
Definition: SDL_sysrender.h:161
SDL_TEXTUREACCESS_STREAMING
@ SDL_TEXTUREACCESS_STREAMING
Definition: SDL_render.h:104
texture
GLenum GLenum GLuint texture
Definition: SDL_opengl_glext.h:1181
SDL_RenderCommand::viewport
struct SDL_RenderCommand::@23::@24 viewport
rects
EGLSurface EGLint * rects
Definition: eglext.h:282
SDL_PIXELFORMAT_ABGR8888
@ SDL_PIXELFORMAT_ABGR8888
Definition: SDL_pixels.h:257
SDL_RenderCommand::draw
struct SDL_RenderCommand::@23::@26 draw
SDL_SysWMinfo::surface
struct wl_surface * surface
Definition: SDL_syswm.h:263
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_RENDERCMD_CLEAR
@ SDL_RENDERCMD_CLEAR
Definition: SDL_sysrender.h:72
SDL_Renderer::UnlockTexture
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:141
SDL_syswm.h
SDL_Renderer::DestroyTexture
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:147
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179