1872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh/************************************************************************** 2872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * 3872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * Copyright 2016 Nayan Deshmukh. 4872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * All Rights Reserved. 5872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * 6872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * Permission is hereby granted, free of charge, to any person obtaining a 7872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * copy of this software and associated documentation files (the 8872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * "Software"), to deal in the Software without restriction, including 9872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * without limitation the rights to use, copy, modify, merge, publish, 10872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * distribute, sub license, and/or sell copies of the Software, and to 11872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * permit persons to whom the Software is furnished to do so, subject to 12872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * the following conditions: 13872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * 14872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * The above copyright notice and this permission notice (including the 15872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * next paragraph) shall be included in all copies or substantial portions 16872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * of the Software. 17872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * 18872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * 26872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh **************************************************************************/ 27872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 28872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include <stdio.h> 29872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 30872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "pipe/p_context.h" 31872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 32872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "tgsi/tgsi_ureg.h" 33872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 34872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "util/u_draw.h" 35872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "util/u_memory.h" 36872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "util/u_math.h" 37872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "util/u_rect.h" 38872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 39872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "vl_types.h" 40872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "vl_vertex_buffers.h" 41872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh#include "vl_bicubic_filter.h" 42872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 43872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhenum VS_OUTPUT 44872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 45872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh VS_O_VPOS = 0, 46872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh VS_O_VTEX = 0 47872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh}; 48872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 49872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhstatic void * 50872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhcreate_vert_shader(struct vl_bicubic_filter *filter) 51872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 52872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_program *shader; 53872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src i_vpos; 54872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst o_vpos, o_vtex; 55872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 56872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh shader = ureg_create(PIPE_SHADER_VERTEX); 57872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!shader) 58872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return NULL; 59872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 60872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh i_vpos = ureg_DECL_vs_input(shader, 0); 61872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); 62872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh o_vtex = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX); 63872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 64872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MOV(shader, o_vpos, i_vpos); 65872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MOV(shader, o_vtex, i_vpos); 66872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 67872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_END(shader); 68872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 69872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return ureg_create_shader_and_destroy(shader, filter->pipe); 70872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 71872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 72872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhstatic void 73872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhcreate_frag_shader_cubic_interpolater(struct ureg_program *shader, struct ureg_src tex_a, 74872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src tex_b, struct ureg_src tex_c, 75872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src tex_d, struct ureg_src t, 76872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst o_fragment) 77872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 78872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst temp[11]; 79872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst t_2; 80872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh unsigned i; 81872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 82872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for(i = 0; i < 11; ++i) 83872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh temp[i] = ureg_DECL_temporary(shader); 84872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh t_2 = ureg_DECL_temporary(shader); 85872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 86872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh /* 87872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[0]| | 0 2 0 0 | |tex_a| 88872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[1]| = | -1 0 1 0 |* |tex_b| 89872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[2]| | 2 -5 4 -1 | |tex_c| 90872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[3]| | -1 3 -3 1 | |tex_d| 91872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh */ 92872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[0], tex_b, ureg_imm1f(shader, 2.0f)); 93872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 94872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[1], tex_a, ureg_imm1f(shader, -1.0f)); 95872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[1], tex_c, ureg_imm1f(shader, 1.0f), 96872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[1])); 97872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 98872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[2], tex_a, ureg_imm1f(shader, 2.0f)); 99872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[2], tex_b, ureg_imm1f(shader, -5.0f), 100872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[2])); 101872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[2], tex_c, ureg_imm1f(shader, 4.0f), 102872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[2])); 103872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[2], tex_d, ureg_imm1f(shader, -1.0f), 104872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[2])); 105872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 106872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[3], tex_a, ureg_imm1f(shader, -1.0f)); 107872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[3], tex_b, ureg_imm1f(shader, 3.0f), 108872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[3])); 109872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[3], tex_c, ureg_imm1f(shader, -3.0f), 110872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[3])); 111872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MAD(shader, temp[3], tex_d, ureg_imm1f(shader, 1.0f), 112872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[3])); 113872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 114872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh /* 115872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * t_2 = t*t 116872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * o_fragment = 0.5*|1 t t^2 t^3|*|temp[0]| 117872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[1]| 118872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[2]| 119872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * |temp[3]| 120872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh */ 121872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 122872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, t_2, t, t); 123872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[4], ureg_src(t_2), t); 124872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 125872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[4], ureg_src(temp[4]), 126872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[3])); 127872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[5], ureg_src(t_2), 128872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[2])); 129872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[6], t, 130872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[1])); 131872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, temp[7], ureg_imm1f(shader, 1.0f), 132872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[0])); 133872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_ADD(shader, temp[8], ureg_src(temp[4]), 134872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[5])); 135872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_ADD(shader, temp[9], ureg_src(temp[6]), 136872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[7])); 137872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 138872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_ADD(shader, temp[10], ureg_src(temp[8]), 139872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(temp[9])); 140872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, o_fragment, ureg_src(temp[10]), 141872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_imm1f(shader, 0.5f)); 142872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 143872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 144872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for(i = 0; i < 11; ++i) 145872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_release_temporary(shader, temp[i]); 146872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_release_temporary(shader, t_2); 147872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 148872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 149872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhstatic void * 150872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhcreate_frag_shader(struct vl_bicubic_filter *filter, unsigned video_width, 151872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh unsigned video_height, struct vertex2f *offsets) 152872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 153872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_screen *screen = filter->pipe->screen; 154872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_program *shader; 155872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src i_vtex, vtex; 156872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src sampler; 157872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_src half_pixel; 158872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst t_array[23]; 159872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst o_fragment; 160872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct ureg_dst t; 161872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh unsigned i; 162872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 163872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (screen->get_shader_param( 164872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_TEMPS) < 23) { 165872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 166872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return NULL; 167872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 168872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 169872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh shader = ureg_create(PIPE_SHADER_FRAGMENT); 170872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!shader) { 171872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return NULL; 172872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 173872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 174872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh i_vtex = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); 175872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler = ureg_DECL_sampler(shader, 0); 176872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 177872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for (i = 0; i < 23; ++i) 178872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh t_array[i] = ureg_DECL_temporary(shader); 179872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh t = ureg_DECL_temporary(shader); 180872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 181872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh half_pixel = ureg_DECL_constant(shader, 0); 182872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 183872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 184872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh /* 185872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * temp = (i_vtex - (0.5/dst_size)) * i_size) 186872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * t = frac(temp) 187872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * vtex = floor(i_vtex)/i_size 188872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh */ 189d995115b1733ec14182e6bb4653b8f8389b87518Marek Olšák ureg_ADD(shader, ureg_writemask(t_array[21], TGSI_WRITEMASK_XY), 190d995115b1733ec14182e6bb4653b8f8389b87518Marek Olšák i_vtex, ureg_negate(half_pixel)); 191872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MUL(shader, ureg_writemask(t_array[22], TGSI_WRITEMASK_XY), 192872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[21]), ureg_imm2f(shader, video_width, video_height)); 193872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_FRC(shader, ureg_writemask(t, TGSI_WRITEMASK_XY), 194872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[22])); 195872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 196872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_FLR(shader, ureg_writemask(t_array[22], TGSI_WRITEMASK_XY), 197872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[22])); 198872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_DIV(shader, ureg_writemask(t_array[22], TGSI_WRITEMASK_XY), 199872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[22]), ureg_imm2f(shader, video_width, video_height)); 200af18a047557944abb91dc409c5a32e6b2911d132Nayan Deshmukh ureg_ADD(shader, ureg_writemask(t_array[22], TGSI_WRITEMASK_XY), 201af18a047557944abb91dc409c5a32e6b2911d132Nayan Deshmukh ureg_src(t_array[22]), half_pixel); 202872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 203872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh /* 204872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * t_array[0..*] = vtex + offset[0..*] 205872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * t_array[0..*] = tex(t_array[0..*], sampler) 206872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * t_array[16+i] = cubic_interpolate(t_array[4*i..4*i+3], t_x) 207872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh * o_fragment = cubic_interpolate(t_array[16..19], t_y) 208872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh */ 209872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh vtex = ureg_src(t_array[22]); 210872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for (i = 0; i < 16; ++i) { 211872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_ADD(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_XY), 212872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh vtex, ureg_imm2f(shader, offsets[i].x, offsets[i].y)); 213872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_MOV(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_ZW), 214872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_imm1f(shader, 0.0f)); 215872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 216872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 217872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for (i = 0; i < 16; ++i) { 218872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, ureg_src(t_array[i]), sampler); 219872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 220872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 221872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for(i = 0; i < 4; ++i) 222872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh create_frag_shader_cubic_interpolater(shader, ureg_src(t_array[4*i]), 223872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[4*i+1]), ureg_src(t_array[4*i+2]), ureg_src(t_array[4*i+3]), 224872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_scalar(ureg_src(t), TGSI_SWIZZLE_X), t_array[16+i]); 225872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 226872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh create_frag_shader_cubic_interpolater(shader, ureg_src(t_array[16]), 227872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_src(t_array[17]), ureg_src(t_array[18]), ureg_src(t_array[19]), 228872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_scalar(ureg_src(t), TGSI_SWIZZLE_Y), o_fragment); 229872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 230872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for(i = 0; i < 23; ++i) 231872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_release_temporary(shader, t_array[i]); 232872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_release_temporary(shader, t); 233872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 234872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ureg_END(shader); 235872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 236872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return ureg_create_shader_and_destroy(shader, filter->pipe); 237872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 238872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 239872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhbool 240872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhvl_bicubic_filter_init(struct vl_bicubic_filter *filter, struct pipe_context *pipe, 241872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh unsigned width, unsigned height) 242872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 243872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_rasterizer_state rs_state; 244872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_blend_state blend; 2458ba46fbd9ec7a1214882bcfd3de1835a6237b6d1Eric Engestrom struct vertex2f offsets[16]; 246872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_sampler_state sampler; 247872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_vertex_element ve; 248872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh unsigned i; 249872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 250872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh assert(filter && pipe); 251872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh assert(width && height); 252872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 253872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(filter, 0, sizeof(*filter)); 254872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe = pipe; 255872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 256872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&rs_state, 0, sizeof(rs_state)); 257872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh rs_state.half_pixel_center = true; 258872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh rs_state.bottom_edge_rule = true; 259872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh rs_state.depth_clip = 1; 260872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 261872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->rs_state) 262872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_rs_state; 263872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 264872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&blend, 0, sizeof blend); 265872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].rgb_func = PIPE_BLEND_ADD; 266872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 267872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; 268872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].alpha_func = PIPE_BLEND_ADD; 269872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 270872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; 271872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.logicop_func = PIPE_LOGICOP_CLEAR; 272872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh blend.rt[0].colormask = PIPE_MASK_RGBA; 273872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->blend = pipe->create_blend_state(pipe, &blend); 274872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->blend) 275872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_blend; 276872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 277872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&sampler, 0, sizeof(sampler)); 278872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 279872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 280872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 281872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 282872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 283872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 284872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.compare_mode = PIPE_TEX_COMPARE_NONE; 285872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.compare_func = PIPE_FUNC_ALWAYS; 286872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh sampler.normalized_coords = 1; 287872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->sampler = pipe->create_sampler_state(pipe, &sampler); 288872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->sampler) 289872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_sampler; 290872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 291872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->quad = vl_vb_upload_quads(pipe); 292872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if(!filter->quad.buffer) 293872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_quad; 294872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 295872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&ve, 0, sizeof(ve)); 296872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ve.src_offset = 0; 297872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ve.instance_divisor = 0; 298872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ve.vertex_buffer_index = 0; 299872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ve.src_format = PIPE_FORMAT_R32G32_FLOAT; 300872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->ves = pipe->create_vertex_elements_state(pipe, 1, &ve); 301872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->ves) 302872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_ves; 303872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 304872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[0].x = -1.0f; offsets[0].y = -1.0f; 305872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[1].x = 0.0f; offsets[1].y = -1.0f; 306872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[2].x = 1.0f; offsets[2].y = -1.0f; 307872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[3].x = 2.0f; offsets[3].y = -1.0f; 308872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 309872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[4].x = -1.0f; offsets[4].y = 0.0f; 310872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[5].x = 0.0f; offsets[5].y = 0.0f; 311872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[6].x = 1.0f; offsets[6].y = 0.0f; 312872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[7].x = 2.0f; offsets[7].y = 0.0f; 313872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 314872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[8].x = -1.0f; offsets[8].y = 1.0f; 315872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[9].x = 0.0f; offsets[9].y = 1.0f; 316872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[10].x = 1.0f; offsets[10].y = 1.0f; 317872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[11].x = 2.0f; offsets[11].y = 1.0f; 318872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 319872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[12].x = -1.0f; offsets[12].y = 2.0f; 320872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[13].x = 0.0f; offsets[13].y = 2.0f; 321872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[14].x = 1.0f; offsets[14].y = 2.0f; 322872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[15].x = 2.0f; offsets[15].y = 2.0f; 323872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 324872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh for (i = 0; i < 16; ++i) { 325872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[i].x /= width; 326872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh offsets[i].y /= height; 327872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 328872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 329872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->vs = create_vert_shader(filter); 330872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->vs) 331872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_vs; 332872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 333872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->fs = create_frag_shader(filter, width, height, offsets); 334872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (!filter->fs) 335872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh goto error_fs; 336872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 337872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return true; 338872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 339872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_fs: 340872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe->delete_vs_state(pipe, filter->vs); 341872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 342872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_vs: 343872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe->delete_vertex_elements_state(pipe, filter->ves); 344872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 345872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_ves: 346872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe_resource_reference(&filter->quad.buffer, NULL); 347872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 348872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_quad: 349872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe->delete_sampler_state(pipe, filter->sampler); 350872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 351872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_sampler: 352872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe->delete_blend_state(pipe, filter->blend); 353872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 354872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_blend: 355872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe->delete_rasterizer_state(pipe, filter->rs_state); 356872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 357872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukherror_rs_state: 358872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh return false; 359872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 360872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 361872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhvoid 362872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhvl_bicubic_filter_cleanup(struct vl_bicubic_filter *filter) 363872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 364872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh assert(filter); 365872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 366872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_sampler_state(filter->pipe, filter->sampler); 367872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_blend_state(filter->pipe, filter->blend); 368872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_rasterizer_state(filter->pipe, filter->rs_state); 369872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_vertex_elements_state(filter->pipe, filter->ves); 370872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe_resource_reference(&filter->quad.buffer, NULL); 371872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 372872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_vs_state(filter->pipe, filter->vs); 373872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->delete_fs_state(filter->pipe, filter->fs); 374872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 375872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 376872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhvoid 377872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukhvl_bicubic_filter_render(struct vl_bicubic_filter *filter, 378872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_sampler_view *src, 379872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_surface *dst, 380872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct u_rect *dst_area, 381872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct u_rect *dst_clip) 382872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh{ 383872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_viewport_state viewport; 384872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_framebuffer_state fb_state; 385872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_scissor_state scissor; 386872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh union pipe_color_union clear_color; 387872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_transfer *buf_transfer; 388872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh struct pipe_resource *surface_size; 389872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh assert(filter && src && dst); 390872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 391872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if (dst_clip) { 392872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.minx = dst_clip->x0; 393872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.miny = dst_clip->y0; 394872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.maxx = dst_clip->x1; 395872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.maxy = dst_clip->y1; 396872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } else { 397872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.minx = 0; 398872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.miny = 0; 399872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.maxx = dst->width; 400872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh scissor.maxy = dst->height; 401872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 402872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 403872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh clear_color.f[0] = clear_color.f[1] = 0.0f; 404872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh clear_color.f[2] = clear_color.f[3] = 0.0f; 405872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh surface_size = pipe_buffer_create 406872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ( 407872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->screen, 408872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh PIPE_BIND_CONSTANT_BUFFER, 409872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh PIPE_USAGE_DEFAULT, 410872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 2*sizeof(float) 411872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ); 412872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 413872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 414872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&viewport, 0, sizeof(viewport)); 415872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh if(dst_area){ 416872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.scale[0] = dst_area->x1 - dst_area->x0; 417872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.scale[1] = dst_area->y1 - dst_area->y0; 418872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.translate[0] = dst_area->x0; 419872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.translate[1] = dst_area->y0; 420872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } else { 421872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.scale[0] = dst->width; 422872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.scale[1] = dst->height; 423872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh } 424872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh viewport.scale[2] = 1; 425872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 426872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh float *ptr = pipe_buffer_map(filter->pipe, surface_size, 427872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 428872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh &buf_transfer); 429872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 430872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ptr[0] = 0.5f/viewport.scale[0]; 431872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh ptr[1] = 0.5f/viewport.scale[1]; 432872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 433872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe_buffer_unmap(filter->pipe, buf_transfer); 434872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 435872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh memset(&fb_state, 0, sizeof(fb_state)); 436872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh fb_state.width = dst->width; 437872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh fb_state.height = dst->height; 438872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh fb_state.nr_cbufs = 1; 439872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh fb_state.cbufs[0] = dst; 440872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 441872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->set_scissor_states(filter->pipe, 0, 1, &scissor); 442872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->clear_render_target(filter->pipe, dst, &clear_color, 443a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák 0, 0, dst->width, dst->height, false); 444872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh pipe_set_constant_buffer(filter->pipe, PIPE_SHADER_FRAGMENT, 0, surface_size); 445872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); 446872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_blend_state(filter->pipe, filter->blend); 447872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT, 448872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 0, 1, &filter->sampler); 449872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->set_sampler_views(filter->pipe, PIPE_SHADER_FRAGMENT, 450872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 0, 1, &src); 451872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_vs_state(filter->pipe, filter->vs); 452872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_fs_state(filter->pipe, filter->fs); 453872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); 454872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); 455872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad); 456872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); 457872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh 458872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4); 459872dd9ad154b0ef9c91486640f73232a60074292Nayan Deshmukh} 460