#include "tgsi/tgsi_dump.h"
void
-panfrost_shader_compile(struct panfrost_context *ctx, struct mali_shader_meta *meta, const char *src, int type, struct panfrost_shader_state *state)
+panfrost_shader_compile(
+ struct panfrost_context *ctx,
+ struct mali_shader_meta *meta,
+ enum pipe_shader_ir ir_type,
+ const void *ir,
+ const char *src,
+ int type,
+ struct panfrost_shader_state *state)
{
uint8_t *dst;
nir_shader *s;
- struct pipe_shader_state *cso = state->base;
-
- if (cso->type == PIPE_SHADER_IR_NIR) {
- s = nir_shader_clone(NULL, cso->ir.nir);
+ if (ir_type == PIPE_SHADER_IR_NIR) {
+ s = nir_shader_clone(NULL, ir);
} else {
- assert (cso->type == PIPE_SHADER_IR_TGSI);
- //tgsi_dump(cso->tokens, 0);
- s = tgsi_to_nir(cso->tokens, ctx->base.screen);
+ assert (ir_type == PIPE_SHADER_IR_TGSI);
+ s = tgsi_to_nir(ir, ctx->base.screen);
}
s->info.stage = type == JOB_TYPE_VERTEX ? MESA_SHADER_VERTEX : MESA_SHADER_FRAGMENT;
/* We finally have a variant, so compile it */
if (!shader_state->compiled) {
- panfrost_shader_compile(ctx, shader_state->tripipe, NULL,
+ panfrost_shader_compile(ctx, shader_state->tripipe,
+ variants->base.type,
+ variants->base.type == PIPE_SHADER_IR_NIR ?
+ variants->base.ir.nir :
+ variants->base.tokens,
+ NULL,
panfrost_job_type_for_pipe(type), shader_state);
shader_state->compiled = true;
panfrost_fragment_job(struct panfrost_context *ctx, bool has_draws);
void
-panfrost_shader_compile(struct panfrost_context *ctx, struct mali_shader_meta *meta, const char *src, int type, struct panfrost_shader_state *state);
+panfrost_shader_compile(
+ struct panfrost_context *ctx,
+ struct mali_shader_meta *meta,
+ enum pipe_shader_ir ir_type,
+ const void *ir,
+ const char *src,
+ int type,
+ struct panfrost_shader_state *state);
void
panfrost_pack_work_groups_compute(