pp_program.c revision 4703f50e96fe3a9db039f59e154e15c06c3f8367
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 */
40struct program *
41pp_init_prog(struct pp_queue_t *ppq, struct pipe_screen *pscreen)
42{
43
44   struct program *p = CALLOC(1, sizeof(struct program));
45
46   pp_debug("Initializing program\n");
47   if (!pscreen)
48      return NULL;
49
50   if (!p)
51      return NULL;
52
53   p->screen = pscreen;
54   p->pipe = pscreen->context_create(pscreen, NULL);
55   p->cso = cso_create_context(p->pipe);
56
57   {
58      static const float verts[4][2][4] = {
59         {
60          {1.0f, 1.0f, 0.0f, 1.0f},
61          {1.0f, 1.0f, 0.0f, 1.0f}
62          },
63         {
64          {-1.0f, 1.0f, 0.0f, 1.0f},
65          {0.0f, 1.0f, 0.0f, 1.0f}
66          },
67         {
68          {-1.0f, -1.0f, 0.0f, 1.0f},
69          {0.0f, 0.0f, 0.0f, 1.0f}
70          },
71         {
72          {1.0f, -1.0f, 0.0f, 1.0f},
73          {1.0f, 0.0f, 0.0f, 1.0f}
74          }
75      };
76
77      p->vbuf = pipe_buffer_create(pscreen, PIPE_BIND_VERTEX_BUFFER,
78                                   PIPE_USAGE_STATIC, sizeof(verts));
79      pipe_buffer_write(p->pipe, p->vbuf, 0, sizeof(verts), verts);
80   }
81
82   p->blend.rt[0].colormask = PIPE_MASK_RGBA;
83   p->blend.rt[0].rgb_src_factor = p->blend.rt[0].alpha_src_factor =
84      PIPE_BLENDFACTOR_SRC_ALPHA;
85   p->blend.rt[0].rgb_dst_factor = p->blend.rt[0].alpha_dst_factor =
86      PIPE_BLENDFACTOR_INV_SRC_ALPHA;
87
88   p->rasterizer.cull_face = PIPE_FACE_NONE;
89   p->rasterizer.gl_rasterization_rules = 1;
90
91   p->sampler.wrap_s = p->sampler.wrap_t = p->sampler.wrap_r =
92      PIPE_TEX_WRAP_CLAMP_TO_EDGE;
93
94   p->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
95   p->sampler.min_img_filter = p->sampler.mag_img_filter =
96      PIPE_TEX_FILTER_LINEAR;
97   p->sampler.normalized_coords = 1;
98
99   p->sampler_point.wrap_s = p->sampler_point.wrap_t =
100      p->sampler_point.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
101   p->sampler_point.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
102   p->sampler_point.min_img_filter = p->sampler_point.mag_img_filter =
103      PIPE_TEX_FILTER_NEAREST;
104   p->sampler_point.normalized_coords = 1;
105
106   p->velem[0].src_offset = 0;
107   p->velem[0].instance_divisor = 0;
108   p->velem[0].vertex_buffer_index = 0;
109   p->velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
110   p->velem[1].src_offset = 1 * 4 * sizeof(float);
111   p->velem[1].instance_divisor = 0;
112   p->velem[1].vertex_buffer_index = 0;
113   p->velem[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
114
115   if (!p->screen->is_format_supported(p->screen,
116                                       PIPE_FORMAT_R32G32B32A32_FLOAT,
117                                       PIPE_BUFFER, 1,
118                                       PIPE_BIND_VERTEX_BUFFER))
119      pp_debug("Vertex buf format fail\n");
120
121
122   {
123      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
124         TGSI_SEMANTIC_GENERIC
125      };
126      const uint semantic_indexes[] = { 0, 0 };
127      p->passvs = util_make_vertex_passthrough_shader(p->pipe, 2,
128                                                      semantic_names,
129                                                      semantic_indexes);
130   }
131
132   p->framebuffer.nr_cbufs = 1;
133
134   p->surf.usage = PIPE_BIND_RENDER_TARGET;
135   p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM;
136
137   p->pipe->set_sample_mask(p->pipe, ~0);
138
139   return p;
140}
141