vl_idct.c revision 3dd7bf7d39781f3ef4c0b53732945674c9924cdf
1508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König/************************************************************************** 2508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 3508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * Copyright 2010 Christian König 4508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * All Rights Reserved. 5508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 6508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * Permission is hereby granted, free of charge, to any person obtaining a 7508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * copy of this software and associated documentation files (the 8508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * "Software"), to deal in the Software without restriction, including 9508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * without limitation the rights to use, copy, modify, merge, publish, 10508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * distribute, sub license, and/or sell copies of the Software, and to 11508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * permit persons to whom the Software is furnished to do so, subject to 12508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * the following conditions: 13508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 14508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * The above copyright notice and this permission notice (including the 15508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * next paragraph) shall be included in all copies or substantial portions 16508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * of the Software. 17508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 18508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 26508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König **************************************************************************/ 27508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 28508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include "vl_idct.h" 29e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König#include "util/u_draw.h" 30508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <assert.h> 31508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <pipe/p_context.h> 32508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <pipe/p_screen.h> 33508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <util/u_inlines.h> 34508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <util/u_sampler.h> 35508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <util/u_format.h> 36508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include <tgsi/tgsi_ureg.h> 37508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#include "vl_types.h" 38508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 39508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#define BLOCK_WIDTH 8 40508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König#define BLOCK_HEIGHT 8 41ac1fd50163119a887487d748fab507b23e215c2bChristian König 4203c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König#define SCALE_FACTOR_16_TO_9 (32768.0f / 256.0f) 43508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 44ed49905944243863913bc2598f734ca038c85b94Christian König#define STAGE1_SCALE 4.0f 45ed49905944243863913bc2598f734ca038c85b94Christian König#define STAGE2_SCALE (SCALE_FACTOR_16_TO_9 / STAGE1_SCALE) 46ed49905944243863913bc2598f734ca038c85b94Christian König 47508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstruct vertex_shader_consts 48508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 49508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct vertex4f norm; 50508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König}; 51508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 52508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königenum VS_INPUT 53508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 54508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_I_RECT, 55508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_I_VPOS, 56508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 57508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König NUM_VS_INPUTS 58508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König}; 59508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 60508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königenum VS_OUTPUT 61508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 62508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_O_VPOS, 63508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_O_BLOCK, 64508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_O_TEX, 65508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_O_START, 66508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König VS_O_STEP 67508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König}; 68508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 69e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königstatic const float const_matrix[8][8] = { 70508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.3535530f, 0.3535530f, 0.3535530f, 0.3535530f, 0.3535530f, 0.3535530f, 0.353553f, 0.3535530f }, 71508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.4903930f, 0.4157350f, 0.2777850f, 0.0975451f, -0.0975452f, -0.2777850f, -0.415735f, -0.4903930f }, 72508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.4619400f, 0.1913420f, -0.1913420f, -0.4619400f, -0.4619400f, -0.1913420f, 0.191342f, 0.4619400f }, 73508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.4157350f, -0.0975452f, -0.4903930f, -0.2777850f, 0.2777850f, 0.4903930f, 0.097545f, -0.4157350f }, 74508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.3535530f, -0.3535530f, -0.3535530f, 0.3535540f, 0.3535530f, -0.3535540f, -0.353553f, 0.3535530f }, 75508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.2777850f, -0.4903930f, 0.0975452f, 0.4157350f, -0.4157350f, -0.0975451f, 0.490393f, -0.2777850f }, 76508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.1913420f, -0.4619400f, 0.4619400f, -0.1913420f, -0.1913410f, 0.4619400f, -0.461940f, 0.1913420f }, 77508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 0.0975451f, -0.2777850f, 0.4157350f, -0.4903930f, 0.4903930f, -0.4157350f, 0.277786f, -0.0975458f } 78508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König}; 79508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 80e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König/* vertices for a quad covering a block */ 81e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königstatic const struct vertex2f const_quad[4] = { 82e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} 83e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König}; 84e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 85508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void * 86508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königcreate_vert_shader(struct vl_idct *idct) 87508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 88508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_program *shader; 89508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src norm, bs; 90508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src vrect, vpos; 91508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_dst scale, t_vpos; 92508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_dst o_vpos, o_block, o_tex, o_start, o_step; 93508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 94508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König shader = ureg_create(TGSI_PROCESSOR_VERTEX); 95508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König if (!shader) 96508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return NULL; 97508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 98508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König norm = ureg_DECL_constant(shader, 0); 99508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König bs = ureg_imm2f(shader, BLOCK_WIDTH, BLOCK_HEIGHT); 100508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 101508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König scale = ureg_DECL_temporary(shader); 102508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König t_vpos = ureg_DECL_temporary(shader); 103508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 104508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vrect = ureg_DECL_vs_input(shader, VS_I_RECT); 105508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vpos = ureg_DECL_vs_input(shader, VS_I_VPOS); 106508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 107508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); 108508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König o_block = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_BLOCK); 109e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König o_tex = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_TEX); 110e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König o_start = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_START); 111508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König o_step = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_STEP); 112508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 113508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König /* 114508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * scale = norm * mbs; 115508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 116508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * t_vpos = vpos + vrect 117508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_vpos.xy = t_vpos * scale 118508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_vpos.zw = vpos 119508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 120508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_block = vrect 121508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_tex = t_pos 122508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_start = vpos * scale 123508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * o_step = norm 124508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * 125508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König */ 126508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MUL(shader, ureg_writemask(scale, TGSI_WRITEMASK_XY), norm, bs); 127508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 128508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_ADD(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), vpos, vrect); 129508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MUL(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos), ureg_src(scale)); 130508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos)); 131508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_ZW), vpos); 132508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 133508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(o_tex, TGSI_WRITEMASK_XY), ureg_src(t_vpos)); 134508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(o_block, TGSI_WRITEMASK_XY), vrect); 135508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MUL(shader, ureg_writemask(o_start, TGSI_WRITEMASK_XY), vpos, ureg_src(scale)); 136508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(o_step, TGSI_WRITEMASK_XY), norm); 137508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 138508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_release_temporary(shader, t_vpos); 139508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_release_temporary(shader, scale); 140508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 141508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_END(shader); 142508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 143508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return ureg_create_shader_and_destroy(shader, idct->pipe); 144508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 145508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 146508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void 147508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königmatrix_mul(struct ureg_program *shader, struct ureg_dst dst, 148508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src tc[2], struct ureg_src sampler[2], 149508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src start[2], struct ureg_src step[2], 150c9e10c666adc64f6c5dfb04422560508f115aa54Christian König bool fetch4[2], float scale) 151508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 152508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_dst t_tc[2], m[2][2], tmp[2]; 153c9e10c666adc64f6c5dfb04422560508f115aa54Christian König unsigned side, i, j; 154508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 155508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for(i = 0; i < 2; ++i) { 156508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König t_tc[i] = ureg_DECL_temporary(shader); 157508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for(j = 0; j < 2; ++j) 158508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König m[i][j] = ureg_DECL_temporary(shader); 159508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König tmp[i] = ureg_DECL_temporary(shader); 160508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 161508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 162508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König /* 163508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * m[0..1][0] = ? 164508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * tmp[0..1] = dot4(m[0..1][0], m[0..1][1]) 165508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König * fragment = tmp[0] + tmp[1] 166508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König */ 167508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_X), start[0]); 168508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_MOV(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_Y), tc[0]); 169508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 170ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König if(fetch4[1]) { 171ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_X), ureg_scalar(start[1], TGSI_SWIZZLE_Y)); 172ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_Y), ureg_scalar(tc[1], TGSI_SWIZZLE_X)); 173ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König } else { 174ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_X), tc[1]); 175ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_Y), start[1]); 176ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König } 177508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 178c9e10c666adc64f6c5dfb04422560508f115aa54Christian König for(side = 0; side < 2; ++side) { 179c9e10c666adc64f6c5dfb04422560508f115aa54Christian König for(i = 0; i < 2; ++i) { 180c9e10c666adc64f6c5dfb04422560508f115aa54Christian König if(fetch4[side]) { 181c9e10c666adc64f6c5dfb04422560508f115aa54Christian König ureg_TEX(shader, m[i][side], TGSI_TEXTURE_2D, ureg_src(t_tc[side]), sampler[side]); 182ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König ureg_MOV(shader, ureg_writemask(t_tc[side], TGSI_WRITEMASK_X), step[side]); 183508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 184c9e10c666adc64f6c5dfb04422560508f115aa54Christian König } else for(j = 0; j < 4; ++j) { 185c9e10c666adc64f6c5dfb04422560508f115aa54Christian König /* Nouveau and r600g can't writemask tex dst regs (yet?), do in two steps */ 186c9e10c666adc64f6c5dfb04422560508f115aa54Christian König ureg_TEX(shader, tmp[side], TGSI_TEXTURE_2D, ureg_src(t_tc[side]), sampler[side]); 187c9e10c666adc64f6c5dfb04422560508f115aa54Christian König ureg_MOV(shader, ureg_writemask(m[i][side], TGSI_WRITEMASK_X << j), ureg_scalar(ureg_src(tmp[side]), TGSI_SWIZZLE_X)); 188508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 189c9e10c666adc64f6c5dfb04422560508f115aa54Christian König ureg_ADD(shader, ureg_writemask(t_tc[side], TGSI_WRITEMASK_X << side), ureg_src(t_tc[side]), step[side]); 190c9e10c666adc64f6c5dfb04422560508f115aa54Christian König } 191508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 192508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 193508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 194508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_DP4(shader, ureg_writemask(tmp[0], TGSI_WRITEMASK_X), ureg_src(m[0][0]), ureg_src(m[0][1])); 195508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_DP4(shader, ureg_writemask(tmp[1], TGSI_WRITEMASK_X), ureg_src(m[1][0]), ureg_src(m[1][1])); 196ed49905944243863913bc2598f734ca038c85b94Christian König ureg_ADD(shader, ureg_writemask(tmp[0], TGSI_WRITEMASK_X), ureg_src(tmp[0]), ureg_src(tmp[1])); 197ed49905944243863913bc2598f734ca038c85b94Christian König ureg_MUL(shader, dst, ureg_src(tmp[0]), ureg_imm1f(shader, scale)); 198508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 199508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for(i = 0; i < 2; ++i) { 200508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_release_temporary(shader, t_tc[i]); 201508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for(j = 0; j < 2; ++j) 202508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_release_temporary(shader, m[i][j]); 203508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_release_temporary(shader, tmp[i]); 204508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 205508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 206508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 207508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void * 208508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königcreate_transpose_frag_shader(struct vl_idct *idct) 209508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 210508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_program *shader; 211508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src tc[2], sampler[2]; 212508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src start[2], step[2]; 213ac1fd50163119a887487d748fab507b23e215c2bChristian König struct ureg_dst fragment; 214c9e10c666adc64f6c5dfb04422560508f115aa54Christian König bool fetch4[2]; 215508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 216508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 217508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König if (!shader) 218508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return NULL; 219508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 220508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König tc[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_BLOCK, TGSI_INTERPOLATE_LINEAR); 221508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König tc[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_TEX, TGSI_INTERPOLATE_LINEAR); 222508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 223508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König start[0] = ureg_imm1f(shader, 0.0f); 224508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König start[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_START, TGSI_INTERPOLATE_CONSTANT); 225508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 226c9e10c666adc64f6c5dfb04422560508f115aa54Christian König step[0] = ureg_imm1f(shader, 4.0f / BLOCK_HEIGHT); 227508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König step[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_STEP, TGSI_INTERPOLATE_CONSTANT); 228508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 229508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König sampler[0] = ureg_DECL_sampler(shader, 0); 2302c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König sampler[1] = ureg_DECL_sampler(shader, 1); 231508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 232c9e10c666adc64f6c5dfb04422560508f115aa54Christian König fetch4[0] = true; 233c9e10c666adc64f6c5dfb04422560508f115aa54Christian König fetch4[1] = false; 234c9e10c666adc64f6c5dfb04422560508f115aa54Christian König 235508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 236508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 237c9e10c666adc64f6c5dfb04422560508f115aa54Christian König matrix_mul(shader, fragment, tc, sampler, start, step, fetch4, STAGE1_SCALE); 23803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 239508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_END(shader); 240508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 241508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return ureg_create_shader_and_destroy(shader, idct->pipe); 242508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 243508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 244508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void * 245508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königcreate_matrix_frag_shader(struct vl_idct *idct) 246508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 247508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_program *shader; 248508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src tc[2], sampler[2]; 249508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct ureg_src start[2], step[2]; 25095febb69cc333dad75c0f2da19dd85f444281ad2Christian König struct ureg_dst fragment; 251c9e10c666adc64f6c5dfb04422560508f115aa54Christian König bool fetch4[2]; 252508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 253508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 254508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König if (!shader) 255508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return NULL; 256508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 257508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König tc[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_TEX, TGSI_INTERPOLATE_LINEAR); 258508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König tc[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_BLOCK, TGSI_INTERPOLATE_LINEAR); 259508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 260508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König start[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_START, TGSI_INTERPOLATE_CONSTANT); 261508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König start[1] = ureg_imm1f(shader, 0.0f); 262508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 263508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König step[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_STEP, TGSI_INTERPOLATE_CONSTANT); 264ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König step[1] = ureg_imm1f(shader, 4.0f / BLOCK_WIDTH); 265508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 2662c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König sampler[0] = ureg_DECL_sampler(shader, 1); 2672c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König sampler[1] = ureg_DECL_sampler(shader, 0); 268508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 269c9e10c666adc64f6c5dfb04422560508f115aa54Christian König fetch4[0] = false; 270ed8b767a8e09cff4d98a44cdc07b08f1b322c4d3Christian König fetch4[1] = true; 271c9e10c666adc64f6c5dfb04422560508f115aa54Christian König 272508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 273508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 274c9e10c666adc64f6c5dfb04422560508f115aa54Christian König matrix_mul(shader, fragment, tc, sampler, start, step, fetch4, STAGE2_SCALE); 275508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 276508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ureg_END(shader); 277508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 278508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return ureg_create_shader_and_destroy(shader, idct->pipe); 279508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 280508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 28195febb69cc333dad75c0f2da19dd85f444281ad2Christian Königstatic void * 28295febb69cc333dad75c0f2da19dd85f444281ad2Christian Königcreate_empty_block_frag_shader(struct vl_idct *idct) 28395febb69cc333dad75c0f2da19dd85f444281ad2Christian König{ 28495febb69cc333dad75c0f2da19dd85f444281ad2Christian König struct ureg_program *shader; 28595febb69cc333dad75c0f2da19dd85f444281ad2Christian König struct ureg_dst fragment; 28695febb69cc333dad75c0f2da19dd85f444281ad2Christian König 28795febb69cc333dad75c0f2da19dd85f444281ad2Christian König shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 28895febb69cc333dad75c0f2da19dd85f444281ad2Christian König if (!shader) 28995febb69cc333dad75c0f2da19dd85f444281ad2Christian König return NULL; 29095febb69cc333dad75c0f2da19dd85f444281ad2Christian König 29195febb69cc333dad75c0f2da19dd85f444281ad2Christian König fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 29295febb69cc333dad75c0f2da19dd85f444281ad2Christian König 29395febb69cc333dad75c0f2da19dd85f444281ad2Christian König ureg_MOV(shader, fragment, ureg_imm1f(shader, 0.0f)); 29495febb69cc333dad75c0f2da19dd85f444281ad2Christian König 29595febb69cc333dad75c0f2da19dd85f444281ad2Christian König ureg_END(shader); 29695febb69cc333dad75c0f2da19dd85f444281ad2Christian König 29795febb69cc333dad75c0f2da19dd85f444281ad2Christian König return ureg_create_shader_and_destroy(shader, idct->pipe); 29895febb69cc333dad75c0f2da19dd85f444281ad2Christian König} 29995febb69cc333dad75c0f2da19dd85f444281ad2Christian König 300508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void 301508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königxfer_buffers_map(struct vl_idct *idct) 302508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 303508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct pipe_box rect = 304508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König { 305508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 0, 0, 0, 306508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->destination->width0, 307508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->destination->height0, 308508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 1 309508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König }; 310508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 311508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->tex_transfer = idct->pipe->get_transfer 312508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ( 31303c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe, idct->textures.individual.source, 314508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König u_subresource(0, 0), 315508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 316508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König &rect 317508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ); 318508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 319508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->texels = idct->pipe->transfer_map(idct->pipe, idct->tex_transfer); 320e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 321e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vectors = pipe_buffer_map 322e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ( 323e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe, 324e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.pos.buffer, 325e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 326e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König &idct->vec_transfer 327e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ); 328508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 329508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 330508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void 331508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königxfer_buffers_unmap(struct vl_idct *idct) 332508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 333e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_buffer_unmap(idct->pipe, idct->vertex_bufs.individual.pos.buffer, idct->vec_transfer); 334e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 335508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->transfer_unmap(idct->pipe, idct->tex_transfer); 336508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->transfer_destroy(idct->pipe, idct->tex_transfer); 337508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 338508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 339508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic bool 340508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königinit_shaders(struct vl_idct *idct) 341508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 3425a8078486a013152d150a4524ebfab929eefe6c4Christian König idct->vs = create_vert_shader(idct); 3435a8078486a013152d150a4524ebfab929eefe6c4Christian König idct->transpose_fs = create_transpose_frag_shader(idct); 3445a8078486a013152d150a4524ebfab929eefe6c4Christian König idct->matrix_fs = create_matrix_frag_shader(idct); 3455a8078486a013152d150a4524ebfab929eefe6c4Christian König idct->eb_fs = create_empty_block_frag_shader(idct); 346508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 34721efda86875096333dc0412c0edab1e188f551d8Christian König return 34821efda86875096333dc0412c0edab1e188f551d8Christian König idct->vs != NULL && 34921efda86875096333dc0412c0edab1e188f551d8Christian König idct->transpose_fs != NULL && 35021efda86875096333dc0412c0edab1e188f551d8Christian König idct->matrix_fs != NULL && 35121efda86875096333dc0412c0edab1e188f551d8Christian König idct->eb_fs != NULL; 352508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 353508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 354508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void 355508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königcleanup_shaders(struct vl_idct *idct) 356508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 357508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->delete_vs_state(idct->pipe, idct->vs); 358508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->delete_fs_state(idct->pipe, idct->transpose_fs); 359508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->delete_fs_state(idct->pipe, idct->matrix_fs); 36095febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->delete_fs_state(idct->pipe, idct->eb_fs); 361508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 362508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 363508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic bool 364508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königinit_buffers(struct vl_idct *idct) 365508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 366508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct pipe_resource template; 367508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct pipe_sampler_view sampler_view; 368508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König struct pipe_vertex_element vertex_elems[2]; 36921efda86875096333dc0412c0edab1e188f551d8Christian König unsigned i; 370508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 37195febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->max_blocks = 372508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König align(idct->destination->width0, BLOCK_WIDTH) / BLOCK_WIDTH * 373508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König align(idct->destination->height0, BLOCK_HEIGHT) / BLOCK_HEIGHT * 374508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->destination->depth0; 375508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 376508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König memset(&template, 0, sizeof(struct pipe_resource)); 377508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.target = PIPE_TEXTURE_2D; 378c9e10c666adc64f6c5dfb04422560508f115aa54Christian König template.format = PIPE_FORMAT_R32G32B32A32_FLOAT; 379508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.last_level = 0; 380c9e10c666adc64f6c5dfb04422560508f115aa54Christian König template.width0 = 2; 381508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.height0 = 8; 382508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.depth0 = 1; 383508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.usage = PIPE_USAGE_IMMUTABLE; 384508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.bind = PIPE_BIND_SAMPLER_VIEW; 385508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.flags = 0; 386508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 387508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.format = idct->destination->format; 388508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.width0 = idct->destination->width0; 389508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.height0 = idct->destination->height0; 390508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.depth0 = idct->destination->depth0; 391508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König template.usage = PIPE_USAGE_DYNAMIC; 392508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->textures.individual.source = idct->pipe->screen->resource_create(idct->pipe->screen, &template); 393508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 39403c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König template.usage = PIPE_USAGE_STATIC; 395508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->textures.individual.intermediate = idct->pipe->screen->resource_create(idct->pipe->screen, &template); 396508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 397508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for (i = 0; i < 4; ++i) { 39821efda86875096333dc0412c0edab1e188f551d8Christian König if(idct->textures.all[i] == NULL) 39921efda86875096333dc0412c0edab1e188f551d8Christian König return false; /* a texture failed to allocate */ 40021efda86875096333dc0412c0edab1e188f551d8Christian König 401508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König u_sampler_view_default_template(&sampler_view, idct->textures.all[i], idct->textures.all[i]->format); 402508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->sampler_views.all[i] = idct->pipe->create_sampler_view(idct->pipe, idct->textures.all[i], &sampler_view); 403508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 404508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 405e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.quad.stride = sizeof(struct vertex2f); 40695febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->vertex_bufs.individual.quad.max_index = 4 * idct->max_blocks - 1; 407e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.quad.buffer_offset = 0; 408e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.quad.buffer = pipe_buffer_create 409508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ( 410508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->screen, 411508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König PIPE_BIND_VERTEX_BUFFER, 41295febb69cc333dad75c0f2da19dd85f444281ad2Christian König sizeof(struct vertex2f) * 4 * idct->max_blocks 413508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ); 414508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 41521efda86875096333dc0412c0edab1e188f551d8Christian König if(idct->vertex_bufs.individual.quad.buffer == NULL) 41621efda86875096333dc0412c0edab1e188f551d8Christian König return false; 41721efda86875096333dc0412c0edab1e188f551d8Christian König 418e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.pos.stride = sizeof(struct vertex2f); 41995febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->vertex_bufs.individual.pos.max_index = 4 * idct->max_blocks - 1; 420e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.pos.buffer_offset = 0; 421e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.pos.buffer = pipe_buffer_create 422508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ( 423508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->screen, 424508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König PIPE_BIND_VERTEX_BUFFER, 42595febb69cc333dad75c0f2da19dd85f444281ad2Christian König sizeof(struct vertex2f) * 4 * idct->max_blocks 426508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ); 427508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 42821efda86875096333dc0412c0edab1e188f551d8Christian König if(idct->vertex_bufs.individual.pos.buffer == NULL) 42921efda86875096333dc0412c0edab1e188f551d8Christian König return false; 43021efda86875096333dc0412c0edab1e188f551d8Christian König 431508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König /* Rect element */ 432508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[0].src_offset = 0; 433508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[0].instance_divisor = 0; 434508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[0].vertex_buffer_index = 0; 435508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; 436508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 437508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König /* Pos element */ 438508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[1].src_offset = 0; 439508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[1].instance_divisor = 0; 440508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[1].vertex_buffer_index = 1; 441508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König vertex_elems[1].src_format = PIPE_FORMAT_R32G32_FLOAT; 442508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 443508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->vertex_elems_state = idct->pipe->create_vertex_elements_state(idct->pipe, 2, vertex_elems); 444508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 445508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->vs_const_buf = pipe_buffer_create 446508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ( 447508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->screen, 448508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König PIPE_BIND_CONSTANT_BUFFER, 449508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König sizeof(struct vertex_shader_consts) 450508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König ); 451508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 45221efda86875096333dc0412c0edab1e188f551d8Christian König if(idct->vs_const_buf == NULL) 45321efda86875096333dc0412c0edab1e188f551d8Christian König return false; 45421efda86875096333dc0412c0edab1e188f551d8Christian König 455508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return true; 456508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 457508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 458508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königstatic void 459508a4a056c3140dc1f90b93acd46c06c30f7094eChristian Königcleanup_buffers(struct vl_idct *idct) 460508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 461508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König unsigned i; 462508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 463508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König assert(idct); 464508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 465508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König pipe_resource_reference(&idct->vs_const_buf, NULL); 466508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 467508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König for (i = 0; i < 4; ++i) { 468508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König pipe_sampler_view_reference(&idct->sampler_views.all[i], NULL); 469508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König pipe_resource_reference(&idct->textures.all[i], NULL); 470508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 471508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 472508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->pipe->delete_vertex_elements_state(idct->pipe, idct->vertex_elems_state); 473e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_resource_reference(&idct->vertex_bufs.individual.quad.buffer, NULL); 474e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_resource_reference(&idct->vertex_bufs.individual.pos.buffer, NULL); 475508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 476508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 477e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königstatic void 478e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königinit_constants(struct vl_idct *idct) 479508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 480e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König struct pipe_transfer *buf_transfer; 481e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König struct vertex_shader_consts *vs_consts; 482e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König struct vertex2f *v; 483e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 4843dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König unsigned i; 485ac1fd50163119a887487d748fab507b23e215c2bChristian König 486ac1fd50163119a887487d748fab507b23e215c2bChristian König /* quad vectors */ 487e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König v = pipe_buffer_map 488e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ( 489e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe, 490e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->vertex_bufs.individual.quad.buffer, 491e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 492e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König &buf_transfer 493e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ); 49495febb69cc333dad75c0f2da19dd85f444281ad2Christian König for ( i = 0; i < idct->max_blocks; ++i) 49595febb69cc333dad75c0f2da19dd85f444281ad2Christian König memcpy(v + i * 4, &const_quad, sizeof(const_quad)); 496e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_buffer_unmap(idct->pipe, idct->vertex_bufs.individual.quad.buffer, buf_transfer); 497508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 498ac1fd50163119a887487d748fab507b23e215c2bChristian König /* normalisation constants */ 499e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König vs_consts = pipe_buffer_map 500e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ( 501e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe, idct->vs_const_buf, 502e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 503e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König &buf_transfer 504e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König ); 505e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 506e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König vs_consts->norm.x = 1.0f / idct->destination->width0; 507e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König vs_consts->norm.y = 1.0f / idct->destination->height0; 508e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 509e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_buffer_unmap(idct->pipe, idct->vs_const_buf, buf_transfer); 510e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König} 511e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 512e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königstatic void 513e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königinit_state(struct vl_idct *idct) 514e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König{ 515e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König struct pipe_sampler_state sampler; 516e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König unsigned i; 517e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 518e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->num_blocks = 0; 51995febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->num_empty_blocks = 0; 520e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 521e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->viewport.scale[0] = idct->destination->width0; 522e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->viewport.scale[1] = idct->destination->height0; 523508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.scale[2] = 1; 524508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.scale[3] = 1; 525508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.translate[0] = 0; 526508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.translate[1] = 0; 527508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.translate[2] = 0; 528508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->viewport.translate[3] = 0; 529508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 530e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->fb_state.width = idct->destination->width0; 531e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->fb_state.height = idct->destination->height0; 532508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->fb_state.nr_cbufs = 1; 533508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König idct->fb_state.zsbuf = NULL; 534508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 535e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König for (i = 0; i < 4; ++i) { 536e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König memset(&sampler, 0, sizeof(sampler)); 537e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 538e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 539e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 540e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 541e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 542e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 543e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.compare_mode = PIPE_TEX_COMPARE_NONE; 544e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.compare_func = PIPE_FUNC_ALWAYS; 545e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.normalized_coords = 1; 546e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König /*sampler.shadow_ambient = ; */ 547e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König /*sampler.lod_bias = ; */ 548e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König sampler.min_lod = 0; 549e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König /*sampler.max_lod = ; */ 550e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König /*sampler.border_color[0] = ; */ 551e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König /*sampler.max_anisotropy = ; */ 552e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->samplers.all[i] = idct->pipe->create_sampler_state(idct->pipe, &sampler); 553e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König } 554e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König} 555e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 556e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königstatic void 557e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian Königcleanup_state(struct vl_idct *idct) 558e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König{ 559e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König unsigned i; 560e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 561e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König for (i = 0; i < 4; ++i) 562e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->delete_sampler_state(idct->pipe, idct->samplers.all[i]); 563e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König} 564e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 5653dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian Königstruct pipe_resource * 5663dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian Königvl_idct_upload_matrix(struct pipe_context *pipe) 5673dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König{ 5683dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König struct pipe_resource template, *matrix; 5693dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König struct pipe_transfer *buf_transfer; 5703dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König unsigned i, j, pitch; 5713dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König float *f; 5723dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 5733dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König struct pipe_box rect = 5743dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König { 5753dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 0, 0, 0, 5763dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König BLOCK_WIDTH, 5773dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König BLOCK_HEIGHT, 5783dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 1 5793dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König }; 5803dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 5813dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König memset(&template, 0, sizeof(struct pipe_resource)); 5823dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.target = PIPE_TEXTURE_2D; 5833dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.format = PIPE_FORMAT_R32G32B32A32_FLOAT; 5843dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.last_level = 0; 5853dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.width0 = 2; 5863dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.height0 = 8; 5873dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.depth0 = 1; 5883dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.usage = PIPE_USAGE_IMMUTABLE; 5893dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.bind = PIPE_BIND_SAMPLER_VIEW; 5903dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König template.flags = 0; 5913dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 5923dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König matrix = pipe->screen->resource_create(pipe->screen, &template); 5933dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 5943dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König /* matrix */ 5953dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König buf_transfer = pipe->get_transfer 5963dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König ( 5973dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pipe, matrix, 5983dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König u_subresource(0, 0), 5993dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, 6003dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König &rect 6013dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König ); 6023dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pitch = buf_transfer->stride / util_format_get_blocksize(buf_transfer->resource->format); 6033dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 6043dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König f = pipe->transfer_map(pipe, buf_transfer); 6053dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König for(i = 0; i < BLOCK_HEIGHT; ++i) 6063dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König for(j = 0; j < BLOCK_WIDTH; ++j) 6073dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König f[i * pitch * 4 + j] = const_matrix[j][i]; // transpose 6083dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 6093dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pipe->transfer_unmap(pipe, buf_transfer); 6103dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pipe->transfer_destroy(pipe, buf_transfer); 6113dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 6123dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König return matrix; 6133dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König} 6143dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 61503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königbool 6163dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian Königvl_idct_init(struct vl_idct *idct, struct pipe_context *pipe, struct pipe_resource *dst, struct pipe_resource *matrix) 617e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König{ 618e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König assert(idct && pipe && dst); 619e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 620e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe = pipe; 6213dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pipe_resource_reference(&idct->textures.individual.matrix, matrix); 6223dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König pipe_resource_reference(&idct->textures.individual.transpose, matrix); 623508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König pipe_resource_reference(&idct->destination, dst); 624508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 625e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König init_state(idct); 626e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 627508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König if(!init_shaders(idct)) 628508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return false; 629508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 630508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König if(!init_buffers(idct)) { 631508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König cleanup_shaders(idct); 632508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return false; 633508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König } 634508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 635e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->surfaces.intermediate = idct->pipe->screen->get_tex_surface( 636e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->screen, idct->textures.individual.intermediate, 0, 0, 0, 637e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET); 638e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 639e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->surfaces.destination = idct->pipe->screen->get_tex_surface( 640e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->screen, idct->destination, 0, 0, 0, 641e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET); 642e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 643e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König init_constants(idct); 644508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König xfer_buffers_map(idct); 645508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 646508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König return true; 647508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 648508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 64903c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvoid 65003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvl_idct_cleanup(struct vl_idct *idct) 651508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 652e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->screen->tex_surface_destroy(idct->surfaces.destination); 653e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->screen->tex_surface_destroy(idct->surfaces.intermediate); 654e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 655508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König cleanup_shaders(idct); 656508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König cleanup_buffers(idct); 657e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 658e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König cleanup_state(idct); 659e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 660e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König pipe_resource_reference(&idct->destination, NULL); 661508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 662508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 66303c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvoid 66403c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvl_idct_add_block(struct vl_idct *idct, unsigned x, unsigned y, short *block) 665508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 66695febb69cc333dad75c0f2da19dd85f444281ad2Christian König struct vertex2f v, *v_dst; 667e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 668508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König unsigned tex_pitch; 669508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König short *texels; 670e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 671508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König unsigned i; 672508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 673508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König assert(idct); 674e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 67503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König if(block) { 67695febb69cc333dad75c0f2da19dd85f444281ad2Christian König tex_pitch = idct->tex_transfer->stride / util_format_get_blocksize(idct->tex_transfer->resource->format); 67795febb69cc333dad75c0f2da19dd85f444281ad2Christian König texels = idct->texels + y * tex_pitch * BLOCK_HEIGHT + x * BLOCK_WIDTH; 67803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 67903c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König for (i = 0; i < BLOCK_HEIGHT; ++i) 68003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König memcpy(texels + i * tex_pitch, block + i * BLOCK_WIDTH, BLOCK_WIDTH * 2); 681e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 68295febb69cc333dad75c0f2da19dd85f444281ad2Christian König /* non empty blocks fills the vector buffer from left to right */ 68395febb69cc333dad75c0f2da19dd85f444281ad2Christian König v_dst = idct->vectors + idct->num_blocks * 4; 68495febb69cc333dad75c0f2da19dd85f444281ad2Christian König 68503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->num_blocks++; 68695febb69cc333dad75c0f2da19dd85f444281ad2Christian König 68703c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König } else { 68895febb69cc333dad75c0f2da19dd85f444281ad2Christian König 68995febb69cc333dad75c0f2da19dd85f444281ad2Christian König /* while empty blocks fills the vector buffer from right to left */ 69095febb69cc333dad75c0f2da19dd85f444281ad2Christian König v_dst = idct->vectors + (idct->max_blocks - idct->num_empty_blocks) * 4 - 4; 69195febb69cc333dad75c0f2da19dd85f444281ad2Christian König 69295febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->num_empty_blocks++; 69395febb69cc333dad75c0f2da19dd85f444281ad2Christian König } 69495febb69cc333dad75c0f2da19dd85f444281ad2Christian König 69595febb69cc333dad75c0f2da19dd85f444281ad2Christian König v.x = x; 69695febb69cc333dad75c0f2da19dd85f444281ad2Christian König v.y = y; 69795febb69cc333dad75c0f2da19dd85f444281ad2Christian König 69895febb69cc333dad75c0f2da19dd85f444281ad2Christian König for (i = 0; i < 4; ++i) { 69995febb69cc333dad75c0f2da19dd85f444281ad2Christian König v_dst[i] = v; 70003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König } 701508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 702508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König 70303c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvoid 70403c5a0ea5cd5b3e5931d6784749f87789a016b98Christian Königvl_idct_flush(struct vl_idct *idct) 705508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König{ 706508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König xfer_buffers_unmap(idct); 707e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 708e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->pipe->set_constant_buffer(idct->pipe, PIPE_SHADER_VERTEX, 0, idct->vs_const_buf); 709e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 71003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König if(idct->num_blocks > 0) { 71103c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 71203c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König /* first stage */ 71303c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->fb_state.cbufs[0] = idct->surfaces.intermediate; 71403c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_framebuffer_state(idct->pipe, &idct->fb_state); 71503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_viewport_state(idct->pipe, &idct->viewport); 71603c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 71703c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_vertex_buffers(idct->pipe, 2, idct->vertex_bufs.all); 71803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_vertex_elements_state(idct->pipe, idct->vertex_elems_state); 7192c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König idct->pipe->set_fragment_sampler_views(idct->pipe, 2, idct->sampler_views.stage[0]); 7202c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König idct->pipe->bind_fragment_sampler_states(idct->pipe, 2, idct->samplers.stage[0]); 72103c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_vs_state(idct->pipe, idct->vs); 72203c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_fs_state(idct->pipe, idct->transpose_fs); 72303c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 72403c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König util_draw_arrays(idct->pipe, PIPE_PRIM_QUADS, 0, idct->num_blocks * 4); 72503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 72603c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König /* second stage */ 72703c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->fb_state.cbufs[0] = idct->surfaces.destination; 72803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_framebuffer_state(idct->pipe, &idct->fb_state); 72903c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_viewport_state(idct->pipe, &idct->viewport); 73003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 73103c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->set_vertex_buffers(idct->pipe, 2, idct->vertex_bufs.all); 73203c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_vertex_elements_state(idct->pipe, idct->vertex_elems_state); 7332c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König idct->pipe->set_fragment_sampler_views(idct->pipe, 2, idct->sampler_views.stage[1]); 7342c9db2484b7c1cec7a3a629f70a5aa840e16268eChristian König idct->pipe->bind_fragment_sampler_states(idct->pipe, 2, idct->samplers.stage[1]); 73503c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_vs_state(idct->pipe, idct->vs); 73603c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König idct->pipe->bind_fs_state(idct->pipe, idct->matrix_fs); 73703c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 73803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König util_draw_arrays(idct->pipe, PIPE_PRIM_QUADS, 0, idct->num_blocks * 4); 73995febb69cc333dad75c0f2da19dd85f444281ad2Christian König } 74003c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König 74195febb69cc333dad75c0f2da19dd85f444281ad2Christian König if(idct->num_empty_blocks > 0) { 74295febb69cc333dad75c0f2da19dd85f444281ad2Christian König 74395febb69cc333dad75c0f2da19dd85f444281ad2Christian König /* empty block handling */ 74495febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->fb_state.cbufs[0] = idct->surfaces.destination; 74595febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->set_framebuffer_state(idct->pipe, &idct->fb_state); 74695febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->set_viewport_state(idct->pipe, &idct->viewport); 74795febb69cc333dad75c0f2da19dd85f444281ad2Christian König 74895febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->set_vertex_buffers(idct->pipe, 2, idct->vertex_bufs.all); 74995febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->bind_vertex_elements_state(idct->pipe, idct->vertex_elems_state); 75095febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->set_fragment_sampler_views(idct->pipe, 4, idct->sampler_views.all); 75195febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->bind_fragment_sampler_states(idct->pipe, 4, idct->samplers.all); 75295febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->bind_vs_state(idct->pipe, idct->vs); 75395febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->pipe->bind_fs_state(idct->pipe, idct->eb_fs); 75495febb69cc333dad75c0f2da19dd85f444281ad2Christian König 75595febb69cc333dad75c0f2da19dd85f444281ad2Christian König util_draw_arrays(idct->pipe, PIPE_PRIM_QUADS, 75695febb69cc333dad75c0f2da19dd85f444281ad2Christian König (idct->max_blocks - idct->num_empty_blocks) * 4, 75795febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->num_empty_blocks * 4); 75803c5a0ea5cd5b3e5931d6784749f87789a016b98Christian König } 759e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König 760e639e1b83ea65985cd84d12dc120d77cab80ba9eChristian König idct->num_blocks = 0; 76195febb69cc333dad75c0f2da19dd85f444281ad2Christian König idct->num_empty_blocks = 0; 762508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König xfer_buffers_map(idct); 763508a4a056c3140dc1f90b93acd46c06c30f7094eChristian König} 764