Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28. #include "pipe/p_defines.h"
  29. #include "util/u_memory.h"
  30. #include "lp_context.h"
  31. #include "lp_state.h"
  32. #include "lp_setup.h"
  33. #include "draw/draw_context.h"
  34.  
  35. struct lp_rast_state {
  36.    struct pipe_rasterizer_state lp_state;
  37.    struct pipe_rasterizer_state draw_state;
  38. };
  39.  
  40. /* State which might be handled in either the draw module or locally.
  41.  * This function is used to turn that state off in one of the two
  42.  * places.
  43.  */
  44. static void
  45. clear_flags(struct pipe_rasterizer_state *rast)
  46. {
  47.    rast->light_twoside = 0;
  48.    rast->offset_tri = 0;
  49.    rast->offset_line = 0;
  50.    rast->offset_point = 0;
  51.    rast->offset_units = 0.0f;
  52.    rast->offset_scale = 0.0f;
  53. }
  54.  
  55.  
  56.  
  57. static void *
  58. llvmpipe_create_rasterizer_state(struct pipe_context *pipe,
  59.                                  const struct pipe_rasterizer_state *rast)
  60. {
  61.    boolean need_pipeline;
  62.  
  63.    /* Partition rasterizer state into what we want the draw module to
  64.     * handle, and what we'll look after ourselves.
  65.     */
  66.    struct lp_rast_state *state = MALLOC_STRUCT(lp_rast_state);
  67.    if (state == NULL)
  68.       return NULL;
  69.  
  70.    memcpy(&state->draw_state, rast, sizeof *rast);
  71.    memcpy(&state->lp_state, rast, sizeof *rast);
  72.  
  73.    /* We rely on draw module to do unfilled polyons, AA lines and
  74.     * points and stipple.
  75.     *
  76.     * Over time, reduce this list of conditions, and expand the list
  77.     * of flags which get cleared in clear_flags().
  78.     */
  79.    need_pipeline = (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
  80.                     rast->fill_back != PIPE_POLYGON_MODE_FILL ||
  81.                     rast->offset_point ||
  82.                     rast->offset_line ||
  83.                     rast->point_smooth ||
  84.                     rast->line_smooth ||
  85.                     rast->line_stipple_enable ||
  86.                     rast->poly_stipple_enable);
  87.  
  88.    /* If not using the pipeline, clear out the flags which we can
  89.     * handle ourselves.  If we *are* using the pipeline, do everything
  90.     * on the pipeline and clear those flags on our internal copy of
  91.     * the state.
  92.     */
  93.    if (need_pipeline)
  94.       clear_flags(&state->lp_state);
  95.    else
  96.       clear_flags(&state->draw_state);
  97.  
  98.    return state;
  99. }
  100.  
  101.  
  102.  
  103. static void
  104. llvmpipe_bind_rasterizer_state(struct pipe_context *pipe, void *handle)
  105. {
  106.    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
  107.    const struct lp_rast_state *state =
  108.       (const struct lp_rast_state *) handle;
  109.  
  110.    if (state) {
  111.       llvmpipe->rasterizer = &state->lp_state;
  112.       draw_set_rasterizer_state(llvmpipe->draw, &state->draw_state, handle);
  113.  
  114.       /* XXX: just pass lp_state directly to setup.
  115.        */
  116.       lp_setup_set_triangle_state( llvmpipe->setup,
  117.                                   state->lp_state.cull_face,
  118.                                   state->lp_state.front_ccw,
  119.                                   state->lp_state.scissor,
  120.                                   state->lp_state.half_pixel_center,
  121.                                   state->lp_state.bottom_edge_rule);
  122.       lp_setup_set_flatshade_first( llvmpipe->setup,
  123.                                     state->lp_state.flatshade_first);
  124.       lp_setup_set_rasterizer_discard( llvmpipe->setup,
  125.                                     state->lp_state.rasterizer_discard);
  126.       lp_setup_set_line_state( llvmpipe->setup,
  127.                               state->lp_state.line_width);
  128.       lp_setup_set_point_state( llvmpipe->setup,
  129.                                state->lp_state.point_size,
  130.                                state->lp_state.point_size_per_vertex,
  131.                                state->lp_state.sprite_coord_enable,
  132.                                state->lp_state.sprite_coord_mode);
  133.    }
  134.    else {
  135.       llvmpipe->rasterizer = NULL;
  136.       draw_set_rasterizer_state(llvmpipe->draw, NULL, handle);      
  137.    }
  138.  
  139.    llvmpipe->dirty |= LP_NEW_RASTERIZER;
  140. }
  141.  
  142.  
  143. static void
  144. llvmpipe_delete_rasterizer_state(struct pipe_context *pipe,
  145.                                  void *rasterizer)
  146. {
  147.    FREE( rasterizer );
  148. }
  149.  
  150.  
  151.  
  152. void
  153. llvmpipe_init_rasterizer_funcs(struct llvmpipe_context *llvmpipe)
  154. {
  155.    llvmpipe->pipe.create_rasterizer_state = llvmpipe_create_rasterizer_state;
  156.    llvmpipe->pipe.bind_rasterizer_state   = llvmpipe_bind_rasterizer_state;
  157.    llvmpipe->pipe.delete_rasterizer_state = llvmpipe_delete_rasterizer_state;
  158. }
  159.