}
}
+ llvmpipe_cleanup_stage_sampling(lp, PIPE_SHADER_VERTEX);
+ llvmpipe_cleanup_stage_sampling(lp, PIPE_SHADER_GEOMETRY);
+ llvmpipe_cleanup_stage_sampling(lp, PIPE_SHADER_TESS_CTRL);
+ llvmpipe_cleanup_stage_sampling(lp, PIPE_SHADER_TESS_EVAL);
+
+ llvmpipe_cleanup_stage_images(lp, PIPE_SHADER_VERTEX);
+ llvmpipe_cleanup_stage_images(lp, PIPE_SHADER_GEOMETRY);
+ llvmpipe_cleanup_stage_images(lp, PIPE_SHADER_TESS_CTRL);
+ llvmpipe_cleanup_stage_images(lp, PIPE_SHADER_TESS_EVAL);
+
/*
* TODO: Flush only when a user vertex/index buffer is present
* (or even better, modify draw module to do this
}
else {
/* display target texture/surface */
- /*
- * XXX: Where should this be unmapped?
- */
- struct llvmpipe_screen *screen = llvmpipe_screen(tex->screen);
- struct sw_winsys *winsys = screen->winsys;
- addr = winsys->displaytarget_map(winsys, lp_tex->dt,
- PIPE_MAP_READ);
+ addr = llvmpipe_resource_map(tex, 0, 0, LP_TEX_USAGE_READ);
row_stride[0] = lp_tex->row_stride[0];
img_stride[0] = lp_tex->img_stride[0];
mip_offsets[0] = 0;
prepare_shader_sampling(lp, num, views, PIPE_SHADER_TESS_EVAL);
}
+void
+llvmpipe_cleanup_stage_sampling(struct llvmpipe_context *ctx,
+ enum pipe_shader_type stage)
+{
+ unsigned num, i;
+ struct pipe_sampler_view **views;
+ assert(ctx);
+ assert(stage < ARRAY_SIZE(ctx->num_sampler_views));
+ assert(stage < ARRAY_SIZE(ctx->sampler_views));
+
+ num = ctx->num_sampler_views[stage];
+ views = ctx->sampler_views[stage];
+
+ assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
+
+ for (i = 0; i < num; i++) {
+ struct pipe_sampler_view *view = views[i];
+ assert(view);
+ struct pipe_resource *tex = view->texture;
+ if (tex)
+ llvmpipe_resource_unmap(tex, 0, 0);
+ }
+}
+
static void
prepare_shader_images(
struct llvmpipe_context *lp,
}
else {
/* display target texture/surface */
- /*
- * XXX: Where should this be unmapped?
- */
- struct llvmpipe_screen *screen = llvmpipe_screen(img->screen);
- struct sw_winsys *winsys = screen->winsys;
- addr = winsys->displaytarget_map(winsys, lp_img->dt,
- PIPE_MAP_READ);
+ addr = llvmpipe_resource_map(img, 0, 0, LP_TEX_USAGE_READ);
row_stride = lp_img->row_stride[0];
img_stride = lp_img->img_stride[0];
sample_stride = 0;
}
void
+llvmpipe_cleanup_stage_images(struct llvmpipe_context *ctx,
+ enum pipe_shader_type stage)
+{
+ unsigned num, i;
+ struct pipe_image_view *views;
+ assert(ctx);
+ assert(stage < ARRAY_SIZE(ctx->num_images));
+ assert(stage < ARRAY_SIZE(ctx->images));
+
+ num = ctx->num_images[stage];
+ views = ctx->images[stage];
+
+ assert(num <= LP_MAX_TGSI_SHADER_IMAGES);
+
+ for (i = 0; i < num; i++) {
+ struct pipe_image_view *view = &views[i];
+ assert(view);
+ struct pipe_resource *img = view->resource;
+ if (img)
+ llvmpipe_resource_unmap(img, 0, 0);
+ }
+}
+
+void
llvmpipe_init_sampler_funcs(struct llvmpipe_context *llvmpipe)
{
llvmpipe->pipe.create_sampler_state = llvmpipe_create_sampler_state;