#include "util/u_math.h"
#include "util/u_memory.h"
#include "pipe/p_shader_tokens.h"
+#include "pipe/p_screen.h"
#include "draw_private.h"
#include "draw_context.h"
#include "tgsi/tgsi_parse.h"
#include "tgsi/tgsi_scan.h"
+#include "nir/nir_to_tgsi_info.h"
+#include "nir.h"
static void
vs_llvm_prepare(struct draw_vertex_shader *shader,
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
unsigned count,
unsigned input_stride,
- unsigned output_stride )
+ unsigned output_stride,
+ const unsigned *elts)
{
/* we should never get here since the entire pipeline is
* generated in draw_pt_fetch_shade_pipeline_llvm.c */
vs_llvm_delete( struct draw_vertex_shader *dvs )
{
struct llvm_vertex_shader *shader = llvm_vertex_shader(dvs);
- struct pipe_fence_handle *fence = NULL;
struct draw_llvm_variant_list_item *li;
- struct pipe_context *pipe = dvs->draw->pipe;
-
- /*
- * XXX: This might be not neccessary at all.
- */
- pipe->flush(pipe, 0, &fence);
- if (fence) {
- pipe->screen->fence_finish(pipe->screen, fence, 0);
- pipe->screen->fence_reference(pipe->screen, &fence, NULL);
- }
-
li = first_elem(&shader->variants);
while(!at_end(&shader->variants, li)) {
}
assert(shader->variants_cached == 0);
+ if (dvs->state.ir.nir)
+ ralloc_free(dvs->state.ir.nir);
FREE((void*) dvs->state.tokens);
FREE( dvs );
}
{
struct llvm_vertex_shader *vs = CALLOC_STRUCT( llvm_vertex_shader );
- if (vs == NULL)
+ if (!vs)
return NULL;
- /* we make a private copy of the tokens */
- vs->base.state.tokens = tgsi_dup_tokens(state->tokens);
- if (!vs->base.state.tokens) {
- FREE(vs);
- return NULL;
+ /* due to some bugs in the feedback state tracker we have to check
+ for ir.nir & PIPE_SHADER_IR_NIR here. */
+ if (state->ir.nir && state->type == PIPE_SHADER_IR_NIR) {
+ vs->base.state.ir.nir = state->ir.nir;
+ if (!draw->pipe->screen->get_param(draw->pipe->screen, PIPE_CAP_PACKED_UNIFORMS))
+ NIR_PASS_V(state->ir.nir, nir_lower_uniforms_to_ubo, 16);
+ nir_tgsi_scan_shader(state->ir.nir, &vs->base.info, true);
+ } else {
+ /* we make a private copy of the tokens */
+ vs->base.state.tokens = tgsi_dup_tokens(state->tokens);
+ if (!vs->base.state.tokens) {
+ FREE(vs);
+ return NULL;
+ }
+
+ tgsi_scan_shader(state->tokens, &vs->base.info);
}
- tgsi_scan_shader(state->tokens, &vs->base.info);
+ vs->variant_key_size =
+ draw_llvm_variant_key_size(
+ vs->base.info.file_max[TGSI_FILE_INPUT]+1,
+ MAX2(vs->base.info.file_max[TGSI_FILE_SAMPLER]+1,
+ vs->base.info.file_max[TGSI_FILE_SAMPLER_VIEW]+1),
+ vs->base.info.file_max[TGSI_FILE_IMAGE]+1);
+ vs->base.state.type = state->type;
+ vs->base.state.stream_output = state->stream_output;
vs->base.draw = draw;
vs->base.prepare = vs_llvm_prepare;
vs->base.run_linear = vs_llvm_run_linear;
vs->base.delete = vs_llvm_delete;
- vs->base.create_varient = draw_vs_create_varient_generic;
+ vs->base.create_variant = draw_vs_create_variant_generic;
make_empty_list(&vs->variants);