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_inlines.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_simple_list.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_clear.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_context.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_flush.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_perf.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_state.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_surface.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_query.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_setup.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** shared by all contexts */ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned llvmpipe_variant_count; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void llvmpipe_destroy( struct pipe_context *pipe ) 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe ); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_print_counters(); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This will also destroy llvmpipe->setup: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->draw) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_destroy( llvmpipe->draw ); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&llvmpipe->framebuffer.cbufs[i], NULL); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&llvmpipe->framebuffer.zsbuf, NULL); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(llvmpipe->sampler_views[0]); i++) { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_FRAGMENT][i], NULL); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(llvmpipe->sampler_views[0]); i++) { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_VERTEX][i], NULL); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(llvmpipe->constants); i++) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < Elements(llvmpipe->constants[i]); j++) { 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&llvmpipe->constants[i][j], NULL); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < llvmpipe->num_vertex_buffers; i++) { 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&llvmpipe->vertex_buffer[i].buffer, NULL); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_delete_setup_variants(llvmpipe); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org align_free( llvmpipe ); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo_flush( struct pipe_context *pipe, 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_fence_handle **fence) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_flush(pipe, fence, __FUNCTION__); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgllvmpipe_render_condition ( struct pipe_context *pipe, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_query *query, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint mode ) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe ); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->render_cond_query = query; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->render_cond_mode = mode; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_context * 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgllvmpipe_create_context( struct pipe_screen *screen, void *priv ) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_context *llvmpipe; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe = align_malloc(sizeof(struct llvmpipe_context), 16); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!llvmpipe) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_init_math(); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(llvmpipe, 0, sizeof *llvmpipe); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org make_empty_list(&llvmpipe->fs_variants_list); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org make_empty_list(&llvmpipe->setup_variants_list); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.screen = screen; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.priv = priv; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Init the pipe context methods */ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.destroy = llvmpipe_destroy; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.set_framebuffer_state = llvmpipe_set_framebuffer_state; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.clear = llvmpipe_clear; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.flush = do_flush; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->pipe.render_condition = llvmpipe_render_condition; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_blend_funcs(llvmpipe); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_clip_funcs(llvmpipe); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_draw_funcs(llvmpipe); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_sampler_funcs(llvmpipe); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_query_funcs( llvmpipe ); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_vertex_funcs(llvmpipe); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_so_funcs(llvmpipe); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_fs_funcs(llvmpipe); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_vs_funcs(llvmpipe); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_gs_funcs(llvmpipe); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_rasterizer_funcs(llvmpipe); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_context_resource_funcs( &llvmpipe->pipe ); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_init_surface_functions(llvmpipe); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create drawing context and plug our rendering stage into it. 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->draw = draw_create(&llvmpipe->pipe); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!llvmpipe->draw) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: devise alternative to draw_texture_samplers */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->setup = lp_setup_create( &llvmpipe->pipe, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->draw ); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!llvmpipe->setup) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* plug in AA line/point stages */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_aaline_stage(llvmpipe->draw, &llvmpipe->pipe); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_aapoint_stage(llvmpipe->draw, &llvmpipe->pipe); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_install_pstipple_stage(llvmpipe->draw, &llvmpipe->pipe); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert points and lines into triangles: 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (otherwise, draw points and lines natively) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_point_sprites(llvmpipe->draw, FALSE); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_enable_point_sprites(llvmpipe->draw, FALSE); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_point_threshold(llvmpipe->draw, 10000.0); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_line_threshold(llvmpipe->draw, 10000.0); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_reset_counters(); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &llvmpipe->pipe; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail: 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_destroy(&llvmpipe->pipe); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193