static int bind_shaders(struct xa_context *ctx, const struct xa_composite *comp) { unsigned vs_traits = 0, fs_traits = 0; struct xa_shader shader; struct xa_picture *src_pic = comp->src; struct xa_picture *mask_pic = comp->mask; ctx->has_solid_color = FALSE; if (src_pic) { if (src_pic->wrap == xa_wrap_clamp_to_border && src_pic->has_transform) fs_traits |= FS_SRC_REPEAT_NONE; if (src_pic->src_pict) { if (src_pic->src_pict->type == xa_src_pict_solid_fill) { fs_traits |= FS_SOLID_FILL | FS_FILL; vs_traits |= VS_SOLID_FILL; xa_pixel_to_float4(src_pic->src_pict->solid_fill.color, ctx->solid_color); ctx->has_solid_color = TRUE; } } else { fs_traits |= FS_COMPOSITE; vs_traits |= VS_COMPOSITE; } fs_traits |= picture_format_fixups(src_pic, 0); } if (mask_pic) { vs_traits |= VS_MASK; fs_traits |= FS_MASK; if (mask_pic->wrap == xa_wrap_clamp_to_border && mask_pic->has_transform) fs_traits |= FS_MASK_REPEAT_NONE; if (mask_pic->component_alpha) { struct xa_composite_blend blend; if (!blend_for_op(&blend, comp->op, src_pic, mask_pic, NULL)) return -XA_ERR_INVAL; if (blend.alpha_src) { fs_traits |= FS_CA_SRCALPHA; } else fs_traits |= FS_CA_FULL; } fs_traits |= picture_format_fixups(mask_pic, 1); } if (ctx->srf->format == PIPE_FORMAT_L8_UNORM) fs_traits |= FS_DST_LUMINANCE; shader = xa_shaders_get(ctx->shaders, vs_traits, fs_traits); cso_set_vertex_shader_handle(ctx->cso, shader.vs); cso_set_fragment_shader_handle(ctx->cso, shader.fs); return XA_ERR_NONE; }
XA_EXPORT int xa_solid_prepare(struct xa_context *ctx, struct xa_surface *dst, uint32_t fg) { unsigned vs_traits, fs_traits; struct xa_shader shader; int width, height; int ret; ret = xa_ctx_srf_create(ctx, dst); if (ret != XA_ERR_NONE) return ret; if (ctx->srf->format == PIPE_FORMAT_L8_UNORM) xa_pixel_to_float4_a8(fg, ctx->solid_color); else xa_pixel_to_float4(fg, ctx->solid_color); ctx->has_solid_color = 1; ctx->dst = dst; width = ctx->srf->width; height = ctx->srf->height; #if 0 debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n", (fg >> 24) & 0xff, (fg >> 16) & 0xff, (fg >> 8) & 0xff, (fg >> 0) & 0xff, exa->solid_color[0], exa->solid_color[1], exa->solid_color[2], exa->solid_color[3]); #endif vs_traits = VS_SOLID_FILL; fs_traits = FS_SOLID_FILL; renderer_bind_destination(ctx, ctx->srf, width, height); bind_solid_blend_state(ctx); cso_set_samplers(ctx->cso, PIPE_SHADER_FRAGMENT, 0, NULL); cso_set_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT, 0, NULL); shader = xa_shaders_get(ctx->shaders, vs_traits, fs_traits); cso_set_vertex_shader_handle(ctx->cso, shader.vs); cso_set_fragment_shader_handle(ctx->cso, shader.fs); renderer_begin_solid(ctx); xa_ctx_srf_destroy(ctx); return XA_ERR_NONE; }