Lines Matching refs:ctx
93 compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel,
96 struct d3d12_screen *screen = d3d12_screen(ctx->base.screen);
153 opts.validator_version_max = dxil_get_validator_version(ctx->dxil_validator);
195 if (ctx->dxil_validator) {
198 if (!dxil_validate_module(ctx->dxil_validator, tmp.data,
210 char *str = dxil_disasm_module(ctx->dxil_validator, tmp.data,
237 struct d3d12_context *ctx;
251 missing_dual_src_outputs(struct d3d12_context *ctx)
253 if (!ctx->gfx_pipeline_state.blend->is_dual_src)
256 struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
294 frag_result_color_lowering(struct d3d12_context *ctx)
296 struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
300 return ctx->fb.nr_cbufs > 1 ? ctx->fb.nr_cbufs : 0;
306 manual_depth_range(struct d3d12_context *ctx)
308 if (!d3d12_need_zero_one_depth_range(ctx))
331 struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
344 fill_mode_lowered(struct d3d12_context *ctx, const struct pipe_draw_info *dinfo)
346 struct d3d12_shader_selector *vs = ctx->gfx_stages[PIPE_SHADER_VERTEX];
348 if ((ctx->gfx_stages[PIPE_SHADER_GEOMETRY] != NULL &&
349 !ctx->gfx_stages[PIPE_SHADER_GEOMETRY]->is_variant) ||
350 ctx->gfx_pipeline_state.rast == NULL ||
356 if (((ctx->gfx_pipeline_state.rast->base.fill_front == PIPE_POLYGON_MODE_LINE &&
357 ctx->gfx_pipeline_state.rast->base.cull_face != PIPE_FACE_FRONT) ||
358 (ctx->gfx_pipeline_state.rast->base.fill_back == PIPE_POLYGON_MODE_LINE &&
359 ctx->gfx_pipeline_state.rast->base.cull_face == PIPE_FACE_FRONT)) &&
361 needs_edge_flag_fix(ctx->initial_api_prim)))
364 if (ctx->gfx_pipeline_state.rast->base.fill_front == PIPE_POLYGON_MODE_POINT)
371 has_stream_out_for_streams(struct d3d12_context *ctx)
373 unsigned mask = ctx->gfx_stages[PIPE_SHADER_GEOMETRY]->initial->info.gs.active_stream_mask & ~1;
374 for (unsigned i = 0; i < ctx->gfx_pipeline_state.so_info.num_outputs; ++i) {
375 unsigned stream = ctx->gfx_pipeline_state.so_info.output[i].stream;
377 ctx->so_buffer_views[stream].SizeInBytes)
384 needs_point_sprite_lowering(struct d3d12_context *ctx, const struct pipe_draw_info *dinfo)
386 struct d3d12_shader_selector *vs = ctx->gfx_stages[PIPE_SHADER_VERTEX];
387 struct d3d12_shader_selector *gs = ctx->gfx_stages[PIPE_SHADER_GEOMETRY];
393 ctx->gfx_pipeline_state.rast->base.point_size > 1.0) &&
395 !has_stream_out_for_streams(ctx)));
399 fill_mode_lowered(ctx, dinfo) == PIPE_POLYGON_MODE_POINT) &&
400 (ctx->gfx_pipeline_state.rast->base.point_size > 1.0 ||
401 ctx->gfx_pipeline_state.rast->base.offset_point ||
402 (ctx->gfx_pipeline_state.rast->base.point_size_per_vertex &&
409 cull_mode_lowered(struct d3d12_context *ctx, unsigned fill_mode)
411 if ((ctx->gfx_stages[PIPE_SHADER_GEOMETRY] != NULL &&
412 !ctx->gfx_stages[PIPE_SHADER_GEOMETRY]->is_variant) ||
413 ctx->gfx_pipeline_state.rast == NULL ||
414 ctx->gfx_pipeline_state.rast->base.cull_face == PIPE_FACE_NONE)
417 return ctx->gfx_pipeline_state.rast->base.cull_face;
428 struct d3d12_shader_selector *vs = sel_ctx->ctx->gfx_stages[PIPE_SHADER_VERTEX];
429 struct d3d12_shader_selector *gs = sel_ctx->ctx->gfx_stages[PIPE_SHADER_GEOMETRY];
449 bool flatshade_first = sel_ctx->ctx->gfx_pipeline_state.rast &&
450 sel_ctx->ctx->gfx_pipeline_state.rast->base.flatshade_first;
458 has_flat_varyings(struct d3d12_context *ctx)
460 struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
480 struct d3d12_context *ctx = sel_ctx->ctx;
481 bool flat = has_flat_varyings(ctx);
482 bool xfb = ctx->gfx_pipeline_state.num_so_targets > 0;
484 if (fill_mode_lowered(ctx, dinfo) != PIPE_POLYGON_MODE_FILL)
491 if (flat && sel_ctx->provoking_vertex >= 2 && (!d3d12_screen(ctx->base.screen)->have_load_at_vertex ||
592 struct d3d12_context *ctx = sel_ctx->ctx;
593 d3d12_shader_selector *vs = ctx->gfx_stages[PIPE_SHADER_VERTEX];
594 d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
598 d3d12_shader_selector *gs = ctx->gfx_stages[PIPE_SHADER_GEOMETRY];
610 key.front_ccw = ctx->gfx_pipeline_state.rast->base.front_ccw ^ (ctx->flip_y < 0);
611 key.edge_flag_fix = needs_edge_flag_fix(ctx->initial_api_prim);
614 key.flatshade_first = ctx->gfx_pipeline_state.rast->base.flatshade_first;
636 gs = variant_needed ? d3d12_get_gs_variant(ctx, &key) : NULL;
637 ctx->gfx_stages[PIPE_SHADER_GEOMETRY] = gs;
643 struct d3d12_context *ctx = sel_ctx->ctx;
644 d3d12_shader_selector *vs = ctx->gfx_stages[PIPE_SHADER_VERTEX];
645 d3d12_shader_selector *tcs = ctx->gfx_stages[PIPE_SHADER_TESS_CTRL];
646 d3d12_shader_selector *tes = ctx->gfx_stages[PIPE_SHADER_TESS_EVAL];
659 key.vertices_out = ctx->patch_vertices;
667 tcs = variant_needed ? d3d12_get_tcs_variant(ctx, &key) : NULL;
668 ctx->gfx_stages[PIPE_SHADER_TESS_CTRL] = tcs;
900 if (stage == PIPE_SHADER_FRAGMENT && sel_ctx->ctx->gfx_pipeline_state.rast &&
902 d3d12_screen(sel_ctx->ctx->base.screen)->have_load_at_vertex)
938 key->invert_depth = sel_ctx->ctx->reverse_depth_range;
939 key->halfz = sel_ctx->ctx->gfx_pipeline_state.rast ?
940 sel_ctx->ctx->gfx_pipeline_state.rast->base.clip_halfz : false;
941 if (sel_ctx->ctx->pstipple.enabled &&
942 sel_ctx->ctx->gfx_pipeline_state.rast->base.poly_stipple_enable)
946 if (stage == PIPE_SHADER_GEOMETRY && sel_ctx->ctx->gfx_pipeline_state.rast) {
947 struct pipe_rasterizer_state *rast = &sel_ctx->ctx->gfx_pipeline_state.rast->base;
953 if (sel_ctx->ctx->flip_y < 0)
969 key->fs.polygon_stipple = sel_ctx->ctx->pstipple.enabled &&
970 sel_ctx->ctx->gfx_pipeline_state.rast->base.poly_stipple_enable;
971 key->fs.multisample_disabled = sel_ctx->ctx->gfx_pipeline_state.rast &&
972 !sel_ctx->ctx->gfx_pipeline_state.rast->desc.MultisampleEnable;
973 if (sel_ctx->ctx->gfx_pipeline_state.blend &&
974 sel_ctx->ctx->gfx_pipeline_state.blend->desc.RenderTarget[0].LogicOpEnable &&
975 !sel_ctx->ctx->gfx_pipeline_state.has_float_rtv) {
976 key->fs.cast_to_uint = util_format_is_unorm(sel_ctx->ctx->fb.cbufs[0]->format);
991 key->hs.patch_vertices_in = MAX2(sel_ctx->ctx->patch_vertices, 1);
1001 key->n_texture_states = sel_ctx->ctx->num_sampler_views[stage];
1004 auto& wrap_state = sel_ctx->ctx->tex_wrap_states[stage][i];
1007 key->swizzle_state[i] = sel_ctx->ctx->tex_swizzle_state[stage][i];
1012 for (unsigned i = 0; i < sel_ctx->ctx->num_samplers[stage]; ++i) {
1013 if (!sel_ctx->ctx->samplers[stage][i] ||
1014 sel_ctx->ctx->samplers[stage][i]->filter == PIPE_TEX_FILTER_NEAREST)
1017 if (sel_ctx->ctx->samplers[stage][i]->wrap_r == PIPE_TEX_WRAP_CLAMP)
1019 if (sel_ctx->ctx->samplers[stage][i]->wrap_s == PIPE_TEX_WRAP_CLAMP)
1021 if (sel_ctx->ctx->samplers[stage][i]->wrap_t == PIPE_TEX_WRAP_CLAMP)
1026 key->n_texture_states = sel_ctx->ctx->num_sampler_views[stage];
1027 memcpy(key->sampler_compare_funcs, sel_ctx->ctx->tex_compare_func[stage],
1029 memcpy(key->swizzle_state, sel_ctx->ctx->tex_swizzle_state[stage],
1033 if (stage == PIPE_SHADER_VERTEX && sel_ctx->ctx->gfx_pipeline_state.ves) {
1034 key->vs.needs_format_emulation = sel_ctx->ctx->gfx_pipeline_state.ves->needs_format_emulation;
1036 memcpy(key->vs.format_conversion, sel_ctx->ctx->gfx_pipeline_state.ves->format_conversion,
1037 sel_ctx->ctx->gfx_pipeline_state.ves->num_elements * sizeof(enum pipe_format));
1042 sel_ctx->ctx->gfx_stages[PIPE_SHADER_GEOMETRY] &&
1043 sel_ctx->ctx->gfx_stages[PIPE_SHADER_GEOMETRY]->is_variant &&
1044 sel_ctx->ctx->gfx_stages[PIPE_SHADER_GEOMETRY]->gs_key.has_front_face) {
1052 key->n_images = sel_ctx->ctx->num_image_views[stage];
1054 key->image_format_conversion[i].emulated_format = sel_ctx->ctx->image_view_emulation_formats[stage][i];
1056 key->image_format_conversion[i].view_format = sel_ctx->ctx->image_views[stage][i].format;
1066 struct d3d12_context *ctx = sel_ctx->ctx;
1223 d3d12_shader *new_variant = compile_nir(ctx, sel, &key, new_nir_variant);
1235 get_prev_shader(struct d3d12_context *ctx, pipe_shader_type current)
1241 if (ctx->gfx_stages[PIPE_SHADER_GEOMETRY])
1242 return ctx->gfx_stages[PIPE_SHADER_GEOMETRY];
1245 if (ctx->gfx_stages[PIPE_SHADER_TESS_EVAL])
1246 return ctx->gfx_stages[PIPE_SHADER_TESS_EVAL];
1249 if (ctx->gfx_stages[PIPE_SHADER_TESS_CTRL])
1250 return ctx->gfx_stages[PIPE_SHADER_TESS_CTRL];
1253 return ctx->gfx_stages[PIPE_SHADER_VERTEX];
1260 get_next_shader(struct d3d12_context *ctx, pipe_shader_type current)
1264 if (ctx->gfx_stages[PIPE_SHADER_TESS_CTRL])
1265 return ctx->gfx_stages[PIPE_SHADER_TESS_CTRL];
1268 if (ctx->gfx_stages[PIPE_SHADER_TESS_EVAL])
1269 return ctx->gfx_stages[PIPE_SHADER_TESS_EVAL];
1272 if (ctx->gfx_stages[PIPE_SHADER_GEOMETRY])
1273 return ctx->gfx_stages[PIPE_SHADER_GEOMETRY];
1276 return ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
1345 d3d12_create_shader_impl(struct d3d12_context *ctx,
1382 sel_ctx.ctx = ctx;
1394 d3d12_create_shader(struct d3d12_context *ctx,
1407 nir = tgsi_to_nir(shader->tokens, ctx->base.screen, false);
1415 d3d12_shader_selector *prev = get_prev_shader(ctx, sel->stage);
1416 d3d12_shader_selector *next = get_next_shader(ctx, sel->stage);
1438 return d3d12_create_shader_impl(ctx, sel, nir, prev, next);
1442 d3d12_create_compute_shader(struct d3d12_context *ctx,
1454 nir = tgsi_to_nir(shader->prog, ctx->base.screen, false);
1461 return d3d12_create_shader_impl(ctx, sel, nir, nullptr, nullptr);
1465 d3d12_select_shader_variants(struct d3d12_context *ctx, const struct pipe_draw_info *dinfo)
1476 sel_ctx.ctx = ctx;
1477 sel_ctx.needs_point_sprite_lowering = needs_point_sprite_lowering(ctx, dinfo);
1478 sel_ctx.fill_mode_lowered = fill_mode_lowered(ctx, dinfo);
1479 sel_ctx.cull_mode_lowered = cull_mode_lowered(ctx, sel_ctx.fill_mode_lowered);
1482 sel_ctx.missing_dual_src_outputs = missing_dual_src_outputs(ctx);
1483 sel_ctx.frag_result_color_lowering = frag_result_color_lowering(ctx);
1484 sel_ctx.manual_depth_range = manual_depth_range(ctx);
1490 auto sel = ctx->gfx_stages[order[i]];
1494 d3d12_shader_selector *prev = get_prev_shader(ctx, sel->stage);
1495 d3d12_shader_selector *next = get_next_shader(ctx, sel->stage);
1502 workgroup_size_variable(struct d3d12_context *ctx,
1505 if (ctx->compute_state->workgroup_size_variable)
1511 d3d12_select_compute_shader_variants(struct d3d12_context *ctx, const struct pipe_grid_info *info)
1515 sel_ctx.ctx = ctx;
1516 sel_ctx.variable_workgroup_size = workgroup_size_variable(ctx, info);
1518 select_shader_variant(&sel_ctx, ctx->compute_state, nullptr, nullptr);