mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 01:50:10 +01:00
replaced by st_atom_shader.c
This commit is contained in:
parent
40c543eb71
commit
6b1d2fa815
2 changed files with 0 additions and 572 deletions
|
|
@ -1,248 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Authors:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
* Brian Paul
|
||||
*/
|
||||
|
||||
#include "shader/prog_parameter.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
|
||||
#include "pipe/tgsi/exec/tgsi_core.h"
|
||||
#include "pipe/tgsi/exec/tgsi_dump.h"
|
||||
|
||||
#include "st_context.h"
|
||||
#include "st_cache.h"
|
||||
#include "st_atom.h"
|
||||
#include "st_program.h"
|
||||
|
||||
|
||||
#define TGSI_DEBUG 0
|
||||
|
||||
|
||||
/**
|
||||
* Translate a Mesa fragment shader into a TGSI shader.
|
||||
* \param inputMapping to map fragment program input registers to TGSI
|
||||
* input slots
|
||||
* \param tokensOut destination for TGSI tokens
|
||||
* \return pointer to cached pipe_shader object.
|
||||
*/
|
||||
const struct cso_fragment_shader *
|
||||
st_translate_fragment_shader(const struct st_context *st,
|
||||
struct st_fragment_program *stfp,
|
||||
const GLuint inputMapping[],
|
||||
struct tgsi_token *tokensOut,
|
||||
GLuint maxTokens)
|
||||
{
|
||||
GLuint outputMapping[FRAG_RESULT_MAX];
|
||||
GLuint defaultInputMapping[FRAG_ATTRIB_MAX];
|
||||
struct pipe_shader_state fs;
|
||||
const struct cso_fragment_shader *cso;
|
||||
GLuint interpMode[16]; /* XXX size? */
|
||||
GLuint attr;
|
||||
GLbitfield inputsRead = stfp->Base.Base.InputsRead;
|
||||
|
||||
/* Check if all fragment programs need the fragment position (in order
|
||||
* to do perspective-corrected interpolation).
|
||||
*/
|
||||
/* XXX temporary! */
|
||||
if (st->pipe->get_param(st->pipe, PIPE_PARAM_FS_NEEDS_POS))
|
||||
inputsRead |= FRAG_BIT_WPOS;
|
||||
|
||||
memset(&fs, 0, sizeof(fs));
|
||||
|
||||
/*
|
||||
* Convert Mesa program inputs to TGSI input register semantics.
|
||||
*/
|
||||
for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
|
||||
if (inputsRead & (1 << attr)) {
|
||||
const GLuint slot = fs.num_inputs;
|
||||
|
||||
fs.num_inputs++;
|
||||
|
||||
defaultInputMapping[attr] = slot;
|
||||
|
||||
switch (attr) {
|
||||
case FRAG_ATTRIB_WPOS:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
|
||||
fs.input_semantic_index[slot] = 0;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
|
||||
break;
|
||||
case FRAG_ATTRIB_COL0:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
fs.input_semantic_index[slot] = 0;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
|
||||
break;
|
||||
case FRAG_ATTRIB_COL1:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
fs.input_semantic_index[slot] = 1;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
|
||||
break;
|
||||
case FRAG_ATTRIB_FOGC:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
|
||||
fs.input_semantic_index[slot] = 0;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
break;
|
||||
case FRAG_ATTRIB_TEX0:
|
||||
case FRAG_ATTRIB_TEX1:
|
||||
case FRAG_ATTRIB_TEX2:
|
||||
case FRAG_ATTRIB_TEX3:
|
||||
case FRAG_ATTRIB_TEX4:
|
||||
case FRAG_ATTRIB_TEX5:
|
||||
case FRAG_ATTRIB_TEX6:
|
||||
case FRAG_ATTRIB_TEX7:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_TEX0;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
break;
|
||||
case FRAG_ATTRIB_VAR0:
|
||||
/* fall-through */
|
||||
default:
|
||||
fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_VAR0;
|
||||
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Semantics for outputs
|
||||
*/
|
||||
for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
|
||||
if (stfp->Base.Base.OutputsWritten & (1 << attr)) {
|
||||
switch (attr) {
|
||||
case FRAG_RESULT_DEPR:
|
||||
fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
|
||||
outputMapping[attr] = fs.num_outputs;
|
||||
break;
|
||||
case FRAG_RESULT_COLR:
|
||||
fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
|
||||
outputMapping[attr] = fs.num_outputs;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
fs.num_outputs++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!inputMapping)
|
||||
inputMapping = defaultInputMapping;
|
||||
|
||||
/* XXX: fix static allocation of tokens:
|
||||
*/
|
||||
tgsi_mesa_compile_fp_program( &stfp->Base,
|
||||
/* inputs */
|
||||
fs.num_inputs,
|
||||
inputMapping,
|
||||
fs.input_semantic_name,
|
||||
fs.input_semantic_index,
|
||||
interpMode,
|
||||
/* outputs */
|
||||
outputMapping,
|
||||
/* tokenized result */
|
||||
tokensOut, maxTokens);
|
||||
|
||||
|
||||
fs.tokens = tokensOut;
|
||||
|
||||
cso = st_cached_fs_state(st, &fs);
|
||||
stfp->fs = cso;
|
||||
|
||||
if (TGSI_DEBUG)
|
||||
tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ );
|
||||
|
||||
#if defined(USE_X86_ASM) || defined(SLANG_X86)
|
||||
if (stfp->sse2_program.csr == stfp->sse2_program.store)
|
||||
tgsi_emit_sse2_fs( tokensOut, &stfp->sse2_program );
|
||||
|
||||
if (!cso->state.executable)
|
||||
((struct cso_fragment_shader*)cso)->state.executable = (void *) x86_get_func( &stfp->sse2_program );
|
||||
#endif
|
||||
|
||||
return cso;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void update_fs( struct st_context *st )
|
||||
{
|
||||
struct st_fragment_program *stfp = NULL;
|
||||
|
||||
/* find active shader and params. Changes to this Mesa state
|
||||
* should be covered by ST_NEW_FRAGMENT_PROGRAM, thanks to the
|
||||
* logic in st_cb_program.c
|
||||
*/
|
||||
if (st->ctx->Shader.CurrentProgram &&
|
||||
st->ctx->Shader.CurrentProgram->LinkStatus &&
|
||||
st->ctx->Shader.CurrentProgram->FragmentProgram) {
|
||||
struct gl_fragment_program *f
|
||||
= st->ctx->Shader.CurrentProgram->FragmentProgram;
|
||||
stfp = st_fragment_program(f);
|
||||
}
|
||||
else {
|
||||
assert(st->ctx->FragmentProgram._Current);
|
||||
stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
|
||||
}
|
||||
|
||||
/* if new binding, or shader has changed */
|
||||
if (st->fp != stfp /**|| stfp->dirty**/) {
|
||||
|
||||
#if 0
|
||||
if (stfp->dirty)
|
||||
(void) st_translate_fragment_shader( st, stfp );
|
||||
|
||||
/* Bind the vertex program and TGSI shader */
|
||||
st->fp = stfp;
|
||||
st->state.fs = stfp->fs;
|
||||
|
||||
st->pipe->bind_fs_state(st->pipe, st->state.fs->data);
|
||||
#else
|
||||
|
||||
/* NEW */
|
||||
st->dirty.st |= ST_NEW_LINKAGE;
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
const struct st_tracked_state st_update_fs = {
|
||||
.name = "st_update_fs",
|
||||
.dirty = {
|
||||
.mesa = 0,
|
||||
.st = ST_NEW_FRAGMENT_PROGRAM,
|
||||
},
|
||||
.update = update_fs
|
||||
};
|
||||
#endif
|
||||
|
|
@ -1,324 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
/*
|
||||
* Authors:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
* Brian Paul
|
||||
*/
|
||||
|
||||
#include "shader/prog_parameter.h"
|
||||
#include "shader/prog_print.h"
|
||||
#include "tnl/t_vp_build.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
|
||||
#include "pipe/tgsi/exec/tgsi_core.h"
|
||||
|
||||
#include "st_context.h"
|
||||
#include "st_cache.h"
|
||||
#include "st_atom.h"
|
||||
#include "st_program.h"
|
||||
|
||||
|
||||
#define TGSI_DEBUG 0
|
||||
|
||||
|
||||
/**
|
||||
* Translate a Mesa vertex shader into a TGSI shader.
|
||||
* \param outputMapping to map vertex program output registers to TGSI
|
||||
* output slots
|
||||
* \param tokensOut destination for TGSI tokens
|
||||
* \return pointer to cached pipe_shader object.
|
||||
*/
|
||||
const struct cso_vertex_shader *
|
||||
st_translate_vertex_shader(const struct st_context *st,
|
||||
struct st_vertex_program *stvp,
|
||||
const GLuint outputMapping[],
|
||||
struct tgsi_token *tokensOut,
|
||||
GLuint maxTokens)
|
||||
{
|
||||
GLuint defaultOutputMapping[VERT_RESULT_MAX];
|
||||
struct pipe_shader_state vs;
|
||||
const struct cso_vertex_shader *cso;
|
||||
GLuint attr, i;
|
||||
|
||||
memset(&vs, 0, sizeof(vs));
|
||||
|
||||
/*
|
||||
* Determine number of inputs, the mappings between VERT_ATTRIB_x
|
||||
* and TGSI generic input indexes, plus input attrib semantic info.
|
||||
*/
|
||||
for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
|
||||
if (stvp->Base.Base.InputsRead & (1 << attr)) {
|
||||
const GLuint slot = vs.num_inputs;
|
||||
|
||||
vs.num_inputs++;
|
||||
|
||||
stvp->input_to_index[attr] = slot;
|
||||
stvp->index_to_input[slot] = attr;
|
||||
|
||||
switch (attr) {
|
||||
case VERT_ATTRIB_POS:
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
|
||||
vs.input_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_WEIGHT:
|
||||
/* fall-through */
|
||||
case VERT_ATTRIB_NORMAL:
|
||||
/* just label as a generic */
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.input_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_COLOR0:
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
vs.input_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_COLOR1:
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
vs.input_semantic_index[slot] = 1;
|
||||
break;
|
||||
case VERT_ATTRIB_FOG:
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
|
||||
vs.input_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_TEX0:
|
||||
case VERT_ATTRIB_TEX1:
|
||||
case VERT_ATTRIB_TEX2:
|
||||
case VERT_ATTRIB_TEX3:
|
||||
case VERT_ATTRIB_TEX4:
|
||||
case VERT_ATTRIB_TEX5:
|
||||
case VERT_ATTRIB_TEX6:
|
||||
case VERT_ATTRIB_TEX7:
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.input_semantic_index[slot] = attr - VERT_ATTRIB_TEX0;
|
||||
break;
|
||||
case VERT_ATTRIB_GENERIC0:
|
||||
case VERT_ATTRIB_GENERIC1:
|
||||
case VERT_ATTRIB_GENERIC2:
|
||||
case VERT_ATTRIB_GENERIC3:
|
||||
case VERT_ATTRIB_GENERIC4:
|
||||
case VERT_ATTRIB_GENERIC5:
|
||||
case VERT_ATTRIB_GENERIC6:
|
||||
case VERT_ATTRIB_GENERIC7:
|
||||
assert(attr < VERT_ATTRIB_MAX);
|
||||
vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.input_semantic_index[slot] = attr - VERT_ATTRIB_GENERIC0;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize output semantics to defaults */
|
||||
for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
|
||||
vs.output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.output_semantic_index[i] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine number of outputs, the (default) output register
|
||||
* mapping and the semantic information for each output.
|
||||
*/
|
||||
for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
|
||||
if (stvp->Base.Base.OutputsWritten & (1 << attr)) {
|
||||
GLuint slot;
|
||||
|
||||
if (outputMapping) {
|
||||
slot = outputMapping[attr];
|
||||
assert(slot != ~0);
|
||||
}
|
||||
else {
|
||||
slot = vs.num_outputs;
|
||||
vs.num_outputs++;
|
||||
defaultOutputMapping[attr] = slot;
|
||||
}
|
||||
|
||||
/*
|
||||
printf("Output %u -> slot %u\n", attr, slot);
|
||||
*/
|
||||
|
||||
switch (attr) {
|
||||
case VERT_RESULT_HPOS:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
|
||||
vs.output_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_RESULT_COL0:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
vs.output_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_RESULT_COL1:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
|
||||
vs.output_semantic_index[slot] = 1;
|
||||
break;
|
||||
case VERT_RESULT_BFC0:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
|
||||
vs.output_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_RESULT_BFC1:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
|
||||
vs.output_semantic_index[slot] = 1;
|
||||
break;
|
||||
case VERT_RESULT_FOGC:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
|
||||
vs.output_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_RESULT_PSIZ:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
|
||||
vs.output_semantic_index[slot] = 0;
|
||||
break;
|
||||
case VERT_RESULT_EDGE:
|
||||
assert(0);
|
||||
break;
|
||||
case VERT_RESULT_TEX0:
|
||||
case VERT_RESULT_TEX1:
|
||||
case VERT_RESULT_TEX2:
|
||||
case VERT_RESULT_TEX3:
|
||||
case VERT_RESULT_TEX4:
|
||||
case VERT_RESULT_TEX5:
|
||||
case VERT_RESULT_TEX6:
|
||||
case VERT_RESULT_TEX7:
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
|
||||
break;
|
||||
case VERT_RESULT_VAR0:
|
||||
/* fall-through */
|
||||
default:
|
||||
assert(attr - VERT_RESULT_VAR0 < MAX_VARYING);
|
||||
vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.output_semantic_index[slot] = attr - VERT_RESULT_VAR0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (outputMapping) {
|
||||
/* find max output slot referenced to compute vs.num_outputs */
|
||||
GLuint maxSlot = 0;
|
||||
for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
|
||||
if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
|
||||
maxSlot = outputMapping[attr];
|
||||
}
|
||||
vs.num_outputs = maxSlot + 1;
|
||||
}
|
||||
else {
|
||||
outputMapping = defaultOutputMapping;
|
||||
}
|
||||
|
||||
/* XXX: fix static allocation of tokens:
|
||||
*/
|
||||
tgsi_mesa_compile_vp_program( &stvp->Base,
|
||||
/* inputs */
|
||||
vs.num_inputs,
|
||||
stvp->input_to_index,
|
||||
vs.input_semantic_name,
|
||||
vs.input_semantic_index,
|
||||
/* outputs */
|
||||
vs.num_outputs,
|
||||
outputMapping,
|
||||
vs.output_semantic_name,
|
||||
vs.output_semantic_index,
|
||||
/* tokenized result */
|
||||
tokensOut, maxTokens);
|
||||
|
||||
vs.tokens = tokensOut;
|
||||
cso = st_cached_vs_state(st, &vs);
|
||||
stvp->vs = cso;
|
||||
|
||||
if (TGSI_DEBUG)
|
||||
tgsi_dump( tokensOut, 0 );
|
||||
|
||||
#if defined(USE_X86_ASM) || defined(SLANG_X86)
|
||||
if (stvp->sse2_program.csr == stvp->sse2_program.store)
|
||||
tgsi_emit_sse2( tokensOut, &stvp->sse2_program );
|
||||
|
||||
if (!cso->state.executable)
|
||||
((struct cso_vertex_shader*)cso)->state.executable = (void *) x86_get_func( &stvp->sse2_program );
|
||||
#endif
|
||||
|
||||
stvp->dirty = 0;
|
||||
|
||||
return cso;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void update_vs( struct st_context *st )
|
||||
{
|
||||
struct st_vertex_program *stvp;
|
||||
|
||||
/* find active shader and params -- Should be covered by
|
||||
* ST_NEW_VERTEX_PROGRAM
|
||||
*/
|
||||
if (st->ctx->Shader.CurrentProgram &&
|
||||
st->ctx->Shader.CurrentProgram->LinkStatus &&
|
||||
st->ctx->Shader.CurrentProgram->VertexProgram) {
|
||||
struct gl_vertex_program *f
|
||||
= st->ctx->Shader.CurrentProgram->VertexProgram;
|
||||
stvp = st_vertex_program(f);
|
||||
}
|
||||
else {
|
||||
assert(st->ctx->VertexProgram._Current);
|
||||
stvp = st_vertex_program(st->ctx->VertexProgram._Current);
|
||||
}
|
||||
|
||||
if (st->vp != stvp || stvp->dirty) {
|
||||
#if 0
|
||||
if (stvp->dirty)
|
||||
(void) st_translate_vertex_shader( st, stvp );
|
||||
|
||||
/* Bind the vertex program and TGSI shader */
|
||||
st->vp = stvp;
|
||||
st->state.vs = stvp->vs;
|
||||
|
||||
#if 0
|
||||
printf("###### bind vp tokens: %p %p num_inp=%u\n",
|
||||
stvp, stvp->tokens, stvp->vs->state.num_inputs);
|
||||
if (TGSI_DEBUG)
|
||||
tgsi_dump( stvp->tokens, 0 );
|
||||
#endif
|
||||
st->pipe->bind_vs_state(st->pipe, st->state.vs->data);
|
||||
#else
|
||||
/* NEW */
|
||||
st->dirty.st |= ST_NEW_LINKAGE;
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
const struct st_tracked_state st_update_vs = {
|
||||
.name = "st_update_vs",
|
||||
.dirty = {
|
||||
.mesa = _NEW_PROGRAM,
|
||||
.st = ST_NEW_VERTEX_PROGRAM,
|
||||
},
|
||||
.update = update_vs
|
||||
};
|
||||
#endif
|
||||
Loading…
Add table
Reference in a new issue