Skip to content

Commit 2f987c7

Browse files
committed
Add special optimization for bitmasked blits
1 parent df1a4e1 commit 2f987c7

File tree

6 files changed

+633
-21
lines changed

6 files changed

+633
-21
lines changed

kos/include/libvideo/gfx/gfx.h

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -132,23 +132,6 @@ struct video_blitter_ops {
132132
video_offset_t __src_x, video_offset_t __src_y,
133133
video_dim_t __src_size_x, video_dim_t __src_size_y);
134134

135-
/* TODO: Bring back "vbto_bitblit_masked" (same as "vbto_bitblit", but also has a
136-
* `struct video_bitmask' specifying which pixels of the source GFX should
137-
* actually be copied)
138-
* - Gonna need that one for window composition, which I'm probably going to do
139-
* by having windows that are covered such that the visible area isn't a simple
140-
* rect, exclusively use a back-buffer that is then blit to-screen alongside a
141-
* bitmask (causing *only* the pixels still visible to be blit)
142-
*
143-
* XXX: This can already be done with blitter3:
144-
* - wrdst: Destination [blend:GFX_BLENDMODE_ALPHA] (or some other alpha-respecting blend-mode)
145-
* - rddst: video_bitmask [blend:GFX_BLENDMODE_ALPHAMASK,codec:VIDEO_CODEC_A1_MSB]
146-
* - src: Source
147-
*
148-
* In these configurations, only pixels that appear as 1-bits in the mask can be
149-
* blitted.
150-
*/
151-
152135
/* TODO: Some way to rotate and flip pixels during blits (using precise angles,
153136
* rather than the mere 90° rotations possible via `VIDEO_GFX_F_XYSWAP') */
154137

@@ -861,7 +844,26 @@ struct video_blitter {
861844
*
862845
* NOTE: Only the intersection of rects in "vbt3_rddst" / "vbt3_wrdst"
863846
* actually gets blitted!
864-
*/
847+
*
848+
* NOTE: In order to perform a marked blit (iow: a blit where only
849+
* pixels that appear as 1-bits in some pixel mask are copied),
850+
* store the mask as a video_buffer using VIDEO_CODEC_A1_MSB
851+
* as pixel codec, and then blit as follows:
852+
* >> void masked_blit(struct video_buffer *dst,
853+
* >> struct video_buffer *mask,
854+
* >> struct video_buffer *src) {
855+
* >> struct video_gfx dst_gfx;
856+
* >> struct video_gfx src_gfx;
857+
* >> struct video_gfx mask_gfx;
858+
* >> video_buffer_getgfx(dst, &dst_gfx, GFX_BLENDMODE_ALPHA, VIDEO_GFX_F_NORMAL, 0);
859+
* >> video_buffer_getgfx(src, &src_gfx, GFX_BLENDMODE_OVERRIDE, VIDEO_GFX_F_NORMAL, 0); // Blend mode doesn't matter
860+
* >> video_buffer_getgfx(mask, &mask_gfx, GFX_BLENDMODE_ALPHAMASK, VIDEO_GFX_F_NORMAL, 0);
861+
* >> video_gfx_bitblit3(&dst_gfx, 0, 0, &mask_gfx, 0, 0, &src_gfx, 0, 0,
862+
* >> video_gfx_getclipw(&src_gfx), video_gfx_getclipw(&dst_gfx));
863+
* >> }
864+
*
865+
* An optimizing video blitter implementation will detect this config
866+
* of GFX contexts and provide dedicated optimizations for this case. */
865867
struct video_blitter3 {
866868
struct video_blitter3_ops const *vbt3_ops; /* Blitter operators */
867869
/* WARNING: After initialization, the following fields must no longer be accessed by the user! */

kos/src/apps/showpic/main.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@
3535
#include <err.h>
3636
#include <format-printer.h>
3737
#include <stdbool.h>
38-
#include <syslog.h>
3938
#include <stddef.h>
4039
#include <stdint.h>
4140
#include <stdio.h>
4241
#include <stdlib.h>
42+
#include <string.h>
43+
#include <syslog.h>
4344
#include <time.h>
4445
#include <timeval-utils.h>
4546
#include <uchar.h>
@@ -282,7 +283,7 @@ do_showpic(struct screen_buffer *screen,
282283
VIDEO_GFX_F_NORMAL, 0);
283284
video_buffer_getgfx(image, &image_gfx,
284285
GFX_BLENDMODE_OVERRIDE,
285-
VIDEO_GFX_F_LINEAR, 0);
286+
VIDEO_GFX_F_NEAREST /*VIDEO_GFX_F_LINEAR*/, 0);
286287

287288
/*video_gfx_clip(&image_gfx, 200, 200,
288289
video_gfx_getclipw(&image_gfx) / 2,
@@ -337,11 +338,43 @@ do_showpic(struct screen_buffer *screen,
337338
#endif
338339

339340
/* Display the image */
340-
#if 1
341+
#if 0
341342
video_gfx_stretch(&screen_gfx, blit_x, blit_y, blit_w, blit_h,
342343
&image_gfx, 0, 0,
343344
video_gfx_getclipw(&image_gfx),
344345
video_gfx_getcliph(&image_gfx));
346+
#elif 1
347+
{
348+
REF struct video_buffer *mask_buffer;
349+
mask_buffer = video_buffer_create(VIDEO_BUFFER_AUTO, 64, 64,
350+
video_codec_lookup(VIDEO_CODEC_A1_MSB),
351+
NULL);
352+
if (mask_buffer) {
353+
struct video_gfx mask_gfx;
354+
video_buffer_getgfx(mask_buffer, &mask_gfx,
355+
GFX_BLENDMODE_OVERRIDE,
356+
VIDEO_GFX_F_XWRAP | VIDEO_GFX_F_YWRAP, 0);
357+
video_gfx_fill(&mask_gfx, 0, 0, 64-1, 64-1, VIDEO_COLOR_RGBA(0, 0, 0, 0xff));
358+
for (unsigned int i = 0; i < (32 / 4); ++i) {
359+
unsigned int x = i * 4;
360+
unsigned int y = i * 4;
361+
unsigned int w = 64 - (x * 2);
362+
unsigned int h = 64 - (y * 2);
363+
x += ((i & 1) >> 0) << 1;
364+
y += ((i & 2) >> 1) << 1;
365+
video_gfx_rect(&mask_gfx, x, y, w, h, VIDEO_COLOR_RGBA(0, 0, 0, 0));
366+
}
367+
video_gfx_setblend(&mask_gfx, GFX_BLENDMODE_ALPHAMASK);
368+
369+
video_gfx_stretch3(&screen_gfx, blit_x, blit_y,
370+
&mask_gfx, 32, 32,
371+
blit_w, blit_h,
372+
&image_gfx, 0, 0,
373+
video_gfx_getclipw(&image_gfx),
374+
video_gfx_getcliph(&image_gfx));
375+
video_buffer_decref(mask_buffer);
376+
}
377+
}
345378
#elif 0
346379
{
347380
struct video_gfx flipgfx = image_gfx;

kos/src/libvideo/gfx/swgfx-hl-blit.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@ libvideo_swgfx_blitfrom3(struct video_blitter3 *__restrict ctx) {
234234

235235
/* TODO: Special handling when buffers overlap */
236236

237+
/* Filter out contexts that prevent use of special optimizations */
238+
if (src_gfx->vx_flags & VIDEO_GFX_F_BLUR)
239+
goto set_generic_operators;
240+
if (!VIDEO_COLOR_ISTRANSPARENT(src_gfx->vx_colorkey))
241+
goto set_generic_operators;
242+
if (rddst_gfx->vx_flags & VIDEO_GFX_F_BLUR)
243+
goto set_generic_operators;
244+
if (!VIDEO_COLOR_ISTRANSPARENT(rddst_gfx->vx_colorkey))
245+
goto set_generic_operators;
246+
247+
/* Check for cases where we provide special optimizations */
237248
if likely(libvideo_gfx_allow_noblend_blit3(wrdst_gfx, rddst_gfx, src_gfx)) {
238249
/* Special optimization for likely case where "wrdst_gfx" doesn't do any blending */
239250
drv->bsw3_blit = &libvideo_swblitter3__blit__blend1;
@@ -245,7 +256,59 @@ libvideo_swgfx_blitfrom3(struct video_blitter3 *__restrict ctx) {
245256
drv->bsw3_stretch = &libvideo_swblitter3__stretch__blend1_n;
246257
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__blend1_n;
247258
}
259+
} else if (GFX_BLENDMODE_GET_MODE(wrdst_gfx->vx_blend) == GFX_BLENDMODE_ALPHA &&
260+
GFX_BLENDMODE_GET_MODE(rddst_gfx->vx_blend) == GFX_BLENDMODE_ALPHAMASK &&
261+
rddst_gfx->vx_buffer->vb_format.vf_codec->vc_codec == VIDEO_CODEC_A1_MSB) {
262+
/* Special optimization for bitmasked alpha-blending.
263+
* In this mode, only pixels masked by the given bitmask get blended
264+
* into the `wrdst_gfx' GFX, with all other pixels being left as-is. */
265+
if (video_format_hasalpha(&src_gfx->vx_buffer->vb_format)) {
266+
/* With the source GFX featuring an alpha-channel, regular
267+
* alpha-blending still needs to happen in `wrdst_gfx'
268+
* (though only for pixels specified by the mask). */
269+
drv->bsw3_blit = &libvideo_swblitter3__blit__mask1msb;
270+
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__mask1msb;
271+
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
272+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_l;
273+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_l;
274+
} else {
275+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_n;
276+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_n;
277+
}
278+
} else {
279+
/* Since the source has no alpha, it always produces colors with A=255.
280+
* As such, the alpha-blending that happens in `wrdst_gfx' would never
281+
* consider data from existing pixels, meaning blending can be skipped. */
282+
if (src_gfx->vx_buffer->vb_format.vf_codec == wrdst_gfx->vx_buffer->vb_format.vf_codec &&
283+
src_gfx->vx_buffer->vb_format.vf_pal == wrdst_gfx->vx_buffer->vb_format.vf_pal) {
284+
/* Same-codec+pal -> don't have to convert between pixel formats */
285+
drv->bsw3_blit = &libvideo_swblitter3__blit__mask1msb_blend1_samefmt;
286+
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__mask1msb_blend1_samefmt;
287+
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
288+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_blend1_samefmt_l;
289+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_samefmt_l;
290+
} else {
291+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_blend1_samefmt_n;
292+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_samefmt_n;
293+
}
294+
} else {
295+
/* Different formats -> pixel format conversion still has to happen */
296+
video_converter_init(libvideo_swblitter3_generic__conv(ctx),
297+
&src_gfx->vx_buffer->vb_format,
298+
&wrdst_gfx->vx_buffer->vb_format);
299+
drv->bsw3_blit = &libvideo_swblitter3__blit__mask1msb_blend1_difffmt;
300+
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__mask1msb_blend1_difffmt;
301+
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
302+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_blend1_difffmt_l;
303+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_difffmt_l;
304+
} else {
305+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__mask1msb_blend1_difffmt_n;
306+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_difffmt_n;
307+
}
308+
}
309+
}
248310
} else {
311+
set_generic_operators:
249312
drv->bsw3_blit = &libvideo_swblitter3__blit__generic;
250313
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__generic;
251314
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {

kos/src/libvideo/gfx/swgfx.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,12 +537,25 @@ struct blt3_swdrv {
537537
video_coord_t src_x, video_coord_t src_y,
538538
video_dim_t src_size_x, video_dim_t src_size_y,
539539
video_imatrix2d_t src_matrix);
540+
541+
/* Video format converter (used for quickly converting pixel formats under noblend)
542+
* [valid_if(bsw_blit == &libvideo_swblitter_noblend_difffmtblit ||
543+
* bsw_stretch == &libvideo_swblitter_noblend_difffmtstretch_l ||
544+
* bsw_stretch == &libvideo_swblitter_noblend_difffmtstretch_n ||
545+
* bsw_blit_imatrix == &libvideo_swblitter_noblend_difffmtblit_imatrix ||
546+
* bsw_stretch_imatrix == &libvideo_swblitter_noblend_difffmtstretch_imatrix_l ||
547+
* bsw_stretch_imatrix == &libvideo_swblitter_noblend_difffmtstretch_imatrix_n)] */
548+
struct video_converter bsw3_conv;
540549
};
541550

542551
#define video_swblitter3_getdrv(self) \
543552
((struct blt3_swdrv *)(self)->_vbt3_driver)
544553
#define video_swblitter3_getcdrv(self) \
545554
((struct blt3_swdrv const *)(self)->_vbt3_driver)
555+
#define libvideo_swblitter3_generic__conv(self) \
556+
(&video_swblitter3_getdrv(self)->bsw3_conv)
557+
#define libvideo_swblitter3_generic__cconv(self) \
558+
(&video_swblitter3_getcdrv(self)->bsw3_conv)
546559

547560
/* Video BLIT internal API wrappers */
548561
#define _video_swblitter3_x_blit(self, out_x, out_y, dst_x, dst_y, src_x, src_y, size_x, size_y) \
@@ -847,6 +860,28 @@ INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__blend1_n(struct video_bl
847860
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit_imatrix__blend1(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y, video_imatrix2d_t src_matrix);
848861
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__blend1_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
849862
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__blend1_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
863+
/* Same as versions above, but `vbt3_rddst' is a 1bpp-msb
864+
* bitmask specifying which pixels to write in `vbt3_wrdst'
865+
* - The *_blend1* version then specifies that no further blending is done by `vbt3_wrdst'
866+
* - The *_samefmt* version then specifies that `vbt3_wrdst' and `vbt3_src' use the same codec */
867+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit__mask1msb(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y);
868+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
869+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
870+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit_imatrix__mask1msb(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y, video_imatrix2d_t src_matrix);
871+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
872+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
873+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit__mask1msb_blend1_samefmt(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y);
874+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_blend1_samefmt_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
875+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_blend1_samefmt_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
876+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit_imatrix__mask1msb_blend1_samefmt(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y, video_imatrix2d_t src_matrix);
877+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_samefmt_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
878+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_samefmt_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
879+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit__mask1msb_blend1_difffmt(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y);
880+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_blend1_difffmt_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
881+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__mask1msb_blend1_difffmt_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
882+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit_imatrix__mask1msb_blend1_difffmt(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y, video_imatrix2d_t src_matrix);
883+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_difffmt_l(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
884+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__mask1msb_blend1_difffmt_n(struct video_blitter3 const *__restrict self, video_coord_t out_x, video_coord_t out_y, video_coord_t dst_x, video_coord_t dst_y, video_dim_t dst_size_x, video_dim_t dst_size_y, video_imatrix2d_t dst_matrix, video_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y, video_imatrix2d_t src_matrix);
850885

851886
/* Generic blit3 operators (hl) */
852887
INTDEF ATTR_IN(1) void CC libvideo_swblitter3_blit(struct video_blitter3 const *__restrict self, video_offset_t wrdst_x, video_offset_t wrdst_y, video_offset_t rddst_x, video_offset_t rddst_y, video_offset_t src_x, video_offset_t src_y, video_dim_t size_x, video_dim_t size_y);

0 commit comments

Comments
 (0)