1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 VMware, Inc.  All rights reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Author:
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Keith Whitwell <keith@tungstengraphics.com>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vbuf.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pstipple.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_exec.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl/vl_decoder.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl/vl_video_buffer.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_clear.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_context.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_flush.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_prim_vbuf.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_state.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_surface.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_tile_cache.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_tex_tile_cache.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_texture.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_query.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sp_screen.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map any drawing surfaces which aren't already mapped
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_map_transfers(struct softpipe_context *sp)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < sp->framebuffer.nr_cbufs; i++) {
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sp_tile_cache_map_transfers(sp->cbuf_cache[i]);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sp_tile_cache_map_transfers(sp->zsbuf_cache);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unmap any mapped drawing surfaces
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_unmap_transfers(struct softpipe_context *sp)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < sp->framebuffer.nr_cbufs; i++) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sp_tile_cache_unmap_transfers(sp->cbuf_cache[i]);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sp_tile_cache_unmap_transfers(sp->zsbuf_cache);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_destroy( struct pipe_context *pipe )
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct softpipe_context *softpipe = softpipe_context( pipe );
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i, sh;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_HELPER_MODULE
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->pstipple.sampler)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe->delete_sampler_state(pipe, softpipe->pstipple.sampler);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&softpipe->pstipple.texture, NULL);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_sampler_view_reference(&softpipe->pstipple.sampler_view, NULL);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->draw)
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw_destroy( softpipe->draw );
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->quad.shade)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->quad.shade->destroy( softpipe->quad.shade );
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->quad.depth_test)
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->quad.depth_test->destroy( softpipe->quad.depth_test );
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->quad.blend)
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->quad.blend->destroy( softpipe->quad.blend );
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->quad.pstipple)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->quad.pstipple->destroy( softpipe->quad.pstipple );
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sp_destroy_tile_cache(softpipe->cbuf_cache[i]);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_surface_reference(&softpipe->framebuffer.cbufs[i], NULL);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sp_destroy_tile_cache(softpipe->zsbuf_cache);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_surface_reference(&softpipe->framebuffer.zsbuf, NULL);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) {
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sp_destroy_tex_tile_cache(softpipe->tex_cache[sh][i]);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_sampler_view_reference(&softpipe->sampler_views[sh][i], NULL);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (sh = 0; sh < Elements(softpipe->constants); sh++) {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(softpipe->constants[0]); i++) {
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (softpipe->constants[sh][i]) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pipe_resource_reference(&softpipe->constants[sh][i], NULL);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < softpipe->num_vertex_buffers; i++) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tgsi_exec_machine_destroy(softpipe->fs_machine);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE( softpipe );
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if (the texture is being used as a framebuffer surface)
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    return SP_REFERENCED_FOR_WRITE
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else if (the texture is a bound texture source)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    return SP_REFERENCED_FOR_READ
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    return SP_UNREFERENCED
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_is_resource_referenced( struct pipe_context *pipe,
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct pipe_resource *texture,
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 unsigned level, int layer)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct softpipe_context *softpipe = softpipe_context( pipe );
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, sh;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texture->target == PIPE_BUFFER)
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SP_UNREFERENCED;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check if any of the bound drawing surfaces are this texture */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (softpipe->dirty_render_cache) {
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (softpipe->framebuffer.cbufs[i] &&
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             softpipe->framebuffer.cbufs[i]->texture == texture) {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return SP_REFERENCED_FOR_WRITE;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (softpipe->framebuffer.zsbuf &&
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          softpipe->framebuffer.zsbuf->texture == texture) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return SP_REFERENCED_FOR_WRITE;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check if any of the tex_cache textures are this texture */
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) {
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (softpipe->tex_cache[sh][i] &&
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             softpipe->tex_cache[sh][i]->texture == texture)
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return SP_REFERENCED_FOR_READ;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return SP_UNREFERENCED;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_render_condition( struct pipe_context *pipe,
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct pipe_query *query,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           uint mode )
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct softpipe_context *softpipe = softpipe_context( pipe );
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->render_cond_query = query;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->render_cond_mode = mode;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_context *
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoftpipe_create_context( struct pipe_screen *screen,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 void *priv )
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct softpipe_screen *sp_screen = softpipe_screen(screen);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i, sh;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_init_math();
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE );
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE );
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.screen = screen;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.destroy = softpipe_destroy;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.priv = priv;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* state setters */
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_blend_funcs(&softpipe->pipe);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_clip_funcs(&softpipe->pipe);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_query_funcs( softpipe );
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_rasterizer_funcs(&softpipe->pipe);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_sampler_funcs(&softpipe->pipe);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_shader_funcs(&softpipe->pipe);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_streamout_funcs(&softpipe->pipe);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_texture_funcs( &softpipe->pipe );
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_init_vertex_funcs(&softpipe->pipe);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.draw_vbo = softpipe_draw_vbo;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.clear = softpipe_clear;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.flush = softpipe_flush_wrapped;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.render_condition = softpipe_render_condition;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.create_video_decoder = vl_create_decoder;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pipe.create_video_buffer = vl_video_buffer_create;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Alloc caches for accessing drawing surfaces and textures.
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Must be before quad stage setup!
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->cbuf_cache[i] = sp_create_tile_cache( &softpipe->pipe );
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->zsbuf_cache = sp_create_tile_cache( &softpipe->pipe );
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Allocate texture caches */
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (sh = 0; sh < Elements(softpipe->tex_cache); sh++) {
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(softpipe->tex_cache[0]); i++) {
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         softpipe->tex_cache[sh][i] = sp_create_tex_tile_cache(&softpipe->pipe);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!softpipe->tex_cache[sh][i])
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            goto fail;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->fs_machine = tgsi_exec_machine_create();
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* setup quad rendering stages */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->quad.shade = sp_quad_shade_stage(softpipe);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->quad.blend = sp_quad_blend_stage(softpipe);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->quad.pstipple = sp_quad_polygon_stipple_stage(softpipe);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Create drawing context and plug our rendering stage into it.
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sp_screen->use_llvm)
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->draw = draw_create(&softpipe->pipe);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->draw = draw_create_no_llvm(&softpipe->pipe);
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!softpipe->draw)
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_texture_samplers(softpipe->draw,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         PIPE_SHADER_VERTEX,
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         PIPE_MAX_SAMPLERS,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         (struct tgsi_sampler **)
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            softpipe->tgsi.samplers_list[PIPE_SHADER_VERTEX]);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_texture_samplers(softpipe->draw,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         PIPE_SHADER_GEOMETRY,
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         PIPE_MAX_SAMPLERS,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         (struct tgsi_sampler **)
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            softpipe->tgsi.samplers_list[PIPE_SHADER_GEOMETRY]);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE ))
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      softpipe->no_rast = TRUE;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->vbuf_backend = sp_create_vbuf_backend(softpipe);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!softpipe->vbuf_backend)
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->vbuf = draw_vbuf_stage(softpipe->draw, softpipe->vbuf_backend);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!softpipe->vbuf)
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_set_rasterize_stage(softpipe->draw, softpipe->vbuf);
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_set_render(softpipe->draw, softpipe->vbuf_backend);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* plug in AA line/point stages */
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_install_aaline_stage(softpipe->draw, &softpipe->pipe);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do polygon stipple w/ texture map + frag prog? */
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_DRAW_MODULE
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_wide_point_sprites(softpipe->draw, TRUE);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sp_init_surface_functions(softpipe);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DO_PSTIPPLE_IN_HELPER_MODULE
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* create the polgon stipple sampler */
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe->pstipple.sampler = util_pstipple_create_sampler(&softpipe->pipe);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &softpipe->pipe;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   softpipe_destroy(&softpipe->pipe);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
338