X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fdrivers%2Filo%2Filo_shader.c;h=480b477181696456c434cd0e101833a68a5da72d;hb=40b9812a761ce0745d9e17b92fd0abd27eb86bd7;hp=5f95a19244fa368aa4201348f2f7d3b3c6c43819;hpb=9b18df6e087a4db8ed5ed38bcc6b1db34fa95586;p=mesa.git diff --git a/src/gallium/drivers/ilo/ilo_shader.c b/src/gallium/drivers/ilo/ilo_shader.c index 5f95a19244f..480b4771816 100644 --- a/src/gallium/drivers/ilo/ilo_shader.c +++ b/src/gallium/drivers/ilo/ilo_shader.c @@ -273,6 +273,13 @@ ilo_shader_variant_init(struct ilo_shader_variant *variant, break; } + /* use PCB unless constant buffer 0 is not in user buffer */ + if ((ilo->cbuf[info->type].enabled_mask & 0x1) && + !ilo->cbuf[info->type].cso[0].user_buffer) + variant->use_pcb = false; + else + variant->use_pcb = true; + num_views = ilo->view[info->type].count; assert(info->num_samplers <= num_views); @@ -341,6 +348,8 @@ ilo_shader_variant_guess(struct ilo_shader_variant *variant, break; } + variant->use_pcb = true; + variant->num_sampler_views = info->num_samplers; for (i = 0; i < info->num_samplers; i++) { if (info->shadow_samplers & (1 << i)) { @@ -746,8 +755,9 @@ ilo_shader_create_vs(const struct ilo_dev_info *dev, shader = ilo_shader_state_create(precompile, PIPE_SHADER_VERTEX, state); /* states used in ilo_shader_variant_init() */ - shader->info.non_orthogonal_states = ILO_DIRTY_VERTEX_SAMPLER_VIEWS | - ILO_DIRTY_RASTERIZER; + shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_VS | + ILO_DIRTY_RASTERIZER | + ILO_DIRTY_CBUF; return shader; } @@ -762,9 +772,10 @@ ilo_shader_create_gs(const struct ilo_dev_info *dev, shader = ilo_shader_state_create(precompile, PIPE_SHADER_GEOMETRY, state); /* states used in ilo_shader_variant_init() */ - shader->info.non_orthogonal_states = ILO_DIRTY_GEOMETRY_SAMPLER_VIEWS | + shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_GS | ILO_DIRTY_VS | - ILO_DIRTY_RASTERIZER; + ILO_DIRTY_RASTERIZER | + ILO_DIRTY_CBUF; return shader; } @@ -779,9 +790,10 @@ ilo_shader_create_fs(const struct ilo_dev_info *dev, shader = ilo_shader_state_create(precompile, PIPE_SHADER_FRAGMENT, state); /* states used in ilo_shader_variant_init() */ - shader->info.non_orthogonal_states = ILO_DIRTY_FRAGMENT_SAMPLER_VIEWS | + shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_FS | ILO_DIRTY_RASTERIZER | - ILO_DIRTY_FRAMEBUFFER; + ILO_DIRTY_FB | + ILO_DIRTY_CBUF; return shader; } @@ -891,7 +903,7 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader, /* we are constructing 3DSTATE_SBE here */ assert(shader->info.dev->gen >= ILO_GEN(6) && - shader->info.dev->gen <= ILO_GEN(7)); + shader->info.dev->gen <= ILO_GEN(7.5)); assert(kernel); @@ -900,20 +912,36 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader, src_semantics = source->shader->out.semantic_names; src_indices = source->shader->out.semantic_indices; src_len = source->shader->out.count; + } + else { + src_semantics = kernel->in.semantic_names; + src_indices = kernel->in.semantic_indices; + src_len = kernel->in.count; + } + /* no change */ + if (kernel->routing_initialized && + routing->source_skip + routing->source_len <= src_len && + kernel->routing_sprite_coord_enable == sprite_coord_enable && + !memcmp(kernel->routing_src_semantics, + &src_semantics[routing->source_skip], + sizeof(kernel->routing_src_semantics[0]) * routing->source_len) && + !memcmp(kernel->routing_src_indices, + &src_indices[routing->source_skip], + sizeof(kernel->routing_src_indices[0]) * routing->source_len)) + return false; + + if (source) { /* skip PSIZE and POSITION (how about the optional CLIPDISTs?) */ assert(src_semantics[0] == TGSI_SEMANTIC_PSIZE); assert(src_semantics[1] == TGSI_SEMANTIC_POSITION); routing->source_skip = 2; + routing->source_len = src_len - routing->source_skip; src_semantics += routing->source_skip; src_indices += routing->source_skip; } else { - src_semantics = kernel->in.semantic_names; - src_indices = kernel->in.semantic_indices; - src_len = kernel->in.count; - routing->source_skip = 0; routing->source_len = src_len; } @@ -997,6 +1025,14 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader, */ routing->source_len = max_src_slot + 1; + /* remember the states of the source */ + kernel->routing_initialized = true; + kernel->routing_sprite_coord_enable = sprite_coord_enable; + memcpy(kernel->routing_src_semantics, src_semantics, + sizeof(kernel->routing_src_semantics[0]) * routing->source_len); + memcpy(kernel->routing_src_indices, src_indices, + sizeof(kernel->routing_src_indices[0]) * routing->source_len); + return true; } @@ -1036,6 +1072,12 @@ ilo_shader_get_kernel_param(const struct ilo_shader_state *shader, case ILO_KERNEL_URB_DATA_START_REG: val = kernel->in.start_grf; break; + case ILO_KERNEL_SKIP_CBUF0_UPLOAD: + val = kernel->skip_cbuf0_upload; + break; + case ILO_KERNEL_PCB_CBUF0_SIZE: + val = kernel->pcb.cbuf0_size; + break; case ILO_KERNEL_VS_INPUT_INSTANCEID: val = shader->info.has_instanceid;