19f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/**********************************************************
29f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Copyright 2009-2011 VMware, Inc. All rights reserved.
39f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
49f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Permission is hereby granted, free of charge, to any person
59f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * obtaining a copy of this software and associated documentation
69f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * files (the "Software"), to deal in the Software without
79f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * restriction, including without limitation the rights to use, copy,
89f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * modify, merge, publish, distribute, sublicense, and/or sell copies
99f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * of the Software, and to permit persons to whom the Software is
109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * furnished to do so, subject to the following conditions:
119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * The above copyright notice and this permission notice shall be
139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * included in all copies or substantial portions of the Software.
149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SOFTWARE.
239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *********************************************************
259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Authors:
269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Zack Rusin <zackr-at-vmware-dot-com>
279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Thomas Hellstrom <thellstrom-at-vmware-dot-com>
289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "xa_context.h"
319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "xa_priv.h"
329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_inlines.h"
339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_sampler.h"
349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_surface.h"
359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "cso_cache/cso_context.h"
369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_yuv_bind_blend_state(struct xa_context *r)
399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_blend_state blend;
419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&blend, 0, sizeof(struct pipe_blend_state));
439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].blend_enable = 0;
449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].colormask = PIPE_MASK_RGBA;
459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* porter&duff src */
479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_blend(r->cso, &blend);
539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_yuv_bind_shaders(struct xa_context *r)
579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned vs_traits = 0, fs_traits = 0;
599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct xa_shader shader;
609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vs_traits |= VS_YUV;
629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fs_traits |= FS_YUV;
639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    shader = xa_shaders_get(r->shaders, vs_traits, fs_traits);
659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_vertex_shader_handle(r->cso, shader.vs);
669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_fragment_shader_handle(r->cso, shader.fs);
679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_yuv_bind_samplers(struct xa_context *r, struct xa_surface *yuv[])
719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_sampler_state *samplers[3];
739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_sampler_state sampler;
749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_sampler_view view_templ;
759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned int i;
769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&sampler, 0, sizeof(struct pipe_sampler_state));
789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.wrap_s = PIPE_TEX_WRAP_CLAMP;
809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.wrap_t = PIPE_TEX_WRAP_CLAMP;
819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR;
829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sampler.normalized_coords = 1;
859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    for (i = 0; i < 3; ++i) {
879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	samplers[i] = &sampler;
885ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom	u_sampler_view_default_template(&view_templ, yuv[i]->tex,
895ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom					yuv[i]->tex->format);
909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
915ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom	r->bound_sampler_views[i] =
925ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom	    r->pipe->create_sampler_view(r->pipe, yuv[i]->tex, &view_templ);
935ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    }
945ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    r->num_bound_samplers = 3;
95459dd568979a5745d84f8fd2bdff38242ee3c16fBrian Paul    cso_set_samplers(r->cso, PIPE_SHADER_FRAGMENT, 3, (const struct pipe_sampler_state **)samplers);
96459dd568979a5745d84f8fd2bdff38242ee3c16fBrian Paul    cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, 3, r->bound_sampler_views);
979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
1009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_yuv_fs_constants(struct xa_context *r, const float conversion_matrix[])
1019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
102340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom    const int param_bytes = 16 * sizeof(float);
1039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    renderer_set_constants(r, PIPE_SHADER_FRAGMENT,
1059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			   conversion_matrix, param_bytes);
1069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1084d04367eca66a85e26f7c0f5d6392823d13880f6Thomas HellstromXA_EXPORT int
1099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_yuv_planar_blit(struct xa_context *r,
1109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int src_x,
1119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int src_y,
1129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int src_w,
1139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int src_h,
1149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int dst_x,
1159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int dst_y,
1169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int dst_w,
1179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   int dst_h,
1189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   struct xa_box *box,
1199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   unsigned int num_boxes,
1209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   const float conversion_matrix[],
1219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		   struct xa_surface *dst, struct xa_surface *yuv[])
1229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float scale_x;
1249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float scale_y;
1255ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    int ret;
1269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (dst_w == 0 || dst_h == 0)
1289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return XA_ERR_NONE;
1299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1305ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    ret = xa_ctx_srf_create(r, dst);
1315ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    if (ret != XA_ERR_NONE)
1329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return -XA_ERR_NORES;
1339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1345ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    renderer_bind_destination(r, r->srf, r->srf->width, r->srf->height);
1359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    xa_yuv_bind_blend_state(r);
1369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    xa_yuv_bind_shaders(r);
1379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    xa_yuv_bind_samplers(r, yuv);
1389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    xa_yuv_fs_constants(r, conversion_matrix);
1399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    scale_x = (float)src_w / (float)dst_w;
1419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    scale_y = (float)src_h / (float)dst_h;
1429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    while (num_boxes--) {
1449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	int x = box->x1;
1459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	int y = box->y1;
1469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	int w = box->x2 - box->x1;
1479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	int h = box->y2 - box->y1;
1489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	renderer_draw_yuv(r,
1509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			  (float)src_x + scale_x * (x - dst_x),
1519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			  (float)src_y + scale_y * (y - dst_y),
1529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			  scale_x * w, scale_y * h, x, y, w, h, yuv);
153a18ffcd40d172835b30ef46d8547755e4d91bbe2Thomas	box++;
1549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
1559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->pipe->flush(r->pipe, &r->last_fence);
1579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1585ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    xa_ctx_sampler_views_destroy(r);
1595ec01ba7e85c41fce53ee5c2c3b53036923a0924Thomas Hellstrom    xa_ctx_srf_destroy(r);
1609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return XA_ERR_NONE;
1629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
163