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