Home | History | Annotate | Download | only in postprocess
      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 */
     42 struct pp_program *
     43 pp_init_prog(struct pp_queue_t *ppq, struct pipe_context *pipe,
     44              struct cso_context *cso)
     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 
     60    {
     61       static const float verts[4][2][4] = {
     62          {
     63           {1.0f, 1.0f, 0.0f, 1.0f},
     64           {1.0f, 1.0f, 0.0f, 1.0f}
     65           },
     66          {
     67           {-1.0f, 1.0f, 0.0f, 1.0f},
     68           {0.0f, 1.0f, 0.0f, 1.0f}
     69           },
     70          {
     71           {-1.0f, -1.0f, 0.0f, 1.0f},
     72           {0.0f, 0.0f, 0.0f, 1.0f}
     73           },
     74          {
     75           {1.0f, -1.0f, 0.0f, 1.0f},
     76           {1.0f, 0.0f, 0.0f, 1.0f}
     77           }
     78       };
     79 
     80       p->vbuf = pipe_buffer_create(pipe->screen, PIPE_BIND_VERTEX_BUFFER,
     81                                    PIPE_USAGE_DEFAULT, sizeof(verts));
     82       pipe_buffer_write(p->pipe, p->vbuf, 0, sizeof(verts), verts);
     83    }
     84 
     85    p->blend.rt[0].colormask = PIPE_MASK_RGBA;
     86    p->blend.rt[0].rgb_src_factor = p->blend.rt[0].alpha_src_factor =
     87       PIPE_BLENDFACTOR_SRC_ALPHA;
     88    p->blend.rt[0].rgb_dst_factor = p->blend.rt[0].alpha_dst_factor =
     89       PIPE_BLENDFACTOR_INV_SRC_ALPHA;
     90 
     91    p->rasterizer.cull_face = PIPE_FACE_NONE;
     92    p->rasterizer.half_pixel_center = 1;
     93    p->rasterizer.bottom_edge_rule = 1;
     94    p->rasterizer.depth_clip = 1;
     95 
     96    p->sampler.wrap_s = p->sampler.wrap_t = p->sampler.wrap_r =
     97       PIPE_TEX_WRAP_CLAMP_TO_EDGE;
     98 
     99    p->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
    100    p->sampler.min_img_filter = p->sampler.mag_img_filter =
    101       PIPE_TEX_FILTER_LINEAR;
    102    p->sampler.normalized_coords = 1;
    103 
    104    p->sampler_point.wrap_s = p->sampler_point.wrap_t =
    105       p->sampler_point.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
    106    p->sampler_point.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
    107    p->sampler_point.min_img_filter = p->sampler_point.mag_img_filter =
    108       PIPE_TEX_FILTER_NEAREST;
    109    p->sampler_point.normalized_coords = 1;
    110 
    111    p->velem[0].src_offset = 0;
    112    p->velem[0].instance_divisor = 0;
    113    p->velem[0].vertex_buffer_index = 0;
    114    p->velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
    115    p->velem[1].src_offset = 1 * 4 * sizeof(float);
    116    p->velem[1].instance_divisor = 0;
    117    p->velem[1].vertex_buffer_index = 0;
    118    p->velem[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
    119 
    120    if (!p->screen->is_format_supported(p->screen,
    121                                        PIPE_FORMAT_R32G32B32A32_FLOAT,
    122                                        PIPE_BUFFER, 1,
    123                                        PIPE_BIND_VERTEX_BUFFER))
    124       pp_debug("Vertex buf format fail\n");
    125 
    126 
    127    {
    128       const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
    129          TGSI_SEMANTIC_GENERIC
    130       };
    131       const uint semantic_indexes[] = { 0, 0 };
    132       p->passvs = util_make_vertex_passthrough_shader(p->pipe, 2,
    133                                                       semantic_names,
    134                                                       semantic_indexes, FALSE);
    135    }
    136 
    137    p->framebuffer.nr_cbufs = 1;
    138 
    139    p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM;
    140 
    141    return p;
    142 }
    143