- if (prog->tgsi.type == PIPE_SHADER_IR_NIR) {
- tgsi.type = PIPE_SHADER_IR_NIR;
- tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir);
- tgsi.stream_output = prog->tgsi.stream_output;
- } else
- tgsi = prog->tgsi;
- /* fill in new variant */
- switch (pipe_shader) {
- case PIPE_SHADER_TESS_CTRL:
- v->driver_shader = pipe->create_tcs_state(pipe, &tgsi);
- break;
- case PIPE_SHADER_TESS_EVAL:
- v->driver_shader = pipe->create_tes_state(pipe, &tgsi);
- break;
- case PIPE_SHADER_GEOMETRY:
- v->driver_shader = pipe->create_gs_state(pipe, &tgsi);
- break;
- default:
- assert(!"unhandled shader type");
- free(v);
- return NULL;
- }
-
- v->key = key;
-
- /* insert into list */
- v->next = prog->variants;
- prog->variants = v;
- }
- }
-
- return v;
-}
-
-
-/**
- * Translate a tessellation control program to create a new variant.
- */
-bool
-st_translate_tessctrl_program(struct st_context *st,
- struct st_common_program *sttcp)
-{
- struct ureg_program *ureg;
-
- /* We have already compiled to NIR so just return */
- if (sttcp->shader_program) {
- /* No variants */
- st_finalize_nir(st, &sttcp->Base, sttcp->shader_program,
- sttcp->tgsi.ir.nir);
- st_store_ir_in_disk_cache(st, &sttcp->Base, true);
- return true;
- }
-
- ureg = ureg_create_with_screen(PIPE_SHADER_TESS_CTRL, st->pipe->screen);
- if (ureg == NULL)
- return false;
-
- ureg_property(ureg, TGSI_PROPERTY_TCS_VERTICES_OUT,
- sttcp->Base.info.tess.tcs_vertices_out);
-
- st_translate_program_common(st, &sttcp->Base, sttcp->glsl_to_tgsi, ureg,
- PIPE_SHADER_TESS_CTRL, &sttcp->tgsi);
-
- free_glsl_to_tgsi_visitor(sttcp->glsl_to_tgsi);
- sttcp->glsl_to_tgsi = NULL;
- return true;
-}
-
-
-/**
- * Translate a tessellation evaluation program to create a new variant.
- */
-bool
-st_translate_tesseval_program(struct st_context *st,
- struct st_common_program *sttep)
-{
- struct ureg_program *ureg;
-
- /* We have already compiled to NIR so just return */
- if (sttep->shader_program) {
- /* No variants */
- st_finalize_nir(st, &sttep->Base, sttep->shader_program,
- sttep->tgsi.ir.nir);
- st_translate_program_stream_output(&sttep->Base, &sttep->tgsi.stream_output);
- st_store_ir_in_disk_cache(st, &sttep->Base, true);
- return true;
- }
-
- ureg = ureg_create_with_screen(PIPE_SHADER_TESS_EVAL, st->pipe->screen);
- if (ureg == NULL)
- return false;
-
- if (sttep->Base.info.tess.primitive_mode == GL_ISOLINES)
- ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, GL_LINES);
- else
- ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE,
- sttep->Base.info.tess.primitive_mode);
-
- STATIC_ASSERT((TESS_SPACING_EQUAL + 1) % 3 == PIPE_TESS_SPACING_EQUAL);
- STATIC_ASSERT((TESS_SPACING_FRACTIONAL_ODD + 1) % 3 ==
- PIPE_TESS_SPACING_FRACTIONAL_ODD);
- STATIC_ASSERT((TESS_SPACING_FRACTIONAL_EVEN + 1) % 3 ==
- PIPE_TESS_SPACING_FRACTIONAL_EVEN);
-
- ureg_property(ureg, TGSI_PROPERTY_TES_SPACING,
- (sttep->Base.info.tess.spacing + 1) % 3);
-
- ureg_property(ureg, TGSI_PROPERTY_TES_VERTEX_ORDER_CW,
- !sttep->Base.info.tess.ccw);
- ureg_property(ureg, TGSI_PROPERTY_TES_POINT_MODE,
- sttep->Base.info.tess.point_mode);
-
- st_translate_program_common(st, &sttep->Base, sttep->glsl_to_tgsi,
- ureg, PIPE_SHADER_TESS_EVAL, &sttep->tgsi);
-
- free_glsl_to_tgsi_visitor(sttep->glsl_to_tgsi);
- sttep->glsl_to_tgsi = NULL;
- return true;
-}