hash = sc->depth_stencil_hash;
case CSO_RASTERIZER:
hash = sc->rasterizer_hash;
- case CSO_SHADER:
- hash = sc->shader_hash;
+ case CSO_FRAGMENT_SHADER:
+ hash = sc->fs_hash;
+ case CSO_VERTEX_SHADER:
+ hash = sc->vs_hash;
}
return hash;
return sizeof(struct pipe_depth_stencil_state);
case CSO_RASTERIZER:
return sizeof(struct pipe_rasterizer_state);
- case CSO_SHADER:
+ case CSO_FRAGMENT_SHADER:
+ return sizeof(struct pipe_shader_state);
+ case CSO_VERTEX_SHADER:
return sizeof(struct pipe_shader_state);
}
return 0;
sc->sampler_hash = cso_hash_create();
sc->depth_stencil_hash = cso_hash_create();
sc->rasterizer_hash = cso_hash_create();
- sc->shader_hash = cso_hash_create();
+ sc->fs_hash = cso_hash_create();
+ sc->vs_hash = cso_hash_create();
return sc;
}
cso_hash_delete(sc->sampler_hash);
cso_hash_delete(sc->depth_stencil_hash);
cso_hash_delete(sc->rasterizer_hash);
- cso_hash_delete(sc->shader_hash);
+ cso_hash_delete(sc->fs_hash);
+ cso_hash_delete(sc->vs_hash);
free(sc);
}
struct cso_hash *sampler_hash;
struct cso_hash *depth_stencil_hash;
struct cso_hash *rasterizer_hash;
- struct cso_hash *shader_hash;
+ struct cso_hash *fs_hash;
+ struct cso_hash *vs_hash;
};
enum cso_cache_type {
CSO_SAMPLER,
CSO_DEPTH_STENCIL,
CSO_RASTERIZER,
- CSO_SHADER
+ CSO_FRAGMENT_SHADER,
+ CSO_VERTEX_SHADER
};
unsigned cso_construct_key(void *item, int item_size);
i915->pipe.create_rasterizer_state = i915_create_rasterizer_state;
i915->pipe.bind_rasterizer_state = i915_bind_rasterizer_state;
i915->pipe.delete_rasterizer_state = i915_delete_rasterizer_state;
- i915->pipe.create_shader_state = i915_create_shader_state;
+ i915->pipe.create_fs_state = i915_create_shader_state;
i915->pipe.bind_fs_state = i915_bind_fs_state;
+ i915->pipe.delete_fs_state = i915_delete_shader_state;
+ i915->pipe.create_vs_state = i915_create_shader_state;
i915->pipe.bind_vs_state = i915_bind_vs_state;
- i915->pipe.delete_shader_state = i915_delete_shader_state;
+ i915->pipe.delete_vs_state = i915_delete_shader_state;
i915->pipe.set_alpha_test_state = i915_set_alpha_test_state;
i915->pipe.set_blend_color = i915_set_blend_color;
void (*delete_depth_stencil_state)(struct pipe_context *,
const struct pipe_depth_stencil_state *);
- const struct pipe_shader_state * (*create_shader_state)(
+ const struct pipe_shader_state * (*create_fs_state)(
struct pipe_context *,
const struct pipe_shader_state *);
void (*bind_fs_state)(struct pipe_context *,
const struct pipe_shader_state *);
+ void (*delete_fs_state)(struct pipe_context *,
+ const struct pipe_shader_state *);
+ const struct pipe_shader_state * (*create_vs_state)(
+ struct pipe_context *,
+ const struct pipe_shader_state *);
void (*bind_vs_state)(struct pipe_context *,
const struct pipe_shader_state *);
- void (*delete_shader_state)(struct pipe_context *,
- const struct pipe_shader_state *);
+ void (*delete_vs_state)(struct pipe_context *,
+ const struct pipe_shader_state *);
void (*set_alpha_test_state)( struct pipe_context *,
const struct pipe_alpha_test_state * );
softpipe->pipe.create_rasterizer_state = softpipe_create_rasterizer_state;
softpipe->pipe.bind_rasterizer_state = softpipe_bind_rasterizer_state;
softpipe->pipe.delete_rasterizer_state = softpipe_delete_rasterizer_state;
- softpipe->pipe.create_shader_state = softpipe_create_shader_state;
- softpipe->pipe.bind_fs_state = softpipe_bind_fs_state;
- softpipe->pipe.bind_vs_state = softpipe_bind_vs_state;
- softpipe->pipe.delete_shader_state = softpipe_delete_shader_state;
+ softpipe->pipe.create_fs_state = softpipe_create_shader_state;
+ softpipe->pipe.bind_fs_state = softpipe_bind_fs_state;
+ softpipe->pipe.delete_fs_state = softpipe_delete_shader_state;
+ softpipe->pipe.create_vs_state = softpipe_create_shader_state;
+ softpipe->pipe.bind_vs_state = softpipe_bind_vs_state;
+ softpipe->pipe.delete_vs_state = softpipe_delete_shader_state;
softpipe->pipe.set_alpha_test_state = softpipe_set_alpha_test_state;
softpipe->pipe.set_blend_color = softpipe_set_blend_color;
fs.outputs_written
= tgsi_mesa_translate_fragment_output_mask(fp->Base.Base.OutputsWritten);
fs.tokens = &fp->tokens[0];
- cached = st_cached_shader_state(st, &fs);
+ cached = st_cached_fs_state(st, &fs);
fp->fsx = cached;
if (TGSI_DEBUG)
vs.tokens = &vp->tokens[0];
- cached = st_cached_shader_state(st, &vs);
+ cached = st_cached_vs_state(st, &vs);
vp->vs = cached;
return (struct pipe_rasterizer_state*)(cso_hash_iter_data(iter));
}
-struct pipe_shader_state * st_cached_shader_state(
+struct pipe_shader_state * st_cached_fs_state(
struct st_context *st,
const struct pipe_shader_state *templ)
{
unsigned hash_key = cso_construct_key((void*)templ,
sizeof(struct pipe_shader_state));
struct cso_hash_iter iter = cso_find_state_template(st->cache,
- hash_key, CSO_SHADER,
+ hash_key, CSO_FRAGMENT_SHADER,
(void*)templ);
if (cso_hash_iter_is_null(iter)) {
const struct pipe_shader_state *created_state =
- st->pipe->create_shader_state(st->pipe, templ);
- iter = cso_insert_state(st->cache, hash_key, CSO_SHADER,
+ st->pipe->create_fs_state(st->pipe, templ);
+ iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER,
+ (void*)created_state);
+ }
+ return (struct pipe_shader_state*)(cso_hash_iter_data(iter));
+}
+
+struct pipe_shader_state * st_cached_vs_state(
+ struct st_context *st,
+ const struct pipe_shader_state *templ)
+{
+ unsigned hash_key = cso_construct_key((void*)templ,
+ sizeof(struct pipe_shader_state));
+ struct cso_hash_iter iter = cso_find_state_template(st->cache,
+ hash_key, CSO_VERTEX_SHADER,
+ (void*)templ);
+ if (cso_hash_iter_is_null(iter)) {
+ const struct pipe_shader_state *created_state =
+ st->pipe->create_vs_state(st->pipe, templ);
+ iter = cso_insert_state(st->cache, hash_key, CSO_VERTEX_SHADER,
(void*)created_state);
}
return (struct pipe_shader_state*)(cso_hash_iter_data(iter));
struct st_context *st,
const struct pipe_rasterizer_state *raster);
-struct pipe_shader_state *st_cached_shader_state(
+struct pipe_shader_state *st_cached_fs_state(
+ struct st_context *st,
+ const struct pipe_shader_state *templ);
+
+
+struct pipe_shader_state *st_cached_vs_state(
struct st_context *st,
const struct pipe_shader_state *templ);
fs.inputs_read = tgsi_mesa_translate_fragment_input_mask(stfp->Base.Base.InputsRead);
fs.outputs_written = tgsi_mesa_translate_fragment_output_mask(stfp->Base.Base.OutputsWritten);
fs.tokens = &stfp->tokens[0];
- cached = st_cached_shader_state(st, &fs);
+ cached = st_cached_fs_state(st, &fs);
pipe->bind_fs_state(pipe, cached);
}
vs.inputs_read = stvp->Base.Base.InputsRead;
vs.outputs_written = stvp->Base.Base.OutputsWritten;
vs.tokens = &stvp->tokens[0];
- cached = st_cached_shader_state(st, &vs);
+ cached = st_cached_vs_state(st, &vs);
pipe->bind_vs_state(pipe, cached);
}
memset(&fs, 0, sizeof(fs));
fs.inputs_read = stfp->Base.Base.InputsRead;
fs.tokens = &stfp->tokens[0];
- cached = st_cached_shader_state(ctx->st, &fs);
+ cached = st_cached_fs_state(ctx->st, &fs);
pipe->bind_fs_state(pipe, cached);
}
vs.inputs_read = stvp->Base.Base.InputsRead;
vs.outputs_written = stvp->Base.Base.OutputsWritten;
vs.tokens = &stvp->tokens[0];
- cached = st_cached_shader_state(ctx->st, &vs);
+ cached = st_cached_vs_state(ctx->st, &vs);
pipe->bind_vs_state(pipe, cached);
}