summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/i965/brw_pipe_shader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/i965/brw_pipe_shader.c')
-rw-r--r--src/gallium/drivers/i965/brw_pipe_shader.c303
1 files changed, 0 insertions, 303 deletions
diff --git a/src/gallium/drivers/i965/brw_pipe_shader.c b/src/gallium/drivers/i965/brw_pipe_shader.c
deleted file mode 100644
index d9bee96c11f..00000000000
--- a/src/gallium/drivers/i965/brw_pipe_shader.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- Copyright (C) Intel Corp. 2006. All Rights Reserved.
- Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
- develop this 3D driver.
-
- 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, sublicense, 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 NONINFRINGEMENT.
- IN NO EVENT SHALL THE COPYRIGHT OWNER(S) 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>
- */
-
-#include "util/u_inlines.h"
-#include "util/u_memory.h"
-
-#include "tgsi/tgsi_parse.h"
-#include "tgsi/tgsi_scan.h"
-
-#include "brw_context.h"
-#include "brw_wm.h"
-
-
-/**
- * Determine if the given shader uses complex features such as flow
- * conditionals, loops, subroutines.
- */
-static GLboolean has_flow_control(const struct tgsi_shader_info *info)
-{
- return (info->opcode_count[TGSI_OPCODE_ARL] > 0 ||
- info->opcode_count[TGSI_OPCODE_IF] > 0 ||
- info->opcode_count[TGSI_OPCODE_ENDIF] > 0 || /* redundant - IF */
- info->opcode_count[TGSI_OPCODE_CAL] > 0 ||
- info->opcode_count[TGSI_OPCODE_BRK] > 0 || /* redundant - BGNLOOP */
- info->opcode_count[TGSI_OPCODE_RET] > 0 || /* redundant - CAL */
- info->opcode_count[TGSI_OPCODE_BGNLOOP] > 0);
-}
-
-
-static void scan_immediates(const struct tgsi_token *tokens,
- const struct tgsi_shader_info *info,
- struct brw_immediate_data *imm)
-{
- struct tgsi_parse_context parse;
- boolean done = FALSE;
-
- imm->nr = 0;
- imm->data = MALLOC(info->immediate_count * 4 * sizeof(float));
-
- tgsi_parse_init( &parse, tokens );
- while (!tgsi_parse_end_of_tokens( &parse ) && !done) {
- tgsi_parse_token( &parse );
-
- switch (parse.FullToken.Token.Type) {
- case TGSI_TOKEN_TYPE_DECLARATION:
- break;
-
- case TGSI_TOKEN_TYPE_IMMEDIATE: {
- static const float id[4] = {0,0,0,1};
- const float *value = &parse.FullToken.FullImmediate.u[0].Float;
- unsigned size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
- unsigned i;
-
- for (i = 0; i < size; i++)
- imm->data[imm->nr][i] = value[i];
-
- for (; i < 4; i++)
- imm->data[imm->nr][i] = id[i];
-
- imm->nr++;
- break;
- }
-
- case TGSI_TOKEN_TYPE_INSTRUCTION:
- done = 1;
- break;
- }
- }
-}
-
-
-static void brw_bind_fs_state( struct pipe_context *pipe, void *prog )
-{
- struct brw_fragment_shader *fs = (struct brw_fragment_shader *)prog;
- struct brw_context *brw = brw_context(pipe);
-
- if (brw->curr.fragment_shader == fs)
- return;
-
- if (brw->curr.fragment_shader == NULL ||
- fs == NULL ||
- memcmp(&brw->curr.fragment_shader->signature, &fs->signature,
- brw_fs_signature_size(&fs->signature)) != 0) {
- brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_SIGNATURE;
- }
-
- brw->curr.fragment_shader = fs;
- brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_SHADER;
-}
-
-static void brw_bind_vs_state( struct pipe_context *pipe, void *prog )
-{
- struct brw_context *brw = brw_context(pipe);
-
- brw->curr.vertex_shader = (struct brw_vertex_shader *)prog;
- brw->state.dirty.mesa |= PIPE_NEW_VERTEX_SHADER;
-}
-
-
-
-static void *brw_create_fs_state( struct pipe_context *pipe,
- const struct pipe_shader_state *shader )
-{
- struct brw_context *brw = brw_context(pipe);
- struct brw_fragment_shader *fs;
- int i;
-
- fs = CALLOC_STRUCT(brw_fragment_shader);
- if (fs == NULL)
- return NULL;
-
- /* Duplicate tokens, scan shader
- */
- fs->id = brw->program_id++;
- fs->has_flow_control = has_flow_control(&fs->info);
-
- fs->tokens = tgsi_dup_tokens(shader->tokens);
- if (fs->tokens == NULL)
- goto fail;
-
- tgsi_scan_shader(fs->tokens, &fs->info);
- scan_immediates(fs->tokens, &fs->info, &fs->immediates);
-
- fs->signature.nr_inputs = fs->info.num_inputs;
- for (i = 0; i < fs->info.num_inputs; i++) {
- fs->signature.input[i].interp = fs->info.input_interpolate[i];
- fs->signature.input[i].semantic = fs->info.input_semantic_name[i];
- fs->signature.input[i].semantic_index = fs->info.input_semantic_index[i];
- }
-
- for (i = 0; i < fs->info.num_inputs; i++)
- if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION)
- fs->uses_depth = 1;
-
- if (fs->info.uses_kill)
- fs->iz_lookup |= IZ_PS_KILL_ALPHATEST_BIT;
-
- if (fs->info.writes_z)
- fs->iz_lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
-
- return (void *)fs;
-
-fail:
- FREE(fs);
- return NULL;
-}
-
-
-static void *brw_create_vs_state( struct pipe_context *pipe,
- const struct pipe_shader_state *shader )
-{
- struct brw_context *brw = brw_context(pipe);
- struct brw_vertex_shader *vs;
- unsigned i;
-
- vs = CALLOC_STRUCT(brw_vertex_shader);
- if (vs == NULL)
- return NULL;
-
- /* Duplicate tokens, scan shader
- */
- vs->tokens = tgsi_dup_tokens(shader->tokens);
- if (vs->tokens == NULL)
- goto fail;
-
- tgsi_scan_shader(vs->tokens, &vs->info);
- scan_immediates(vs->tokens, &vs->info, &vs->immediates);
-
- vs->id = brw->program_id++;
- vs->has_flow_control = has_flow_control(&vs->info);
-
- vs->output_hpos = BRW_OUTPUT_NOT_PRESENT;
- vs->output_color0 = BRW_OUTPUT_NOT_PRESENT;
- vs->output_color1 = BRW_OUTPUT_NOT_PRESENT;
- vs->output_bfc0 = BRW_OUTPUT_NOT_PRESENT;
- vs->output_bfc1 = BRW_OUTPUT_NOT_PRESENT;
- vs->output_edgeflag = BRW_OUTPUT_NOT_PRESENT;
-
- for (i = 0; i < vs->info.num_outputs; i++) {
- int index = vs->info.output_semantic_index[i];
- switch (vs->info.output_semantic_name[i]) {
- case TGSI_SEMANTIC_POSITION:
- vs->output_hpos = i;
- break;
- case TGSI_SEMANTIC_COLOR:
- if (index == 0)
- vs->output_color0 = i;
- else
- vs->output_color1 = i;
- break;
- case TGSI_SEMANTIC_BCOLOR:
- if (index == 0)
- vs->output_bfc0 = i;
- else
- vs->output_bfc1 = i;
- break;
- case TGSI_SEMANTIC_EDGEFLAG:
- vs->output_edgeflag = i;
- break;
- }
- }
-
-
- /* Done:
- */
- return (void *)vs;
-
-fail:
- FREE(vs);
- return NULL;
-}
-
-
-static void brw_delete_fs_state( struct pipe_context *pipe, void *prog )
-{
- struct brw_fragment_shader *fs = (struct brw_fragment_shader *)prog;
-
- bo_reference(&fs->const_buffer, NULL);
- FREE( (void *)fs->tokens );
- FREE( fs );
-}
-
-
-static void brw_delete_vs_state( struct pipe_context *pipe, void *prog )
-{
- struct brw_fragment_shader *vs = (struct brw_fragment_shader *)prog;
-
- /* Delete draw shader
- */
- FREE( (void *)vs->tokens );
- FREE( vs );
-}
-
-
-static void brw_set_constant_buffer(struct pipe_context *pipe,
- uint shader, uint index,
- struct pipe_resource *buf)
-{
- struct brw_context *brw = brw_context(pipe);
-
- assert(index == 0);
-
- if (shader == PIPE_SHADER_FRAGMENT) {
- pipe_resource_reference( &brw->curr.fragment_constants,
- buf );
-
- brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_CONSTANTS;
- }
- else {
- pipe_resource_reference( &brw->curr.vertex_constants,
- buf );
-
- brw->state.dirty.mesa |= PIPE_NEW_VERTEX_CONSTANTS;
- }
-}
-
-
-void brw_pipe_shader_init( struct brw_context *brw )
-{
- brw->base.set_constant_buffer = brw_set_constant_buffer;
-
- brw->base.create_vs_state = brw_create_vs_state;
- brw->base.bind_vs_state = brw_bind_vs_state;
- brw->base.delete_vs_state = brw_delete_vs_state;
-
- brw->base.create_fs_state = brw_create_fs_state;
- brw->base.bind_fs_state = brw_bind_fs_state;
- brw->base.delete_fs_state = brw_delete_fs_state;
-}
-
-void brw_pipe_shader_cleanup( struct brw_context *brw )
-{
- pipe_resource_reference( &brw->curr.fragment_constants, NULL );
- pipe_resource_reference( &brw->curr.vertex_constants, NULL );
-}