We've been requiring SM 3.0 all along so this just removes unused code.
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
svga_swtnl_draw.c \
svga_swtnl_state.c \
svga_tgsi.c \
- svga_tgsi_decl_sm20.c \
svga_tgsi_decl_sm30.c \
svga_tgsi_insn.c \
svga_sampler_view.c \
#include "util/u_bitmask.h"
#include "tgsi/tgsi_parse.h"
-#include "svga_screen.h"
#include "svga_context.h"
#include "svga_tgsi.h"
#include "svga_hw_reg.h"
const struct pipe_shader_state *templ)
{
struct svga_context *svga = svga_context(pipe);
- struct svga_screen *svgascreen = svga_screen(pipe->screen);
struct svga_fragment_shader *fs;
fs = CALLOC_STRUCT(svga_fragment_shader);
tgsi_scan_shader(fs->base.tokens, &fs->base.info);
fs->base.id = svga->debug.shader_id++;
- fs->base.use_sm30 = svgascreen->use_ps30;
if (SVGA_DEBUG & DEBUG_TGSI || 0) {
debug_printf("%s id: %u, inputs: %u, outputs: %u\n",
#include "tgsi/tgsi_parse.h"
#include "tgsi/tgsi_text.h"
-#include "svga_screen.h"
#include "svga_context.h"
#include "svga_tgsi.h"
#include "svga_hw_reg.h"
const struct pipe_shader_state *templ)
{
struct svga_context *svga = svga_context(pipe);
- struct svga_screen *svgascreen = svga_screen(pipe->screen);
struct svga_vertex_shader *vs = CALLOC_STRUCT(svga_vertex_shader);
if (!vs)
return NULL;
}
vs->base.id = svga->debug.shader_id++;
- vs->base.use_sm30 = svgascreen->use_vs30;
if (SVGA_DEBUG & DEBUG_TGSI || 0) {
debug_printf("%s id: %u, inputs: %u, outputs: %u\n",
case PIPE_CAP_TWO_SIDED_STENCIL:
return 1;
case PIPE_CAP_GLSL:
- return svgascreen->use_ps30 && svgascreen->use_vs30;
+ return 1;
case PIPE_CAP_ANISOTROPIC_FILTER:
return 1;
case PIPE_CAP_POINT_SPRITE:
case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
- return svgascreen->use_ps30 ? 512 : 96;
+ return 512;
case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
return SVGA3D_MAX_NESTING_LEVEL;
case PIPE_SHADER_CAP_MAX_INPUTS:
return 10;
case PIPE_SHADER_CAP_MAX_CONSTS:
- return svgascreen->use_ps30 ? 224 : 16;
+ return 224;
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
return 1;
case PIPE_SHADER_CAP_MAX_TEMPS:
if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, &result))
- return svgascreen->use_ps30 ? 32 : 12;
+ return 32;
return result.u;
case PIPE_SHADER_CAP_MAX_ADDRS:
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
*/
return 0;
case PIPE_SHADER_CAP_MAX_PREDS:
- return svgascreen->use_ps30 ? 1 : 0;
+ return 1;
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
return 1;
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_INSTRUCTIONS, &result))
- return svgascreen->use_vs30 ? 512 : 256;
+ return 512;
return result.u;
case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
return 1;
case PIPE_SHADER_CAP_MAX_TEMPS:
if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
- return svgascreen->use_vs30 ? 32 : 12;
+ return 32;
return result.u;
case PIPE_SHADER_CAP_MAX_ADDRS:
- return svgascreen->use_vs30 ? 1 : 0;
+ return 1;
case PIPE_SHADER_CAP_MAX_PREDS:
- return svgascreen->use_vs30 ? 1 : 0;
+ return 1;
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
return 1;
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
- return svgascreen->use_vs30 ? 1 : 0;
+ return 1;
case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
return 0;
case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
struct svga_screen *svgascreen;
struct pipe_screen *screen;
SVGA3dDevCapResult result;
+ boolean use_vs30, use_ps30;
#ifdef DEBUG
SVGA_DEBUG = debug_get_flags_option("SVGA_DEBUG", svga_debug_flags, 0 );
svgascreen->hw_version = SVGA3D_HWVERSION_WS65_B1;
}
- svgascreen->use_ps30 =
+ use_ps30 =
sws->get_cap(sws, SVGA3D_DEVCAP_FRAGMENT_SHADER_VERSION, &result) &&
result.u >= SVGA3DPSVERSION_30 ? TRUE : FALSE;
- svgascreen->use_vs30 =
+ use_vs30 =
sws->get_cap(sws, SVGA3D_DEVCAP_VERTEX_SHADER_VERSION, &result) &&
result.u >= SVGA3DVSVERSION_30 ? TRUE : FALSE;
+ /* we require Shader model 3.0 or later */
+ if (!use_ps30 || !use_vs30)
+ goto error2;
+
/*
* The D16, D24X8, and D24S8 formats always do an implicit shadow compare
* when sampled from, where as the DF16, DF24, and D24S8_INT do not. So
}
}
-#if 1
- /* Shader model 2.0 is unsupported at the moment. */
- if(!svgascreen->use_ps30 || !svgascreen->use_vs30)
- goto error2;
-#else
- if(debug_get_bool_option("SVGA_NO_SM30", FALSE))
- svgascreen->use_vs30 = svgascreen->use_ps30 = FALSE;
-#endif
-
pipe_mutex_init(svgascreen->tex_mutex);
pipe_mutex_init(svgascreen->swc_mutex);
SVGA3dHardwareVersion hw_version;
- unsigned use_ps30;
- unsigned use_vs30;
-
struct {
boolean force_level_surface_view;
boolean force_surface_view;
return TRUE;
}
-#define SVGA3D_PS_2X (SVGA3D_PS_20 | 1)
-#define SVGA3D_VS_2X (SVGA3D_VS_20 | 1)
static boolean svga_shader_emit_header( struct svga_shader_emitter *emit )
{
switch (emit->unit) {
case PIPE_SHADER_FRAGMENT:
- header.value = emit->use_sm30 ? SVGA3D_PS_30 : SVGA3D_PS_2X;
+ header.value = SVGA3D_PS_30;
break;
case PIPE_SHADER_VERTEX:
- header.value = emit->use_sm30 ? SVGA3D_VS_30 : SVGA3D_VS_2X;
+ header.value = SVGA3D_VS_30;
break;
}
memset(&emit, 0, sizeof(emit));
- emit.use_sm30 = shader->use_sm30;
emit.size = 1024;
emit.buf = MALLOC(emit.size);
if (emit.buf == NULL) {
+++ /dev/null
-/**********************************************************
- * Copyright 2008-2009 VMware, Inc. 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, 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 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 AUTHORS OR COPYRIGHT HOLDERS
- * 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.
- *
- **********************************************************/
-
-
-#include "pipe/p_shader_tokens.h"
-#include "tgsi/tgsi_parse.h"
-#include "util/u_memory.h"
-
-#include "svga_tgsi_emit.h"
-
-
-static boolean ps20_input( struct svga_shader_emitter *emit,
- struct tgsi_declaration_semantic semantic,
- unsigned idx )
-{
- struct src_register reg;
- SVGA3DOpDclArgs dcl;
- SVGA3dShaderInstToken opcode;
-
- opcode = inst_token( SVGA3DOP_DCL );
- dcl.values[0] = 0;
- dcl.values[1] = 0;
-
- switch (semantic.Name) {
- case TGSI_SEMANTIC_POSITION:
- /* Special case:
- */
- reg = src_register( SVGA3DREG_MISCTYPE,
- SVGA3DMISCREG_POSITION );
- break;
- case TGSI_SEMANTIC_COLOR:
- reg = src_register( SVGA3DREG_INPUT,
- semantic.Index );
- break;
- case TGSI_SEMANTIC_FOG:
- assert(semantic.Index == 0);
- reg = src_register( SVGA3DREG_TEXTURE, 0 );
- break;
- case TGSI_SEMANTIC_GENERIC:
- reg = src_register( SVGA3DREG_TEXTURE,
- semantic.Index + 1 );
- break;
- default:
- assert(0);
- return TRUE;
- }
-
- emit->input_map[idx] = reg;
-
- dcl.dst = dst( reg );
-
- dcl.usage = 0;
- dcl.index = 0;
-
- dcl.values[0] |= 1<<31;
-
- return (emit_instruction(emit, opcode) &&
- svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values)));
-}
-
-
-static boolean ps20_output( struct svga_shader_emitter *emit,
- struct tgsi_declaration_semantic semantic,
- unsigned idx )
-{
- SVGA3dShaderDestToken reg;
-
- switch (semantic.Name) {
- case TGSI_SEMANTIC_COLOR:
- if (semantic.Index < PIPE_MAX_COLOR_BUFS) {
- unsigned cbuf = semantic.Index;
-
- emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
- emit->nr_hw_temp++ );
- emit->temp_col[cbuf] = emit->output_map[idx];
- emit->true_col[cbuf] = dst_register( SVGA3DREG_COLOROUT,
- semantic.Index );
- }
- else {
- assert(0);
- reg = dst_register( SVGA3DREG_COLOROUT, 0 );
- }
- break;
- case TGSI_SEMANTIC_POSITION:
- emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
- emit->nr_hw_temp++ );
- emit->temp_pos = emit->output_map[idx];
- emit->true_pos = dst_register( SVGA3DREG_DEPTHOUT,
- semantic.Index );
- break;
- default:
- assert(0);
- reg = dst_register( SVGA3DREG_COLOROUT, 0 );
- break;
- }
-
- return TRUE;
-}
-
-
-static boolean vs20_input( struct svga_shader_emitter *emit,
- struct tgsi_declaration_semantic semantic,
- unsigned idx )
-{
- SVGA3DOpDclArgs dcl;
- SVGA3dShaderInstToken opcode;
-
- opcode = inst_token( SVGA3DOP_DCL );
- dcl.values[0] = 0;
- dcl.values[1] = 0;
-
- emit->input_map[idx] = src_register( SVGA3DREG_INPUT, idx );
- dcl.dst = dst_register( SVGA3DREG_INPUT, idx );
-
- assert(dcl.dst.reserved0);
-
- /* Mesa doesn't provide use with VS input semantics (they're
- * actually pretty meaningless), so we just generate some plausible
- * ones here. This has to match what we declare in the vdecl code
- * in svga_pipe_vertex.c.
- */
- if (idx == 0) {
- dcl.usage = SVGA3D_DECLUSAGE_POSITION;
- dcl.index = 0;
- }
- else {
- dcl.usage = SVGA3D_DECLUSAGE_TEXCOORD;
- dcl.index = idx - 1;
- }
-
- dcl.values[0] |= 1<<31;
-
- return (emit_instruction(emit, opcode) &&
- svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values)));
-}
-
-
-static boolean vs20_output( struct svga_shader_emitter *emit,
- struct tgsi_declaration_semantic semantic,
- unsigned idx )
-{
- /* Don't emit dcl instruction for vs20 inputs
- */
-
- /* Just build the register map table:
- */
- switch (semantic.Name) {
- case TGSI_SEMANTIC_POSITION:
- assert(semantic.Index == 0);
- emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
- emit->nr_hw_temp++ );
- emit->temp_pos = emit->output_map[idx];
- emit->true_pos = dst_register( SVGA3DREG_RASTOUT,
- SVGA3DRASTOUT_POSITION);
- break;
- case TGSI_SEMANTIC_PSIZE:
- assert(semantic.Index == 0);
- emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
- emit->nr_hw_temp++ );
- emit->temp_psiz = emit->output_map[idx];
- emit->true_psiz = dst_register( SVGA3DREG_RASTOUT,
- SVGA3DRASTOUT_PSIZE );
- break;
- case TGSI_SEMANTIC_FOG:
- assert(semantic.Index == 0);
- emit->output_map[idx] = dst_register( SVGA3DREG_TEXCRDOUT, 0 );
- break;
- case TGSI_SEMANTIC_COLOR:
- /* oD0 */
- emit->output_map[idx] = dst_register( SVGA3DREG_ATTROUT,
- semantic.Index );
- break;
- case TGSI_SEMANTIC_GENERIC:
- emit->output_map[idx] = dst_register( SVGA3DREG_TEXCRDOUT,
- semantic.Index + 1 );
- break;
- default:
- assert(0);
- emit->output_map[idx] = dst_register( SVGA3DREG_TEMP, 0 );
- return FALSE;
- }
-
- return TRUE;
-}
-
-static boolean ps20_sampler( struct svga_shader_emitter *emit,
- struct tgsi_declaration_semantic semantic,
- unsigned idx )
-{
- SVGA3DOpDclArgs dcl;
- SVGA3dShaderInstToken opcode;
-
- opcode = inst_token( SVGA3DOP_DCL );
- dcl.values[0] = 0;
- dcl.values[1] = 0;
-
- dcl.dst = dst_register( SVGA3DREG_SAMPLER, idx );
- dcl.type = svga_tgsi_sampler_type( emit, idx );
-
- return (emit_instruction(emit, opcode) &&
- svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values)));
-}
-
-
-boolean svga_translate_decl_sm20( struct svga_shader_emitter *emit,
- const struct tgsi_full_declaration *decl )
-{
- unsigned first = decl->Range.First;
- unsigned last = decl->Range.Last;
- unsigned semantic = 0;
- unsigned semantic_idx = 0;
- unsigned idx;
-
- if (decl->Declaration.Semantic) {
- semantic = decl->Semantic.Name;
- semantic_idx = decl->Semantic.Index;
- }
-
- for( idx = first; idx <= last; idx++ ) {
- boolean ok;
-
- switch (decl->Declaration.File) {
- case TGSI_FILE_SAMPLER:
- assert (emit->unit == PIPE_SHADER_FRAGMENT);
- ok = ps20_sampler( emit, decl->Semantic, idx );
- break;
-
- case TGSI_FILE_INPUT:
- if (emit->unit == PIPE_SHADER_VERTEX)
- ok = vs20_input( emit, decl->Semantic, idx );
- else
- ok = ps20_input( emit, decl->Semantic, idx );
- break;
-
- case TGSI_FILE_OUTPUT:
- if (emit->unit == PIPE_SHADER_VERTEX)
- ok = vs20_output( emit, decl->Semantic, idx );
- else
- ok = ps20_output( emit, decl->Semantic, idx );
- break;
-
- default:
- /* don't need to declare other vars */
- ok = TRUE;
- }
-
- if (!ok)
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-
struct svga_shader_emitter
{
- boolean use_sm30;
-
unsigned size;
char *buf;
char *ptr;
boolean svga_shader_emit_instructions( struct svga_shader_emitter *emit,
const struct tgsi_token *tokens );
-boolean svga_translate_decl_sm20( struct svga_shader_emitter *emit,
- const struct tgsi_full_declaration *decl );
-
boolean svga_translate_decl_sm30( struct svga_shader_emitter *emit,
const struct tgsi_full_declaration *decl );
{
src0 = scalar(src0, TGSI_SWIZZLE_X);
- if (emit->use_sm30) {
- return submit_op1( emit, inst_token( SVGA3DOP_SINCOS ),
- dst, src0 );
- } else {
- struct src_register const1 = get_sincos_const( emit, 0 );
- struct src_register const2 = get_sincos_const( emit, 1 );
-
- return submit_op3( emit, inst_token( SVGA3DOP_SINCOS ),
- dst, src0, const1, const2 );
- }
+ return submit_op1( emit, inst_token( SVGA3DOP_SINCOS ),
+ dst, src0 );
}
static boolean emit_sincos(struct svga_shader_emitter *emit,
/* If doing compare processing or tex swizzle, need to put fetched color into
* a temporary so it can be used as a source later on.
*/
- if (compare ||
- swizzle ||
- (!emit->use_sm30 && dst.mask != TGSI_WRITEMASK_XYZW) ) {
+ if (compare || swizzle) {
tex_result = get_temp( emit );
}
else {
emit->key.fkey.tex[unit].swizzle_a);
}
- if (!emit->use_sm30 &&
- dst.mask != TGSI_WRITEMASK_XYZW &&
- !compare &&
- !swizzle) {
- /* pre SM3.0 a TEX instruction can't have a writemask. Do it as a
- * separate step here.
- */
- if (!emit_op1( emit, inst_token( SVGA3DOP_MOV ), dst, src(tex_result) ))
- return FALSE;
- }
-
return TRUE;
}
static boolean emit_ps_preamble( struct svga_shader_emitter *emit )
{
- unsigned i;
-
- /* For SM20, need to initialize the temporaries we're using to hold
- * color outputs to some value. Shaders which don't set all of
- * these values are likely to be rejected by the DX9 runtime.
- */
- if (!emit->use_sm30) {
- struct src_register zero = get_zero_immediate( emit );
- for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
- if (SVGA3dShaderGetRegType(emit->true_col[i].value) != 0) {
-
- if (!submit_op1( emit,
- inst_token(SVGA3DOP_MOV),
- emit->temp_col[i],
- zero ))
- return FALSE;
- }
- }
- } else if (emit->ps_reads_pos && emit->info.reads_z) {
+ if (emit->ps_reads_pos && emit->info.reads_z) {
/*
* Assemble the position from various bits of inputs. Depth and W are
* passed in a texcoord this is due to D3D's vPos not hold Z or W.
return FALSE;
}
- /* Similarly for SM20 color outputs... Luckily SM30 isn't so
- * fragile.
- */
for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
if (SVGA3dShaderGetRegType(emit->true_col[i].value) != 0) {
int i;
if (emit->unit == PIPE_SHADER_FRAGMENT) {
- if (!emit->use_sm30)
- return TRUE;
-
if (emit->key.fkey.light_twoside)
return TRUE;
static INLINE boolean
needs_to_create_sincos_consts( struct svga_shader_emitter *emit )
{
- return !emit->use_sm30 && (emit->info.opcode_count[TGSI_OPCODE_SIN] >= 1 ||
- emit->info.opcode_count[TGSI_OPCODE_COS] >= 1 ||
- emit->info.opcode_count[TGSI_OPCODE_SCS] >= 1);
+ return FALSE;
}
static INLINE boolean
break;
case TGSI_TOKEN_TYPE_DECLARATION:
- if (emit->use_sm30)
- ret = svga_translate_decl_sm30( emit, &parse.FullToken.FullDeclaration );
- else
- ret = svga_translate_decl_sm20( emit, &parse.FullToken.FullDeclaration );
+ ret = svga_translate_decl_sm30( emit, &parse.FullToken.FullDeclaration );
if (!ret)
goto done;
break;