}
}
-void cso_delete_fragment_shader(struct cso_context *ctx, void *handle )
-{
- if (handle == ctx->fragment_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_fs_state(ctx->pipe, NULL);
- ctx->fragment_shader = NULL;
- }
- ctx->pipe->delete_fs_state(ctx->pipe, handle);
-}
-
static void
cso_save_fragment_shader(struct cso_context *ctx)
{
}
}
-void cso_delete_vertex_shader(struct cso_context *ctx, void *handle )
-{
- if (handle == ctx->vertex_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_vs_state(ctx->pipe, NULL);
- ctx->vertex_shader = NULL;
- }
- ctx->pipe->delete_vs_state(ctx->pipe, handle);
-}
-
static void
cso_save_vertex_shader(struct cso_context *ctx)
{
}
}
-void cso_delete_geometry_shader(struct cso_context *ctx, void *handle)
-{
- if (handle == ctx->geometry_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_gs_state(ctx->pipe, NULL);
- ctx->geometry_shader = NULL;
- }
- ctx->pipe->delete_gs_state(ctx->pipe, handle);
-}
-
static void
cso_save_geometry_shader(struct cso_context *ctx)
{
}
}
-void cso_delete_tessctrl_shader(struct cso_context *ctx, void *handle)
-{
- if (handle == ctx->tessctrl_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_tcs_state(ctx->pipe, NULL);
- ctx->tessctrl_shader = NULL;
- }
- ctx->pipe->delete_tcs_state(ctx->pipe, handle);
-}
-
static void
cso_save_tessctrl_shader(struct cso_context *ctx)
{
}
}
-void cso_delete_tesseval_shader(struct cso_context *ctx, void *handle)
-{
- if (handle == ctx->tesseval_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_tes_state(ctx->pipe, NULL);
- ctx->tesseval_shader = NULL;
- }
- ctx->pipe->delete_tes_state(ctx->pipe, handle);
-}
-
static void
cso_save_tesseval_shader(struct cso_context *ctx)
{
}
}
-void cso_delete_compute_shader(struct cso_context *ctx, void *handle)
-{
- if (handle == ctx->compute_shader) {
- /* unbind before deleting */
- ctx->pipe->bind_compute_state(ctx->pipe, NULL);
- ctx->compute_shader = NULL;
- }
- ctx->pipe->delete_compute_state(ctx->pipe, handle);
-}
-
static void
cso_set_vertex_elements_direct(struct cso_context *ctx,
const struct cso_velems_state *velems)
*/
void cso_set_fragment_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_fragment_shader(struct cso_context *ctx, void *handle );
-
-
void cso_set_vertex_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_vertex_shader(struct cso_context *ctx, void *handle );
-
-
void cso_set_geometry_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_geometry_shader(struct cso_context *ctx, void *handle);
-
-
void cso_set_tessctrl_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_tessctrl_shader(struct cso_context *ctx, void *handle);
-
-
void cso_set_tesseval_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_tesseval_shader(struct cso_context *ctx, void *handle);
-
-
void cso_set_compute_shader_handle(struct cso_context *ctx, void *handle);
-void cso_delete_compute_shader(struct cso_context *ctx, void *handle);
void cso_set_framebuffer(struct cso_context *cso,
while (var_so && var_so->vdecl) {
if (var_so->cso) {
- cso_delete_vertex_shader(This->base.device->cso_sw, var_so->cso );
+ This->base.device->pipe_sw->delete_vs_state(This->base.device->pipe_sw, var_so->cso);
}
var_so = var_so->next;
}
}
static void
-cache_destroy(struct cso_context *cso,
+cache_destroy(struct pipe_context *pipe,
struct cso_hash *hash, unsigned processor)
{
struct cso_hash_iter iter = cso_hash_first_node(hash);
void *shader = (void *)cso_hash_iter_data(iter);
if (processor == PIPE_SHADER_FRAGMENT) {
- cso_delete_fragment_shader(cso, shader);
+ pipe->delete_fs_state(pipe, shader);
} else if (processor == PIPE_SHADER_VERTEX) {
- cso_delete_vertex_shader(cso, shader);
+ pipe->delete_vs_state(pipe, shader);
}
iter = cso_hash_erase(hash, iter);
}
void
xa_shaders_destroy(struct xa_shaders *sc)
{
- cache_destroy(sc->r->cso, &sc->vs_hash, PIPE_SHADER_VERTEX);
- cache_destroy(sc->r->cso, &sc->fs_hash, PIPE_SHADER_FRAGMENT);
+ cache_destroy(sc->r->pipe, &sc->vs_hash, PIPE_SHADER_VERTEX);
+ cache_destroy(sc->r->pipe, &sc->fs_hash, PIPE_SHADER_FRAGMENT);
FREE(sc);
}
st_destroy_clear(struct st_context *st)
{
if (st->clear.fs) {
- cso_delete_fragment_shader(st->cso_context, st->clear.fs);
+ st->pipe->delete_fs_state(st->pipe, st->clear.fs);
st->clear.fs = NULL;
}
if (st->clear.vs) {
- cso_delete_vertex_shader(st->cso_context, st->clear.vs);
+ st->pipe->delete_vs_state(st->pipe, st->clear.vs);
st->clear.vs = NULL;
}
if (st->clear.vs_layered) {
- cso_delete_vertex_shader(st->cso_context, st->clear.vs_layered);
+ st->pipe->delete_vs_state(st->pipe, st->clear.vs_layered);
st->clear.vs_layered = NULL;
}
if (st->clear.gs_layered) {
- cso_delete_geometry_shader(st->cso_context, st->clear.gs_layered);
+ st->pipe->delete_gs_state(st->pipe, st->clear.gs_layered);
st->clear.gs_layered = NULL;
}
}
for (i = 0; i < ARRAY_SIZE(st->drawpix.zs_shaders); i++) {
if (st->drawpix.zs_shaders[i])
- cso_delete_fragment_shader(st->cso_context,
- st->drawpix.zs_shaders[i]);
+ st->pipe->delete_fs_state(st->pipe, st->drawpix.zs_shaders[i]);
}
if (st->passthrough_vs)
- cso_delete_vertex_shader(st->cso_context, st->passthrough_vs);
+ st->pipe->delete_vs_state(st->pipe, st->passthrough_vs);
/* Free cache data */
for (i = 0; i < ARRAY_SIZE(st->drawpix_cache.entries); i++) {
{
GLuint i;
for (i = 0; i < NumCachedShaders; i++) {
- cso_delete_vertex_shader(st->cso_context, CachedShaders[i].handle);
+ st->pipe->delete_vs_state(st->pipe, CachedShaders[i].handle);
}
NumCachedShaders = 0;
}
switch (entry->type) {
case PIPE_SHADER_VERTEX:
- cso_delete_vertex_shader(st->cso_context, entry->shader);
+ st->pipe->delete_vs_state(st->pipe, entry->shader);
break;
case PIPE_SHADER_FRAGMENT:
- cso_delete_fragment_shader(st->cso_context, entry->shader);
+ st->pipe->delete_fs_state(st->pipe, entry->shader);
break;
case PIPE_SHADER_GEOMETRY:
- cso_delete_geometry_shader(st->cso_context, entry->shader);
+ st->pipe->delete_gs_state(st->pipe, entry->shader);
break;
case PIPE_SHADER_TESS_CTRL:
- cso_delete_tessctrl_shader(st->cso_context, entry->shader);
+ st->pipe->delete_tcs_state(st->pipe, entry->shader);
break;
case PIPE_SHADER_TESS_EVAL:
- cso_delete_tesseval_shader(st->cso_context, entry->shader);
+ st->pipe->delete_tes_state(st->pipe, entry->shader);
break;
case PIPE_SHADER_COMPUTE:
- cso_delete_compute_shader(st->cso_context, entry->shader);
+ st->pipe->delete_compute_state(st->pipe, entry->shader);
break;
default:
unreachable("invalid shader type in free_zombie_shaders()");
for (i = 0; i < ARRAY_SIZE(st->pbo.upload_fs); ++i) {
if (st->pbo.upload_fs[i]) {
- cso_delete_fragment_shader(st->cso_context, st->pbo.upload_fs[i]);
+ st->pipe->delete_fs_state(st->pipe, st->pbo.upload_fs[i]);
st->pbo.upload_fs[i] = NULL;
}
}
for (i = 0; i < ARRAY_SIZE(st->pbo.download_fs); ++i) {
for (unsigned j = 0; j < ARRAY_SIZE(st->pbo.download_fs[0]); ++j) {
if (st->pbo.download_fs[i][j]) {
- cso_delete_fragment_shader(st->cso_context, st->pbo.download_fs[i][j]);
+ st->pipe->delete_fs_state(st->pipe, st->pbo.download_fs[i][j]);
st->pbo.download_fs[i][j] = NULL;
}
}
}
if (st->pbo.gs) {
- cso_delete_geometry_shader(st->cso_context, st->pbo.gs);
+ st->pipe->delete_gs_state(st->pipe, st->pbo.gs);
st->pbo.gs = NULL;
}
if (st->pbo.vs) {
- cso_delete_vertex_shader(st->cso_context, st->pbo.vs);
+ st->pipe->delete_vs_state(st->pipe, st->pbo.vs);
st->pbo.vs = NULL;
}
}
*/
switch (target) {
case GL_VERTEX_PROGRAM_ARB:
- cso_delete_vertex_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_vs_state(st->pipe, v->driver_shader);
break;
case GL_TESS_CONTROL_PROGRAM_NV:
- cso_delete_tessctrl_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_tcs_state(st->pipe, v->driver_shader);
break;
case GL_TESS_EVALUATION_PROGRAM_NV:
- cso_delete_tesseval_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_tes_state(st->pipe, v->driver_shader);
break;
case GL_GEOMETRY_PROGRAM_NV:
- cso_delete_geometry_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_gs_state(st->pipe, v->driver_shader);
break;
case GL_FRAGMENT_PROGRAM_ARB:
- cso_delete_fragment_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_fs_state(st->pipe, v->driver_shader);
break;
case GL_COMPUTE_PROGRAM_NV:
- cso_delete_compute_shader(st->cso_context, v->driver_shader);
+ st->pipe->delete_compute_state(st->pipe, v->driver_shader);
break;
default:
unreachable("bad shader type in delete_basic_variant");
free(v);
}
+static void
+st_unbind_program(struct st_context *st, struct st_program *p)
+{
+ /* Unbind the shader in cso_context and re-bind in st/mesa. */
+ switch (p->Base.info.stage) {
+ case MESA_SHADER_VERTEX:
+ cso_set_vertex_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_VS_STATE;
+ break;
+ case MESA_SHADER_TESS_CTRL:
+ cso_set_tessctrl_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_TCS_STATE;
+ break;
+ case MESA_SHADER_TESS_EVAL:
+ cso_set_tesseval_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_TES_STATE;
+ break;
+ case MESA_SHADER_GEOMETRY:
+ cso_set_geometry_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_GS_STATE;
+ break;
+ case MESA_SHADER_FRAGMENT:
+ cso_set_fragment_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_FS_STATE;
+ break;
+ case MESA_SHADER_COMPUTE:
+ cso_set_compute_shader_handle(st->cso_context, NULL);
+ st->dirty |= ST_NEW_CS_STATE;
+ break;
+ default:
+ unreachable("invalid shader type");
+ }
+}
/**
* Free all basic program variants.
{
struct st_variant *v;
+ /* If we are releasing shaders, re-bind them, because we don't
+ * know which shaders are bound in the driver.
+ */
+ if (p->variants)
+ st_unbind_program(st, p);
+
for (v = p->variants; v; ) {
struct st_variant *next = v->next;
delete_variant(st, v, p->Base.Target);
struct st_program *p = st_program(target);
struct st_variant *v, **prevPtr = &p->variants;
+ bool unbound = false;
for (v = p->variants; v; ) {
struct st_variant *next = v->next;
if (v->st == st) {
+ if (!unbound) {
+ st_unbind_program(st, p);
+ unbound = true;
+ }
+
/* unlink from list */
*prevPtr = next;
/* destroy this variant */