Subversion Repositories Kolibri OS

Rev

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

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2003 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. /**
  29.  * State validation for vertex/fragment shaders.
  30.  * Note that we have to delay most vertex/fragment shader translation
  31.  * until rendering time since the linkage between the vertex outputs and
  32.  * fragment inputs can vary depending on the pairing of shaders.
  33.  *
  34.  * Authors:
  35.  *   Brian Paul
  36.  */
  37.  
  38. #include "main/imports.h"
  39. #include "main/mtypes.h"
  40. #include "program/program.h"
  41.  
  42. #include "pipe/p_context.h"
  43.  
  44. #include "util/u_simple_shaders.h"
  45.  
  46. #include "cso_cache/cso_context.h"
  47.  
  48. #include "st_context.h"
  49. #include "st_atom.h"
  50. #include "st_program.h"
  51.  
  52.  
  53. /**
  54.  * Return pointer to a pass-through fragment shader.
  55.  * This shader is used when a texture is missing/incomplete.
  56.  */
  57. static void *
  58. get_passthrough_fs(struct st_context *st)
  59. {
  60.    if (!st->passthrough_fs) {
  61.       st->passthrough_fs =
  62.          util_make_fragment_passthrough_shader(st->pipe, TGSI_SEMANTIC_COLOR,
  63.                                                TGSI_INTERPOLATE_PERSPECTIVE,
  64.                                                TRUE);
  65.    }
  66.  
  67.    return st->passthrough_fs;
  68. }
  69.  
  70.  
  71. /**
  72.  * Update fragment program state/atom.  This involves translating the
  73.  * Mesa fragment program into a gallium fragment program and binding it.
  74.  */
  75. static void
  76. update_fp( struct st_context *st )
  77. {
  78.    struct st_fragment_program *stfp;
  79.    struct st_fp_variant_key key;
  80.  
  81.    assert(st->ctx->FragmentProgram._Current);
  82.    stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
  83.    assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);
  84.  
  85.    memset(&key, 0, sizeof(key));
  86.    key.st = st;
  87.  
  88.    /* _NEW_FRAG_CLAMP */
  89.    key.clamp_color = st->clamp_frag_color_in_shader &&
  90.                      st->ctx->Color._ClampFragmentColor;
  91.  
  92.    st->fp_variant = st_get_fp_variant(st, stfp, &key);
  93.  
  94.    st_reference_fragprog(st, &st->fp, stfp);
  95.  
  96.    if (st->missing_textures) {
  97.       /* use a pass-through frag shader that uses no textures */
  98.       void *fs = get_passthrough_fs(st);
  99.       cso_set_fragment_shader_handle(st->cso_context, fs);
  100.    }
  101.    else {
  102.       cso_set_fragment_shader_handle(st->cso_context,
  103.                                      st->fp_variant->driver_shader);
  104.    }
  105. }
  106.  
  107.  
  108. const struct st_tracked_state st_update_fp = {
  109.    "st_update_fp",                                      /* name */
  110.    {                                                    /* dirty */
  111.       _NEW_BUFFERS,                                     /* mesa */
  112.       ST_NEW_FRAGMENT_PROGRAM                           /* st */
  113.    },
  114.    update_fp                                    /* update */
  115. };
  116.  
  117.  
  118.  
  119. /**
  120.  * Update vertex program state/atom.  This involves translating the
  121.  * Mesa vertex program into a gallium fragment program and binding it.
  122.  */
  123. static void
  124. update_vp( struct st_context *st )
  125. {
  126.    struct st_vertex_program *stvp;
  127.    struct st_vp_variant_key key;
  128.  
  129.    /* find active shader and params -- Should be covered by
  130.     * ST_NEW_VERTEX_PROGRAM
  131.     */
  132.    assert(st->ctx->VertexProgram._Current);
  133.    stvp = st_vertex_program(st->ctx->VertexProgram._Current);
  134.    assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
  135.  
  136.    memset(&key, 0, sizeof key);
  137.    key.st = st;  /* variants are per-context */
  138.  
  139.    /* When this is true, we will add an extra input to the vertex
  140.     * shader translation (for edgeflags), an extra output with
  141.     * edgeflag semantics, and extend the vertex shader to pass through
  142.     * the input to the output.  We'll need to use similar logic to set
  143.     * up the extra vertex_element input for edgeflags.
  144.     * _NEW_POLYGON, ST_NEW_EDGEFLAGS_DATA
  145.     */
  146.    key.passthrough_edgeflags = (st->vertdata_edgeflags && (
  147.                                 st->ctx->Polygon.FrontMode != GL_FILL ||
  148.                                 st->ctx->Polygon.BackMode != GL_FILL));
  149.  
  150.    key.clamp_color = st->clamp_vert_color_in_shader &&
  151.                      st->ctx->Light._ClampVertexColor;
  152.  
  153.    st->vp_variant = st_get_vp_variant(st, stvp, &key);
  154.  
  155.    st_reference_vertprog(st, &st->vp, stvp);
  156.  
  157.    cso_set_vertex_shader_handle(st->cso_context,
  158.                                 st->vp_variant->driver_shader);
  159.  
  160.    st->vertex_result_to_slot = stvp->result_to_output;
  161. }
  162.  
  163.  
  164. const struct st_tracked_state st_update_vp = {
  165.    "st_update_vp",                                      /* name */
  166.    {                                                    /* dirty */
  167.       _NEW_POLYGON,                                     /* mesa */
  168.       ST_NEW_VERTEX_PROGRAM | ST_NEW_EDGEFLAGS_DATA     /* st */
  169.    },
  170.    update_vp                                            /* update */
  171. };
  172.  
  173.  
  174.  
  175. static void
  176. update_gp( struct st_context *st )
  177. {
  178.    struct st_geometry_program *stgp;
  179.    struct st_gp_variant_key key;
  180.  
  181.    if (!st->ctx->GeometryProgram._Current) {
  182.       cso_set_geometry_shader_handle(st->cso_context, NULL);
  183.       return;
  184.    }
  185.  
  186.    stgp = st_geometry_program(st->ctx->GeometryProgram._Current);
  187.    assert(stgp->Base.Base.Target == MESA_GEOMETRY_PROGRAM);
  188.  
  189.    memset(&key, 0, sizeof(key));
  190.    key.st = st;
  191.  
  192.    st->gp_variant = st_get_gp_variant(st, stgp, &key);
  193.  
  194.    st_reference_geomprog(st, &st->gp, stgp);
  195.  
  196.    cso_set_geometry_shader_handle(st->cso_context,
  197.                                   st->gp_variant->driver_shader);
  198. }
  199.  
  200. const struct st_tracked_state st_update_gp = {
  201.    "st_update_gp",                      /* name */
  202.    {                                    /* dirty */
  203.       0,                                /* mesa */
  204.       ST_NEW_GEOMETRY_PROGRAM           /* st */
  205.    },
  206.    update_gp                            /* update */
  207. };
  208.