1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 Jorge Jimenez (jorge@iryoku.com)
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 Belen Masia (bmasia@unizar.es)
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 Jose I. Echevarria (joseignacioechevarria@gmail.com)
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 Fernando Navarro (fernandn@microsoft.com)
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 Diego Gutierrez (diegog@unizar.es)
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2011 Lauri Kasanen (cand@gmx.com)
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All rights reserved.
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Redistribution and use in source and binary forms, with or without
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modification, are permitted provided that the following conditions are met:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    1. Redistributions of source code must retain the above copyright notice,
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       this list of conditions and the following disclaimer.
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    2. Redistributions in binary form must reproduce the following statement:
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       "Uses Jimenez's MLAA. Copyright (C) 2010 by Jorge Jimenez, Belen Masia,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *        Jose I. Echevarria, Fernando Navarro and Diego Gutierrez."
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       Only for use in the Mesa project, this point 2 is filled by naming the
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *       technique Jimenez's MLAA in the Mesa config options.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * POSSIBILITY OF SUCH DAMAGE.
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The views and conclusions contained in the software and documentation are
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * those of the authors and should not be interpreted as representing official
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * policies, either expressed or implied, of the copyright holders.
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "postprocess/postprocess.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "postprocess/pp_mlaa.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "postprocess/pp_filters.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blit.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_box.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_string.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMM_SPACE 80
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic float constants[] = { 1, 1, 0, 0 };
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned int dimensions[2] = { 0, 0 };
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *constbuf, *areamaptex;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Upload the constants. */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgup_consts(struct pipe_context *pipe)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_box box;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_box_2d(0, 0, sizeof(constants), 1, &box);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->transfer_inline_write(pipe, constbuf, 0, PIPE_TRANSFER_WRITE,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               &box, constants, sizeof(constants),
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               sizeof(constants));
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Run function of the MLAA filter. */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct pipe_resource *out, unsigned int n, bool iscolor)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct program *p = ppq->p;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_depth_stencil_alpha_state mstencil;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view v_tmp, *arr[3];
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int w = p->framebuffer.width;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int h = p->framebuffer.height;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct pipe_stencil_ref ref = { {1} };
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&mstencil, 0, sizeof(mstencil));
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_stencil_ref(p->cso, &ref);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Init the pixel size constant */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimensions[0] != p->framebuffer.width ||
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dimensions[1] != p->framebuffer.height) {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      constants[0] = 1.0 / p->framebuffer.width;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      constants[1] = 1.0 / p->framebuffer.height;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      up_consts(p->pipe);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dimensions[0] = p->framebuffer.width;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dimensions[1] = p->framebuffer.height;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_set_constant_buffer(p->pipe, PIPE_SHADER_VERTEX, 0, constbuf);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_set_constant_buffer(p->pipe, PIPE_SHADER_FRAGMENT, 0, constbuf);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].enabled = 1;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].valuemask = mstencil.stencil[0].writemask = ~0;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].func = PIPE_FUNC_ALWAYS;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->framebuffer.zsbuf = ppq->stencils;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* First pass: depth edge detection */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (iscolor)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_filter_setup_in(p, in);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_filter_setup_in(p, ppq->depth);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_setup_out(p, ppq->inner_tmp[0]);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_set_fb(p);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_misc_state(p);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_depth_stencil_alpha(p->cso, &mstencil);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->pipe->clear(p->pipe, PIPE_CLEAR_STENCIL | PIPE_CLEAR_COLOR,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  &p->clear_color, 0, 0);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler_done(p->cso, PIPE_SHADER_FRAGMENT);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_sampler_views(p->cso, PIPE_SHADER_FRAGMENT, 1, &p->view);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_shader_handle(p->cso, ppq->shaders[n][1]);    /* offsetvs */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_fragment_shader_handle(p->cso, ppq->shaders[n][2]);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_draw(p);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_end_pass(p);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Second pass: blend weights */
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Sampler order: areamap, edgesmap, edgesmapL (reversed, thx compiler) */
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].func = PIPE_FUNC_EQUAL;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mstencil.stencil[0].zpass_op = PIPE_STENCIL_OP_KEEP;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_depth_stencil_alpha(p->cso, &mstencil);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_setup_in(p, areamaptex);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_setup_out(p, ppq->inner_tmp[1]);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_sampler_view_default_template(&v_tmp, ppq->inner_tmp[0],
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   ppq->inner_tmp[0]->format);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arr[1] = arr[2] = p->pipe->create_sampler_view(p->pipe,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  ppq->inner_tmp[0], &v_tmp);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_set_clear_fb(p);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 1, &p->sampler_point);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 2, &p->sampler);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler_done(p->cso, PIPE_SHADER_FRAGMENT);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arr[0] = p->view;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_sampler_views(p->cso, PIPE_SHADER_FRAGMENT, 3, arr);
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_shader_handle(p->cso, ppq->shaders[n][0]);    /* passvs */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_fragment_shader_handle(p->cso, ppq->shaders[n][3]);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_draw(p);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_end_pass(p);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_sampler_view_reference(&arr[1], NULL);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Third pass: smoothed edges */
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Sampler order: colormap, blendmap (wtf compiler) */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_setup_in(p, ppq->inner_tmp[1]);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_setup_out(p, out);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_set_fb(p);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Blit the input to the output */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_blit_pixels(p->blitctx, in, 0, 0, 0,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    w, h, 0, p->framebuffer.cbufs[0],
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    0, 0, w, h, 0, PIPE_TEX_MIPFILTER_NEAREST,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    TGSI_WRITEMASK_XYZW, 0);
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_sampler_view_default_template(&v_tmp, in, in->format);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arr[0] = p->pipe->create_sampler_view(p->pipe, in, &v_tmp);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 1, &p->sampler_point);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler_done(p->cso, PIPE_SHADER_FRAGMENT);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arr[1] = p->view;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_sampler_views(p->cso, PIPE_SHADER_FRAGMENT, 2, arr);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_shader_handle(p->cso, ppq->shaders[n][1]);    /* offsetvs */
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_fragment_shader_handle(p->cso, ppq->shaders[n][4]);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->blend.rt[0].blend_enable = 1;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_blend(p->cso, &p->blend);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_draw(p);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_filter_end_pass(p);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_sampler_view_reference(&arr[0], NULL);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->blend.rt[0].blend_enable = 0;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->framebuffer.zsbuf = NULL;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** The init function of the MLAA filter. */
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa_init_run(struct pp_queue_t *ppq, unsigned int n,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned int val, bool iscolor)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_box box;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource res;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *tmp_text;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   constbuf = pipe_buffer_create(ppq->p->screen, PIPE_BIND_CONSTANT_BUFFER,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 PIPE_USAGE_STATIC, sizeof(constants));
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!constbuf) {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_debug("Failed to allocate constant buffer\n");
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_debug("mlaa: using %u max search steps\n", val);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tmp_text = CALLOC(sizeof(blend2fs_1) + sizeof(blend2fs_2) +
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     IMM_SPACE, sizeof(char));
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tmp_text) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_debug("Failed to allocate shader space\n");
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_sprintf(tmp_text, "%s"
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                "IMM FLT32 {    %.8f,     0.0000,     0.0000,     0.0000}\n"
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                "%s\n", blend2fs_1, (float) val, blend2fs_2);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&res, 0, sizeof(res));
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.target = PIPE_TEXTURE_2D;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.format = PIPE_FORMAT_R8G8_UNORM;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.width0 = res.height0 = 165;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.bind = PIPE_BIND_SAMPLER_VIEW;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.usage = PIPE_USAGE_STATIC;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   res.depth0 = res.array_size = res.nr_samples = 1;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ppq->p->screen->is_format_supported(ppq->p->screen, res.format,
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            res.target, 1, res.bind))
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pp_debug("Areamap format not supported\n");
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   areamaptex = ppq->p->screen->resource_create(ppq->p->screen, &res);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_box_2d(0, 0, 165, 165, &box);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ppq->p->pipe->transfer_inline_write(ppq->p->pipe, areamaptex, 0,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       PIPE_TRANSFER_WRITE, &box,
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       areamap, 165 * 2, sizeof(areamap));
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ppq->shaders[n][1] = pp_tgsi_to_state(ppq->p->pipe, offsetvs, true,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         "offsetvs");
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (iscolor)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ppq->shaders[n][2] = pp_tgsi_to_state(ppq->p->pipe, color1fs,
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            false, "color1fs");
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ppq->shaders[n][2] = pp_tgsi_to_state(ppq->p->pipe, depth1fs,
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            false, "depth1fs");
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ppq->shaders[n][3] = pp_tgsi_to_state(ppq->p->pipe, tmp_text, false,
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         "blend2fs");
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ppq->shaders[n][4] = pp_tgsi_to_state(ppq->p->pipe, neigh3fs, false,
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         "neigh3fs");
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(tmp_text);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Short wrapper to init the depth version. */
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa_init(struct pp_queue_t *ppq, unsigned int n, unsigned int val)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_jimenezmlaa_init_run(ppq, n, val, false);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Short wrapper to init the color version. */
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa_init_color(struct pp_queue_t *ppq, unsigned int n,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned int val)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_jimenezmlaa_init_run(ppq, n, val, true);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Short wrapper to run the depth version. */
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa(struct pp_queue_t *ppq, struct pipe_resource *in,
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct pipe_resource *out, unsigned int n)
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_jimenezmlaa_run(ppq, in, out, n, false);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Short wrapper to run the color version. */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_jimenezmlaa_color(struct pp_queue_t *ppq, struct pipe_resource *in,
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct pipe_resource *out, unsigned int n)
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pp_jimenezmlaa_run(ppq, in, out, n, true);
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
309