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 *
pp_init_prog(struct pp_queue_t * ppq,struct pipe_context * pipe,struct cso_context * cso)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_near = 1;
95 p->rasterizer.depth_clip_far = 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.count = 2;
113 p->velem.velems[0].src_offset = 0;
114 p->velem.velems[0].instance_divisor = 0;
115 p->velem.velems[0].vertex_buffer_index = 0;
116 p->velem.velems[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
117 p->velem.velems[1].src_offset = 1 * 4 * sizeof(float);
118 p->velem.velems[1].instance_divisor = 0;
119 p->velem.velems[1].vertex_buffer_index = 0;
120 p->velem.velems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
121
122 if (!p->screen->is_format_supported(p->screen,
123 PIPE_FORMAT_R32G32B32A32_FLOAT,
124 PIPE_BUFFER, 1, 1,
125 PIPE_BIND_VERTEX_BUFFER))
126 pp_debug("Vertex buf format fail\n");
127
128
129 {
130 const enum tgsi_semantic semantic_names[] = { TGSI_SEMANTIC_POSITION,
131 TGSI_SEMANTIC_GENERIC
132 };
133 const uint semantic_indexes[] = { 0, 0 };
134 p->passvs = util_make_vertex_passthrough_shader(p->pipe, 2,
135 semantic_names,
136 semantic_indexes, FALSE);
137 }
138
139 p->framebuffer.nr_cbufs = 1;
140
141 p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM;
142
143 return p;
144 }
145