Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 VMware, Inc.
  4.  * All Rights Reserved.
  5.  * Copyright 2008 VMware, Inc.  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 VMWARE AND/OR ITS SUPPLIERS 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. /* Author:
  30.  *    Keith Whitwell <keithw@vmware.com>
  31.  */
  32.  
  33. #include "draw/draw_context.h"
  34. #include "draw/draw_vbuf.h"
  35. #include "pipe/p_defines.h"
  36. #include "util/u_inlines.h"
  37. #include "util/u_math.h"
  38. #include "util/u_memory.h"
  39. #include "util/simple_list.h"
  40. #include "lp_clear.h"
  41. #include "lp_context.h"
  42. #include "lp_flush.h"
  43. #include "lp_perf.h"
  44. #include "lp_state.h"
  45. #include "lp_surface.h"
  46. #include "lp_query.h"
  47. #include "lp_setup.h"
  48.  
  49. /* This is only safe if there's just one concurrent context */
  50. #ifdef PIPE_SUBSYSTEM_EMBEDDED
  51. #define USE_GLOBAL_LLVM_CONTEXT
  52. #endif
  53.  
  54. static void llvmpipe_destroy( struct pipe_context *pipe )
  55. {
  56.    struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe );
  57.    uint i, j;
  58.  
  59.    lp_print_counters();
  60.  
  61.    if (llvmpipe->blitter) {
  62.       util_blitter_destroy(llvmpipe->blitter);
  63.    }
  64.  
  65.    /* This will also destroy llvmpipe->setup:
  66.     */
  67.    if (llvmpipe->draw)
  68.       draw_destroy( llvmpipe->draw );
  69.  
  70.    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
  71.       pipe_surface_reference(&llvmpipe->framebuffer.cbufs[i], NULL);
  72.    }
  73.  
  74.    pipe_surface_reference(&llvmpipe->framebuffer.zsbuf, NULL);
  75.  
  76.    for (i = 0; i < Elements(llvmpipe->sampler_views[0]); i++) {
  77.       pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_FRAGMENT][i], NULL);
  78.    }
  79.  
  80.    for (i = 0; i < Elements(llvmpipe->sampler_views[0]); i++) {
  81.       pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_VERTEX][i], NULL);
  82.    }
  83.  
  84.    for (i = 0; i < Elements(llvmpipe->sampler_views[0]); i++) {
  85.       pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_GEOMETRY][i], NULL);
  86.    }
  87.  
  88.    for (i = 0; i < Elements(llvmpipe->constants); i++) {
  89.       for (j = 0; j < Elements(llvmpipe->constants[i]); j++) {
  90.          pipe_resource_reference(&llvmpipe->constants[i][j].buffer, NULL);
  91.       }
  92.    }
  93.  
  94.    for (i = 0; i < llvmpipe->num_vertex_buffers; i++) {
  95.       pipe_resource_reference(&llvmpipe->vertex_buffer[i].buffer, NULL);
  96.    }
  97.  
  98.    lp_delete_setup_variants(llvmpipe);
  99.  
  100. #ifndef USE_GLOBAL_LLVM_CONTEXT
  101.    LLVMContextDispose(llvmpipe->context);
  102. #endif
  103.    llvmpipe->context = NULL;
  104.  
  105.    align_free( llvmpipe );
  106. }
  107.  
  108. static void
  109. do_flush( struct pipe_context *pipe,
  110.           struct pipe_fence_handle **fence,
  111.           unsigned flags)
  112. {
  113.    llvmpipe_flush(pipe, fence, __FUNCTION__);
  114. }
  115.  
  116.  
  117. static void
  118. llvmpipe_render_condition ( struct pipe_context *pipe,
  119.                             struct pipe_query *query,
  120.                             boolean condition,
  121.                             uint mode )
  122. {
  123.    struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe );
  124.  
  125.    llvmpipe->render_cond_query = query;
  126.    llvmpipe->render_cond_mode = mode;
  127.    llvmpipe->render_cond_cond = condition;
  128. }
  129.  
  130. struct pipe_context *
  131. llvmpipe_create_context( struct pipe_screen *screen, void *priv )
  132. {
  133.    struct llvmpipe_context *llvmpipe;
  134.  
  135.    llvmpipe = align_malloc(sizeof(struct llvmpipe_context), 16);
  136.    if (!llvmpipe)
  137.       return NULL;
  138.  
  139.    util_init_math();
  140.  
  141.    memset(llvmpipe, 0, sizeof *llvmpipe);
  142.  
  143.    make_empty_list(&llvmpipe->fs_variants_list);
  144.  
  145.    make_empty_list(&llvmpipe->setup_variants_list);
  146.  
  147.  
  148.    llvmpipe->pipe.screen = screen;
  149.    llvmpipe->pipe.priv = priv;
  150.  
  151.    /* Init the pipe context methods */
  152.    llvmpipe->pipe.destroy = llvmpipe_destroy;
  153.    llvmpipe->pipe.set_framebuffer_state = llvmpipe_set_framebuffer_state;
  154.    llvmpipe->pipe.clear = llvmpipe_clear;
  155.    llvmpipe->pipe.flush = do_flush;
  156.  
  157.    llvmpipe->pipe.render_condition = llvmpipe_render_condition;
  158.  
  159.    llvmpipe_init_blend_funcs(llvmpipe);
  160.    llvmpipe_init_clip_funcs(llvmpipe);
  161.    llvmpipe_init_draw_funcs(llvmpipe);
  162.    llvmpipe_init_sampler_funcs(llvmpipe);
  163.    llvmpipe_init_query_funcs( llvmpipe );
  164.    llvmpipe_init_vertex_funcs(llvmpipe);
  165.    llvmpipe_init_so_funcs(llvmpipe);
  166.    llvmpipe_init_fs_funcs(llvmpipe);
  167.    llvmpipe_init_vs_funcs(llvmpipe);
  168.    llvmpipe_init_gs_funcs(llvmpipe);
  169.    llvmpipe_init_rasterizer_funcs(llvmpipe);
  170.    llvmpipe_init_context_resource_funcs( &llvmpipe->pipe );
  171.    llvmpipe_init_surface_functions(llvmpipe);
  172.  
  173. #ifdef USE_GLOBAL_LLVM_CONTEXT
  174.    llvmpipe->context = LLVMGetGlobalContext();
  175. #else
  176.    llvmpipe->context = LLVMContextCreate();
  177. #endif
  178.  
  179.    if (!llvmpipe->context)
  180.       goto fail;
  181.  
  182.    /*
  183.     * Create drawing context and plug our rendering stage into it.
  184.     */
  185.    llvmpipe->draw = draw_create_with_llvm_context(&llvmpipe->pipe,
  186.                                                   llvmpipe->context);
  187.    if (!llvmpipe->draw)
  188.       goto fail;
  189.  
  190.    /* FIXME: devise alternative to draw_texture_samplers */
  191.  
  192.    llvmpipe->setup = lp_setup_create( &llvmpipe->pipe,
  193.                                       llvmpipe->draw );
  194.    if (!llvmpipe->setup)
  195.       goto fail;
  196.  
  197.    llvmpipe->blitter = util_blitter_create(&llvmpipe->pipe);
  198.    if (!llvmpipe->blitter) {
  199.       goto fail;
  200.    }
  201.  
  202.    /* must be done before installing Draw stages */
  203.    util_blitter_cache_all_shaders(llvmpipe->blitter);
  204.  
  205.    /* plug in AA line/point stages */
  206.    draw_install_aaline_stage(llvmpipe->draw, &llvmpipe->pipe);
  207.    draw_install_aapoint_stage(llvmpipe->draw, &llvmpipe->pipe);
  208.    draw_install_pstipple_stage(llvmpipe->draw, &llvmpipe->pipe);
  209.  
  210.    /* convert points and lines into triangles:
  211.     * (otherwise, draw points and lines natively)
  212.     */
  213.    draw_wide_point_sprites(llvmpipe->draw, FALSE);
  214.    draw_enable_point_sprites(llvmpipe->draw, FALSE);
  215.    draw_wide_point_threshold(llvmpipe->draw, 10000.0);
  216.    draw_wide_line_threshold(llvmpipe->draw, 10000.0);
  217.  
  218.    lp_reset_counters();
  219.  
  220.    return &llvmpipe->pipe;
  221.  
  222.  fail:
  223.    llvmpipe_destroy(&llvmpipe->pipe);
  224.    return NULL;
  225. }
  226.  
  227.