boolean xorg_composite_bind_state(struct exa_context *exa, int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, struct exa_pixmap_priv *pSrc, struct exa_pixmap_priv *pMask, struct exa_pixmap_priv *pDst) { struct pipe_surface *dst_surf = xorg_gpu_surface(exa->pipe, pDst); renderer_bind_destination(exa->renderer, dst_surf, pDst->width, pDst->height); bind_blend_state(exa, op, pSrcPicture, pMaskPicture, pDstPicture); bind_shaders(exa, op, pSrcPicture, pMaskPicture, pDstPicture, pSrc, pMask); bind_samplers(exa, op, pSrcPicture, pMaskPicture, pDstPicture, pSrc, pMask, pDst); setup_transforms(exa, pSrcPicture, pMaskPicture); if (exa->num_bound_samplers == 0 ) { /* solid fill */ renderer_begin_solid(exa->renderer); } else { renderer_begin_textures(exa->renderer, exa->num_bound_samplers); } pipe_surface_reference(&dst_surf, NULL); return TRUE; }
XA_EXPORT int xa_composite_prepare(struct xa_context *ctx, const struct xa_composite *comp) { struct xa_surface *dst_srf = comp->dst->srf; int ret; ret = xa_ctx_srf_create(ctx, dst_srf); if (ret != XA_ERR_NONE) return ret; ctx->dst = dst_srf; renderer_bind_destination(ctx, ctx->srf, ctx->srf->width, ctx->srf->height); ret = bind_composite_blend_state(ctx, comp); if (ret != XA_ERR_NONE) return ret; ret = bind_shaders(ctx, comp); if (ret != XA_ERR_NONE) return ret; bind_samplers(ctx, comp); if (ctx->num_bound_samplers == 0 ) { /* solid fill */ renderer_begin_solid(ctx); } else { renderer_begin_textures(ctx); ctx->comp = comp; } xa_ctx_srf_destroy(ctx); return XA_ERR_NONE; }
void renderer_copy_prepare(struct xorg_renderer *r, struct pipe_surface *dst_surface, struct pipe_texture *src_texture) { struct pipe_context *pipe = r->pipe; struct pipe_screen *screen = pipe->screen; struct xorg_shader shader; assert(screen->is_format_supported(screen, dst_surface->format, PIPE_TEXTURE_2D, PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)); /* set misc state we care about */ { struct pipe_blend_state blend; memset(&blend, 0, sizeof(blend)); blend.rgb_src_factor = PIPE_BLENDFACTOR_ONE; blend.alpha_src_factor = PIPE_BLENDFACTOR_ONE; blend.rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; blend.alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; blend.colormask = PIPE_MASK_RGBA; cso_set_blend(r->cso, &blend); } /* sampler */ { struct pipe_sampler_state sampler; memset(&sampler, 0, sizeof(sampler)); sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; sampler.normalized_coords = 1; cso_single_sampler(r->cso, 0, &sampler); cso_single_sampler_done(r->cso); } renderer_bind_destination(r, dst_surface, dst_surface->width, dst_surface->height); /* texture */ cso_set_sampler_textures(r->cso, 1, &src_texture); /* shaders */ shader = xorg_shaders_get(r->shaders, VS_COMPOSITE, FS_COMPOSITE); cso_set_vertex_shader_handle(r->cso, shader.vs); cso_set_fragment_shader_handle(r->cso, shader.fs); r->buffer_size = 0; r->attrs_per_vertex = 2; }
extern int xa_yuv_planar_blit(struct xa_context *r, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, struct xa_box *box, unsigned int num_boxes, const float conversion_matrix[], struct xa_surface *dst, struct xa_surface *yuv[]) { float scale_x; float scale_y; struct pipe_surface srf_templ; if (dst_w == 0 || dst_h == 0) return XA_ERR_NONE; memset(&srf_templ, 0, sizeof(srf_templ)); u_surface_default_template(&srf_templ, dst->tex, PIPE_BIND_RENDER_TARGET); dst->srf = r->pipe->create_surface(r->pipe, dst->tex, &srf_templ); if (!dst->srf) return -XA_ERR_NORES; renderer_bind_destination(r, dst->srf, dst->srf->width, dst->srf->height); xa_yuv_bind_blend_state(r); xa_yuv_bind_shaders(r); xa_yuv_bind_samplers(r, yuv); xa_yuv_fs_constants(r, conversion_matrix); scale_x = (float)src_w / (float)dst_w; scale_y = (float)src_h / (float)dst_h; while (num_boxes--) { int x = box->x1; int y = box->y1; int w = box->x2 - box->x1; int h = box->y2 - box->y1; renderer_draw_yuv(r, (float)src_x + scale_x * (x - dst_x), (float)src_y + scale_y * (y - dst_y), scale_x * w, scale_y * h, x, y, w, h, yuv); box++; } r->pipe->flush(r->pipe, &r->last_fence); xa_yuv_destroy_sampler_views(yuv); pipe_surface_reference(&dst->srf, NULL); 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; }
boolean xorg_solid_bind_state(struct exa_context *exa, struct exa_pixmap_priv *pixmap, Pixel fg) { struct pipe_surface *dst_surf = xorg_gpu_surface(exa->pipe, pixmap); unsigned vs_traits, fs_traits; struct xorg_shader shader; pixel_to_float4(fg, exa->solid_color, pixmap->tex->format); exa->has_solid_color = TRUE; #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(exa->renderer, dst_surf, pixmap->width, pixmap->height); bind_blend_state(exa, PictOpSrc, NULL, NULL, NULL); cso_set_samplers(exa->renderer->cso, PIPE_SHADER_FRAGMENT, 0, NULL); cso_set_sampler_views(exa->renderer->cso, PIPE_SHADER_FRAGMENT, 0, NULL); shader = xorg_shaders_get(exa->renderer->shaders, vs_traits, fs_traits); cso_set_vertex_shader_handle(exa->renderer->cso, shader.vs); cso_set_fragment_shader_handle(exa->renderer->cso, shader.fs); renderer_begin_solid(exa->renderer); pipe_surface_reference(&dst_surf, NULL); return TRUE; }
void renderer_copy_prepare(struct xa_context *r, struct pipe_surface *dst_surface, struct pipe_resource *src_texture, const enum xa_formats src_xa_format, const enum xa_formats dst_xa_format) { struct pipe_context *pipe = r->pipe; struct pipe_screen *screen = pipe->screen; struct xa_shader shader; uint32_t fs_traits = FS_COMPOSITE; assert(screen->is_format_supported(screen, dst_surface->format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET)); (void)screen; /* set misc state we care about */ { struct pipe_blend_state blend; memset(&blend, 0, sizeof(blend)); blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; blend.rt[0].colormask = PIPE_MASK_RGBA; cso_set_blend(r->cso, &blend); } /* sampler */ { struct pipe_sampler_state sampler; memset(&sampler, 0, sizeof(sampler)); sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; sampler.normalized_coords = 1; cso_single_sampler(r->cso, 0, &sampler); cso_single_sampler_done(r->cso); } renderer_bind_destination(r, dst_surface, dst_surface->width, dst_surface->height); /* texture/sampler view */ { struct pipe_sampler_view templ; struct pipe_sampler_view *src_view; u_sampler_view_default_template(&templ, src_texture, src_texture->format); src_view = pipe->create_sampler_view(pipe, src_texture, &templ); cso_set_fragment_sampler_views(r->cso, 1, &src_view); pipe_sampler_view_reference(&src_view, NULL); } /* shaders */ if (src_texture->format == PIPE_FORMAT_L8_UNORM) fs_traits |= FS_SRC_LUMINANCE; if (dst_surface->format == PIPE_FORMAT_L8_UNORM) fs_traits |= FS_DST_LUMINANCE; if (xa_format_a(dst_xa_format) != 0 && xa_format_a(src_xa_format) == 0) fs_traits |= FS_SRC_SET_ALPHA; shader = xa_shaders_get(r->shaders, VS_COMPOSITE, fs_traits); cso_set_vertex_shader_handle(r->cso, shader.vs); cso_set_fragment_shader_handle(r->cso, shader.fs); r->buffer_size = 0; r->attrs_per_vertex = 2; }