static int softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { struct softpipe_screen *sp_screen = softpipe_screen(screen); switch(shader) { case PIPE_SHADER_FRAGMENT: return tgsi_exec_get_shader_param(param); case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: if (sp_screen->use_llvm) /* Softpipe doesn't yet know how to tell draw/llvm about textures */ return 0; else return PIPE_MAX_SAMPLERS; default: if (sp_screen->use_llvm) return draw_get_shader_param(shader, param); else return draw_get_shader_param_no_llvm(shader, param); } default: return 0; } }
static int llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { switch(shader) { case PIPE_SHADER_FRAGMENT: switch (param) { default: return gallivm_get_shader_param(param); } case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: /* At this time, the draw module and llvmpipe driver only * support vertex shader texture lookups when LLVM is enabled in * the draw module. */ if (debug_get_bool_option("DRAW_USE_LLVM", TRUE)) return PIPE_MAX_SAMPLERS; else return 0; case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: if (debug_get_bool_option("DRAW_USE_LLVM", TRUE)) return PIPE_MAX_SHADER_SAMPLER_VIEWS; else return 0; default: return draw_get_shader_param(shader, param); } default: return 0; } }
static int softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { #ifdef HAVE_LLVM struct softpipe_screen *sp_screen = softpipe_screen(screen); #endif switch(shader) { case PIPE_SHADER_FRAGMENT: return tgsi_exec_get_shader_param(param); case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: #ifdef HAVE_LLVM if (sp_screen->use_llvm) /* Softpipe doesn't yet know how to tell draw/llvm about textures */ return 0; #endif return PIPE_MAX_VERTEX_SAMPLERS; case PIPE_SHADER_CAP_INTEGERS: #ifdef HAVE_LLVM /* gallivm doesn't support integers yet */ if (sp_screen->use_llvm) return 0; #endif /* fallthrough */ default: return draw_get_shader_param(shader, param); } default: return 0; } }
static int llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { switch(shader) { case PIPE_SHADER_FRAGMENT: return tgsi_exec_get_shader_param(param); case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: return draw_get_shader_param(shader, param); default: return 0; } }
static int softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { struct softpipe_screen *sp_screen = softpipe_screen(screen); switch(shader) { case PIPE_SHADER_FRAGMENT: return tgsi_exec_get_shader_param(param); case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: if (sp_screen->use_llvm) return draw_get_shader_param(shader, param); else return draw_get_shader_param_no_llvm(shader, param); default: return 0; } }
static int softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) { switch(shader) { case PIPE_SHADER_FRAGMENT: return tgsi_exec_get_shader_param(param); case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: #ifdef HAVE_LLVM /* Softpipe doesn't yet know how to tell draw/llvm about textures */ return 0; #else return PIPE_MAX_VERTEX_SAMPLERS; #endif default: return draw_get_shader_param(shader, param); } default: return 0; } }
static int i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap cap) { switch(shader) { case PIPE_SHADER_VERTEX: switch (cap) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: if (debug_get_bool_option("DRAW_USE_LLVM", TRUE)) return PIPE_MAX_SAMPLERS; else return 0; default: return draw_get_shader_param(shader, cap); } case PIPE_SHADER_FRAGMENT: /* XXX: some of these are just shader model 2.0 values, fix this! */ switch(cap) { case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: return I915_MAX_ALU_INSN + I915_MAX_TEX_INSN; case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: return I915_MAX_ALU_INSN; case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: return I915_MAX_TEX_INSN; case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: return 8; case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: return 0; case PIPE_SHADER_CAP_MAX_INPUTS: return 10; case PIPE_SHADER_CAP_MAX_OUTPUTS: return 1; case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: return 32 * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: return 12; /* XXX: 12 -> 32 ? */ case PIPE_SHADER_CAP_MAX_PREDS: return 0; case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: return 0; case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: return 1; case PIPE_SHADER_CAP_SUBROUTINES: return 0; case PIPE_SHADER_CAP_INTEGERS: return 0; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return I915_TEX_UNITS; case PIPE_SHADER_CAP_DOUBLES: case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: return 32; default: debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap); return 0; } break; default: return 0; } }
static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum pipe_shader_cap param) { struct r300_screen* r300screen = r300_screen(pscreen); boolean is_r400 = r300screen->caps.is_r400; boolean is_r500 = r300screen->caps.is_r500; switch (shader) { case PIPE_SHADER_FRAGMENT: switch (param) { case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: return is_r500 || is_r400 ? 512 : 96; case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: return is_r500 || is_r400 ? 512 : 64; case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: return is_r500 || is_r400 ? 512 : 32; case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: return is_r500 ? 511 : 4; case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: return is_r500 ? 64 : 0; /* Actually unlimited on r500. */ /* Fragment shader limits. */ case PIPE_SHADER_CAP_MAX_INPUTS: /* 2 colors + 8 texcoords are always supported * (minus fog and wpos). * * R500 has the ability to turn 3rd and 4th color into * additional texcoords but there is no two-sided color * selection then. However the facing bit can be used instead. */ return 10; case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: return (is_r500 ? 256 : 32) * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: return is_r500 ? 128 : is_r400 ? 64 : 32; case PIPE_SHADER_CAP_MAX_PREDS: return is_r500 ? 1 : 0; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return r300screen->caps.num_tex_units; case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: case PIPE_SHADER_CAP_SUBROUTINES: case PIPE_SHADER_CAP_INTEGERS: case PIPE_SHADER_CAP_DOUBLES: return 0; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; } break; case PIPE_SHADER_VERTEX: switch (param) { case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: case PIPE_SHADER_CAP_SUBROUTINES: return 0; default:; } if (!r300screen->caps.has_tcl) { return draw_get_shader_param(shader, param); } switch (param) { case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: return is_r500 ? 1024 : 256; case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */ case PIPE_SHADER_CAP_MAX_INPUTS: return 16; case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: return 256 * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: return 32; case PIPE_SHADER_CAP_MAX_PREDS: return is_r500 ? 4 : 0; /* XXX guessed. */ case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: return 1; case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: case PIPE_SHADER_CAP_SUBROUTINES: case PIPE_SHADER_CAP_INTEGERS: case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: case PIPE_SHADER_CAP_DOUBLES: return 0; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; } break; } return 0; }