Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2013 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23.  
  24. #include "main/mtypes.h"
  25. #include "program/prog_parameter.h"
  26.  
  27. #include "brw_context.h"
  28. #include "brw_state.h"
  29.  
  30.  
  31. /* Creates a new GS constant buffer reflecting the current GS program's
  32.  * constants, if needed by the GS program.
  33.  *
  34.  * Otherwise, constants go through the CURBEs using the brw_constant_buffer
  35.  * state atom.
  36.  */
  37. static void
  38. brw_upload_gs_pull_constants(struct brw_context *brw)
  39. {
  40.    struct brw_stage_state *stage_state = &brw->gs.base;
  41.  
  42.    /* BRW_NEW_GEOMETRY_PROGRAM */
  43.    struct brw_geometry_program *gp =
  44.       (struct brw_geometry_program *) brw->geometry_program;
  45.  
  46.    if (!gp)
  47.       return;
  48.  
  49.    /* BRW_NEW_GS_PROG_DATA */
  50.    const struct brw_stage_prog_data *prog_data = &brw->gs.prog_data->base.base;
  51.  
  52.    /* _NEW_PROGRAM_CONSTANTS */
  53.    brw_upload_pull_constants(brw, BRW_NEW_GS_CONSTBUF, &gp->program.Base,
  54.                              stage_state, prog_data, false);
  55. }
  56.  
  57. const struct brw_tracked_state brw_gs_pull_constants = {
  58.    .dirty = {
  59.       .mesa = _NEW_PROGRAM_CONSTANTS,
  60.       .brw = BRW_NEW_BATCH |
  61.              BRW_NEW_GEOMETRY_PROGRAM |
  62.              BRW_NEW_GS_PROG_DATA,
  63.    },
  64.    .emit = brw_upload_gs_pull_constants,
  65. };
  66.  
  67. static void
  68. brw_upload_gs_ubo_surfaces(struct brw_context *brw)
  69. {
  70.    struct gl_context *ctx = &brw->ctx;
  71.  
  72.    /* _NEW_PROGRAM */
  73.    struct gl_shader_program *prog =
  74.       ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY];
  75.  
  76.    if (!prog)
  77.       return;
  78.  
  79.    /* BRW_NEW_GS_PROG_DATA */
  80.    brw_upload_ubo_surfaces(brw, prog->_LinkedShaders[MESA_SHADER_GEOMETRY],
  81.                            &brw->gs.base, &brw->gs.prog_data->base.base, false);
  82. }
  83.  
  84. const struct brw_tracked_state brw_gs_ubo_surfaces = {
  85.    .dirty = {
  86.       .mesa = _NEW_PROGRAM,
  87.       .brw = BRW_NEW_BATCH |
  88.              BRW_NEW_GS_PROG_DATA |
  89.              BRW_NEW_UNIFORM_BUFFER,
  90.    },
  91.    .emit = brw_upload_gs_ubo_surfaces,
  92. };
  93.  
  94. static void
  95. brw_upload_gs_abo_surfaces(struct brw_context *brw)
  96. {
  97.    struct gl_context *ctx = &brw->ctx;
  98.    /* _NEW_PROGRAM */
  99.    struct gl_shader_program *prog =
  100.       ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY];
  101.  
  102.    if (prog) {
  103.       /* BRW_NEW_GS_PROG_DATA */
  104.       brw_upload_abo_surfaces(brw, prog, &brw->gs.base,
  105.                               &brw->gs.prog_data->base.base);
  106.    }
  107. }
  108.  
  109. const struct brw_tracked_state brw_gs_abo_surfaces = {
  110.    .dirty = {
  111.       .mesa = _NEW_PROGRAM,
  112.       .brw = BRW_NEW_ATOMIC_BUFFER |
  113.              BRW_NEW_BATCH |
  114.              BRW_NEW_GS_PROG_DATA,
  115.    },
  116.    .emit = brw_upload_gs_abo_surfaces,
  117. };
  118.