Skip to content

Commit 2aec439

Browse files
committed
Add single-step blend-optimized paths to blit3
1 parent 537dbfa commit 2aec439

File tree

5 files changed

+335
-73
lines changed

5 files changed

+335
-73
lines changed

kos/include/libvideo/gfx/gfx.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,11 @@ struct video_blitter {
848848

849849
/* 3-way video blitter. Meant to be used to perform a blit whilst
850850
* retaining/enforcing some sort of overlay whose dimensions match
851-
* that of the blit (write-)destination. */
851+
* that of the blit (write-)destination.
852+
*
853+
* NOTE: Only the intersection of rects in "vbt3_rddst" / "vbt3_wrdst"
854+
* actually gets blitted!
855+
*/
852856
struct video_blitter3 {
853857
struct video_blitter3_ops const *vbt3_ops; /* Blitter operators */
854858
/* WARNING: After initialization, the following fields must no longer be accessed by the user! */

kos/src/apps/showpic/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ do_showpic(struct screen_buffer *screen,
345345
#elif 1
346346
{
347347
struct video_gfx flipgfx = image_gfx;
348-
video_gfx_lrot90(&flipgfx);
348+
// video_gfx_lrot90(&flipgfx);
349349
video_gfx_setblend(&flipgfx, GFX_BLENDMODE_ALPHA_OVERRIDE(200));
350350
video_gfx_stretch3(&screen_gfx, blit_x, blit_y,
351351
&flipgfx, 0, 0,

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,16 +227,29 @@ libvideo_swgfx_blitfrom3(struct video_blitter3 *__restrict ctx) {
227227
}
228228

229229
/* TODO: Special handling when buffers overlap */
230-
/* TODO: Dedicated optimizations */
230+
/* TODO: More dedicated optimizations */
231231

232-
drv->bsw3_blit = &libvideo_swblitter3__blit__generic;
233-
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__generic;
234-
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
235-
drv->bsw3_stretch = &libvideo_swblitter3__stretch__generic_l;
236-
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__generic_l;
232+
if likely(GFX_BLENDMODE_GET_MODE(wrdst_gfx->vx_blend) == GFX_BLENDMODE_OVERRIDE) {
233+
/* Special optimization for likely case where "wrdst_gfx" doesn't do any blending */
234+
drv->bsw3_blit = &libvideo_swblitter3__blit__blend1;
235+
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__blend1;
236+
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
237+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__blend1_l;
238+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__blend1_l;
239+
} else {
240+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__blend1_n;
241+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__blend1_n;
242+
}
237243
} else {
238-
drv->bsw3_stretch = &libvideo_swblitter3__stretch__generic_n;
239-
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__generic_n;
244+
drv->bsw3_blit = &libvideo_swblitter3__blit__generic;
245+
drv->bsw3_blit_imatrix = &libvideo_swblitter3__blit_imatrix__generic;
246+
if (src_gfx->vx_flags & VIDEO_GFX_F_LINEAR) {
247+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__generic_l;
248+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__generic_l;
249+
} else {
250+
drv->bsw3_stretch = &libvideo_swblitter3__stretch__generic_n;
251+
drv->bsw3_stretch_imatrix = &libvideo_swblitter3__stretch_imatrix__generic_n;
252+
}
240253
}
241254
}
242255
return ctx;

kos/src/libvideo/gfx/swgfx.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,13 @@ INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__generic_n(struct video_b
797797
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit_imatrix__generic(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);
798798
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__generic_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);
799799
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch_imatrix__generic_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);
800+
/* Same as versions above, but `vbt3_wrdst' doesn't do any extra blending */
801+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__blit__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_coord_t src_x, video_coord_t src_y, video_dim_t size_x, video_dim_t size_y);
802+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__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_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
803+
INTDEF ATTR_IN(1) void CC libvideo_swblitter3__stretch__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_coord_t src_x, video_coord_t src_y, video_dim_t src_size_x, video_dim_t src_size_y);
804+
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);
805+
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);
806+
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);
800807

801808
/* Generic blit3 operators (hl) */
802809
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)