DEBUG_GET_ONCE_BOOL_OPTION(gallium_dump_vs, "GALLIUM_DUMP_VS", FALSE)
-/**
- * Set a vertex shader constant buffer.
- * \param slot which constant buffer in [0, PIPE_MAX_CONSTANT_BUFFERS-1]
- * \param constants the mapped buffer
- * \param size size of buffer in bytes
- */
-void
-draw_vs_set_constants(struct draw_context *draw,
- unsigned slot,
- const void *constants,
- unsigned size)
-{
- const int alignment = 16;
-
- /* check if buffer is 16-byte aligned */
- if (((uintptr_t)constants) & (alignment - 1)) {
- /* if not, copy the constants into a new, 16-byte aligned buffer */
- if (size > draw->vs.const_storage_size[slot]) {
- if (draw->vs.aligned_constant_storage[slot]) {
- align_free((void *)draw->vs.aligned_constant_storage[slot]);
- }
- draw->vs.aligned_constant_storage[slot] =
- align_malloc(size, alignment);
- }
- assert(constants);
- memcpy((void *)draw->vs.aligned_constant_storage[slot],
- constants,
- size);
- constants = draw->vs.aligned_constant_storage[slot];
- }
-
- draw->vs.aligned_constants[slot] = constants;
- draw_vs_aos_machine_constants(draw->vs.aos_machine, slot, constants);
-}
-
-
void draw_vs_set_viewport( struct draw_context *draw,
const struct pipe_viewport_state *viewport )
{
- draw_vs_aos_machine_viewport( draw->vs.aos_machine, viewport );
}
tgsi_dump(shader->tokens, 0);
}
- if (!draw->pt.middle.llvm) {
-#if defined(PIPE_ARCH_X86)
- vs = draw_create_vs_sse( draw, shader );
-#elif defined(PIPE_ARCH_PPC)
- vs = draw_create_vs_ppc( draw, shader );
-#endif
- }
#if HAVE_LLVM
- else {
+ if (draw->pt.middle.llvm) {
vs = draw_create_vs_llvm(draw, shader);
}
#endif
if (vs)
{
uint i;
+ bool found_clipvertex = FALSE;
+ vs->position_output = -1;
for (i = 0; i < vs->info.num_outputs; i++) {
if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION &&
vs->info.output_semantic_index[i] == 0)
else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_EDGEFLAG &&
vs->info.output_semantic_index[i] == 0)
vs->edgeflag_output = i;
+ else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPVERTEX &&
+ vs->info.output_semantic_index[i] == 0) {
+ found_clipvertex = TRUE;
+ vs->clipvertex_output = i;
+ } else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) {
+ if (vs->info.output_semantic_index[i] == 0)
+ vs->clipdistance_output[0] = i;
+ else
+ vs->clipdistance_output[1] = i;
+ }
}
+ if (!found_clipvertex)
+ vs->clipvertex_output = vs->position_output;
}
assert(vs);
draw->vs.num_vs_outputs = dvs->info.num_outputs;
draw->vs.position_output = dvs->position_output;
draw->vs.edgeflag_output = dvs->edgeflag_output;
+ draw->vs.clipvertex_output = dvs->clipvertex_output;
+ draw->vs.clipdistance_output[0] = dvs->clipdistance_output[0];
+ draw->vs.clipdistance_output[1] = dvs->clipdistance_output[1];
dvs->prepare( dvs, draw );
}
else {
{
draw->dump_vs = debug_get_option_gallium_dump_vs();
- draw->vs.machine = tgsi_exec_machine_create();
- if (!draw->vs.machine)
+ draw->vs.tgsi.machine = tgsi_exec_machine_create();
+ if (!draw->vs.tgsi.machine)
return FALSE;
draw->vs.emit_cache = translate_cache_create();
if (!draw->vs.fetch_cache)
return FALSE;
- draw->vs.aos_machine = draw_vs_aos_machine();
-#ifdef PIPE_ARCH_X86
- if (!draw->vs.aos_machine)
- return FALSE;
-#endif
-
return TRUE;
}
void
draw_vs_destroy( struct draw_context *draw )
{
- uint i;
-
if (draw->vs.fetch_cache)
translate_cache_destroy(draw->vs.fetch_cache);
if (draw->vs.emit_cache)
translate_cache_destroy(draw->vs.emit_cache);
- if (draw->vs.aos_machine)
- draw_vs_aos_machine_destroy(draw->vs.aos_machine);
-
- for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) {
- if (draw->vs.aligned_constant_storage[i]) {
- align_free((void *)draw->vs.aligned_constant_storage[i]);
- }
- }
-
- tgsi_exec_machine_destroy(draw->vs.machine);
+ tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
}