• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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 "cso_cache/cso_context.h"
31  #include "pipe/p_screen.h"
32  #include "pipe/p_context.h"
33  #include "pipe/p_state.h"
34  #include "pipe/p_shader_tokens.h"
35  #include "util/u_inlines.h"
36  #include "util/u_simple_shaders.h"
37  #include "util/u_memory.h"
38  
39  /** Initialize the internal details */
40  struct program *
pp_init_prog(struct pp_queue_t * ppq,struct pipe_screen * pscreen)41  pp_init_prog(struct pp_queue_t *ppq, struct pipe_screen *pscreen)
42  {
43  
44     struct program *p;
45  
46     pp_debug("Initializing program\n");
47     if (!pscreen)
48        return NULL;
49  
50     p = CALLOC(1, sizeof(struct program));
51     if (!p)
52        return NULL;
53  
54     p->screen = pscreen;
55     p->pipe = pscreen->context_create(pscreen, NULL);
56  
57     /* XXX this doesn't use the cso_context of the state tracker, but creates
58      * its own. Having 2 existing cso_contexts use 1 pipe_context may cause
59      * undefined behavior! */
60     p->cso = cso_create_context(p->pipe);
61  
62     {
63        static const float verts[4][2][4] = {
64           {
65            {1.0f, 1.0f, 0.0f, 1.0f},
66            {1.0f, 1.0f, 0.0f, 1.0f}
67            },
68           {
69            {-1.0f, 1.0f, 0.0f, 1.0f},
70            {0.0f, 1.0f, 0.0f, 1.0f}
71            },
72           {
73            {-1.0f, -1.0f, 0.0f, 1.0f},
74            {0.0f, 0.0f, 0.0f, 1.0f}
75            },
76           {
77            {1.0f, -1.0f, 0.0f, 1.0f},
78            {1.0f, 0.0f, 0.0f, 1.0f}
79            }
80        };
81  
82        p->vbuf = pipe_buffer_create(pscreen, PIPE_BIND_VERTEX_BUFFER,
83                                     PIPE_USAGE_STATIC, sizeof(verts));
84        pipe_buffer_write(p->pipe, p->vbuf, 0, sizeof(verts), verts);
85     }
86  
87     p->blend.rt[0].colormask = PIPE_MASK_RGBA;
88     p->blend.rt[0].rgb_src_factor = p->blend.rt[0].alpha_src_factor =
89        PIPE_BLENDFACTOR_SRC_ALPHA;
90     p->blend.rt[0].rgb_dst_factor = p->blend.rt[0].alpha_dst_factor =
91        PIPE_BLENDFACTOR_INV_SRC_ALPHA;
92  
93     p->rasterizer.cull_face = PIPE_FACE_NONE;
94     p->rasterizer.gl_rasterization_rules = 1;
95     p->rasterizer.depth_clip = 1;
96  
97     p->sampler.wrap_s = p->sampler.wrap_t = p->sampler.wrap_r =
98        PIPE_TEX_WRAP_CLAMP_TO_EDGE;
99  
100     p->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
101     p->sampler.min_img_filter = p->sampler.mag_img_filter =
102        PIPE_TEX_FILTER_LINEAR;
103     p->sampler.normalized_coords = 1;
104  
105     p->sampler_point.wrap_s = p->sampler_point.wrap_t =
106        p->sampler_point.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
107     p->sampler_point.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
108     p->sampler_point.min_img_filter = p->sampler_point.mag_img_filter =
109        PIPE_TEX_FILTER_NEAREST;
110     p->sampler_point.normalized_coords = 1;
111  
112     p->velem[0].src_offset = 0;
113     p->velem[0].instance_divisor = 0;
114     p->velem[0].vertex_buffer_index = 0;
115     p->velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
116     p->velem[1].src_offset = 1 * 4 * sizeof(float);
117     p->velem[1].instance_divisor = 0;
118     p->velem[1].vertex_buffer_index = 0;
119     p->velem[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
120  
121     if (!p->screen->is_format_supported(p->screen,
122                                         PIPE_FORMAT_R32G32B32A32_FLOAT,
123                                         PIPE_BUFFER, 1,
124                                         PIPE_BIND_VERTEX_BUFFER))
125        pp_debug("Vertex buf format fail\n");
126  
127  
128     {
129        const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
130           TGSI_SEMANTIC_GENERIC
131        };
132        const uint semantic_indexes[] = { 0, 0 };
133        p->passvs = util_make_vertex_passthrough_shader(p->pipe, 2,
134                                                        semantic_names,
135                                                        semantic_indexes);
136     }
137  
138     p->framebuffer.nr_cbufs = 1;
139  
140     p->surf.usage = PIPE_BIND_RENDER_TARGET;
141     p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM;
142  
143     p->pipe->set_sample_mask(p->pipe, ~0);
144  
145     return p;
146  }
147