1/************************************************************************** 2 * 3 * Copyright 2010 Jakob Bornecrantz 4 * Copyright 2011 Lauri Kasanen 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29#include "postprocess/postprocess.h" 30#include "postprocess/pp_private.h" 31 32#include "cso_cache/cso_context.h" 33#include "pipe/p_screen.h" 34#include "pipe/p_context.h" 35#include "pipe/p_state.h" 36#include "pipe/p_shader_tokens.h" 37#include "util/u_inlines.h" 38#include "util/u_simple_shaders.h" 39#include "util/u_memory.h" 40 41/** Initialize the internal details */ 42struct pp_program * 43pp_init_prog(struct pp_queue_t *ppq, struct pipe_context *pipe, 44 struct cso_context *cso, struct st_context_iface *st) 45{ 46 struct pp_program *p; 47 48 pp_debug("Initializing program\n"); 49 if (!pipe) 50 return NULL; 51 52 p = CALLOC(1, sizeof(struct pp_program)); 53 if (!p) 54 return NULL; 55 56 p->screen = pipe->screen; 57 p->pipe = pipe; 58 p->cso = cso; 59 p->st = st; 60 61 { 62 static const float verts[4][2][4] = { 63 { 64 {1.0f, 1.0f, 0.0f, 1.0f}, 65 {1.0f, 1.0f, 0.0f, 1.0f} 66 }, 67 { 68 {-1.0f, 1.0f, 0.0f, 1.0f}, 69 {0.0f, 1.0f, 0.0f, 1.0f} 70 }, 71 { 72 {-1.0f, -1.0f, 0.0f, 1.0f}, 73 {0.0f, 0.0f, 0.0f, 1.0f} 74 }, 75 { 76 {1.0f, -1.0f, 0.0f, 1.0f}, 77 {1.0f, 0.0f, 0.0f, 1.0f} 78 } 79 }; 80 81 p->vbuf = pipe_buffer_create(pipe->screen, PIPE_BIND_VERTEX_BUFFER, 82 PIPE_USAGE_DEFAULT, sizeof(verts)); 83 pipe_buffer_write(p->pipe, p->vbuf, 0, sizeof(verts), verts); 84 } 85 86 p->blend.rt[0].colormask = PIPE_MASK_RGBA; 87 p->blend.rt[0].rgb_src_factor = p->blend.rt[0].alpha_src_factor = 88 PIPE_BLENDFACTOR_SRC_ALPHA; 89 p->blend.rt[0].rgb_dst_factor = p->blend.rt[0].alpha_dst_factor = 90 PIPE_BLENDFACTOR_INV_SRC_ALPHA; 91 92 p->rasterizer.cull_face = PIPE_FACE_NONE; 93 p->rasterizer.half_pixel_center = 1; 94 p->rasterizer.bottom_edge_rule = 1; 95 p->rasterizer.depth_clip_near = 1; 96 p->rasterizer.depth_clip_far = 1; 97 98 p->sampler.wrap_s = p->sampler.wrap_t = p->sampler.wrap_r = 99 PIPE_TEX_WRAP_CLAMP_TO_EDGE; 100 101 p->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 102 p->sampler.min_img_filter = p->sampler.mag_img_filter = 103 PIPE_TEX_FILTER_LINEAR; 104 p->sampler.normalized_coords = 1; 105 106 p->sampler_point.wrap_s = p->sampler_point.wrap_t = 107 p->sampler_point.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 108 p->sampler_point.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 109 p->sampler_point.min_img_filter = p->sampler_point.mag_img_filter = 110 PIPE_TEX_FILTER_NEAREST; 111 p->sampler_point.normalized_coords = 1; 112 113 p->velem.count = 2; 114 p->velem.velems[0].src_offset = 0; 115 p->velem.velems[0].instance_divisor = 0; 116 p->velem.velems[0].vertex_buffer_index = 0; 117 p->velem.velems[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 118 p->velem.velems[1].src_offset = 1 * 4 * sizeof(float); 119 p->velem.velems[1].instance_divisor = 0; 120 p->velem.velems[1].vertex_buffer_index = 0; 121 p->velem.velems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 122 123 if (!p->screen->is_format_supported(p->screen, 124 PIPE_FORMAT_R32G32B32A32_FLOAT, 125 PIPE_BUFFER, 1, 1, 126 PIPE_BIND_VERTEX_BUFFER)) 127 pp_debug("Vertex buf format fail\n"); 128 129 130 { 131 const enum tgsi_semantic semantic_names[] = { TGSI_SEMANTIC_POSITION, 132 TGSI_SEMANTIC_GENERIC 133 }; 134 const uint semantic_indexes[] = { 0, 0 }; 135 p->passvs = util_make_vertex_passthrough_shader(p->pipe, 2, 136 semantic_names, 137 semantic_indexes, FALSE); 138 } 139 140 p->framebuffer.nr_cbufs = 1; 141 142 p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM; 143 144 return p; 145} 146