summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2015-10-09 10:46:24 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2016-05-09 16:52:22 +0800
commit9e924b4d1a1862efb6ab20dd92dbb233f3acf19c (patch)
tree7c8890d2210332be1c7c3ea2d251affcaaed4a3f
parent4cbbb15b9e9e69ab936d0c9c3a97072d8535b5c6 (diff)
Add 'struct i965_gpe_resource' and related utility functions
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com> Reviewed-By: Sean V Kelley <sean.v.kelley@intel.com>
-rw-r--r--src/i965_gpe_utils.c116
-rw-r--r--src/i965_gpe_utils.h44
2 files changed, 160 insertions, 0 deletions
diff --git a/src/i965_gpe_utils.c b/src/i965_gpe_utils.c
index b9bf99b..fe000c1 100644
--- a/src/i965_gpe_utils.c
+++ b/src/i965_gpe_utils.c
@@ -1308,3 +1308,119 @@ gen9_gpe_pipeline_end(VADriverContextP ctx,
GEN9_FORCE_MEDIA_AWAKE_MASK);
ADVANCE_BATCH(batch);
}
+
+Bool
+i965_allocate_gpe_resource(dri_bufmgr *bufmgr,
+ struct i965_gpe_resource *res,
+ const char *name)
+{
+ res->bo = dri_bo_alloc(bufmgr, name, res->size, 4096);
+ res->map = NULL;
+
+ return (res->bo != NULL);
+}
+
+void
+i965_object_surface_to_2d_gpe_resource(struct i965_gpe_resource *res,
+ struct object_surface *obj_surface)
+{
+ unsigned int swizzle;
+
+ res->type = I965_GPE_RESOURCE_2D;
+ res->width = obj_surface->orig_width;
+ res->height = obj_surface->orig_height;
+ res->pitch = obj_surface->width;
+ res->size = obj_surface->size;
+ res->cb_cr_pitch = obj_surface->cb_cr_pitch;
+ res->x_cb_offset = obj_surface->x_cb_offset;
+ res->y_cb_offset = obj_surface->y_cb_offset;
+ res->bo = obj_surface->bo;
+ res->map = NULL;
+
+ dri_bo_reference(res->bo);
+ dri_bo_get_tiling(obj_surface->bo, &res->tiling, &swizzle);
+}
+
+void
+i965_dri_object_to_buffer_gpe_resource(struct i965_gpe_resource *res,
+ dri_bo *bo)
+{
+ unsigned int swizzle;
+
+ res->type = I965_GPE_RESOURCE_BUFFER;
+ res->width = bo->size;
+ res->height = 1;
+ res->pitch = res->width;
+ res->size = res->pitch * res->width;
+ res->bo = bo;
+ res->map = NULL;
+
+ dri_bo_reference(res->bo);
+ dri_bo_get_tiling(res->bo, &res->tiling, &swizzle);
+}
+
+void
+i965_gpe_dri_object_to_2d_gpe_resource(struct i965_gpe_resource *res,
+ dri_bo *bo,
+ unsigned int width,
+ unsigned int height,
+ unsigned int pitch)
+{
+ unsigned int swizzle;
+
+ res->type = I965_GPE_RESOURCE_2D;
+ res->width = width;
+ res->height = height;
+ res->pitch = pitch;
+ res->size = res->pitch * res->width;
+ res->bo = bo;
+ res->map = NULL;
+
+ dri_bo_reference(res->bo);
+ dri_bo_get_tiling(res->bo, &res->tiling, &swizzle);
+}
+
+void
+i965_zero_gpe_resource(struct i965_gpe_resource *res)
+{
+ if (res->bo) {
+ dri_bo_map(res->bo, 1);
+ memset(res->bo->virtual, 0, res->size);
+ dri_bo_unmap(res->bo);
+ }
+}
+
+void
+i965_free_gpe_resource(struct i965_gpe_resource *res)
+{
+ dri_bo_unreference(res->bo);
+ res->bo = NULL;
+ res->map = NULL;
+}
+
+void *
+i965_map_gpe_resource(struct i965_gpe_resource *res)
+{
+ int ret;
+
+ if (res->bo) {
+ ret = dri_bo_map(res->bo, 1);
+
+ if (ret == 0)
+ res->map = res->bo->virtual;
+ else
+ res->map = NULL;
+ } else
+ res->map = NULL;
+
+ return res->map;
+}
+
+void
+i965_unmap_gpe_resource(struct i965_gpe_resource *res)
+{
+ if (res->bo && res->map)
+ dri_bo_unmap(res->bo);
+
+ res->map = NULL;
+}
diff --git a/src/i965_gpe_utils.h b/src/i965_gpe_utils.h
index 7e39d46..e3dd82b 100644
--- a/src/i965_gpe_utils.h
+++ b/src/i965_gpe_utils.h
@@ -44,6 +44,26 @@ struct i965_buffer_surface
unsigned int pitch;
};
+enum {
+ I965_GPE_RESOURCE_BUFFER = 0,
+ I965_GPE_RESOURCE_2D
+};
+
+struct i965_gpe_resource
+{
+ dri_bo *bo;
+ char *map;
+ uint32_t type;
+ uint32_t width;
+ uint32_t height;
+ uint32_t pitch;
+ uint32_t size;
+ uint32_t tiling;
+ uint32_t cb_cr_pitch;
+ uint32_t x_cb_offset;
+ uint32_t y_cb_offset;
+};
+
struct i965_gpe_context
{
struct {
@@ -228,4 +248,28 @@ void gen9_gpe_pipeline_end(VADriverContextP ctx,
struct i965_gpe_context *gpe_context,
struct intel_batchbuffer *batch);
+Bool i965_allocate_gpe_resource(dri_bufmgr *bufmgr,
+ struct i965_gpe_resource *res,
+ const char *name);
+
+void i965_object_surface_to_2d_gpe_resource(struct i965_gpe_resource *res,
+ struct object_surface *obj_surface);
+
+void i965_dri_object_to_buffer_gpe_resource(struct i965_gpe_resource *res,
+ dri_bo *bo);
+
+void i965_gpe_dri_object_to_2d_gpe_resource(struct i965_gpe_resource *res,
+ dri_bo *bo,
+ unsigned int width,
+ unsigned int height,
+ unsigned int pitch);
+
+void i965_zero_gpe_resource(struct i965_gpe_resource *res);
+
+void i965_free_gpe_resource(struct i965_gpe_resource *res);
+
+void *i965_map_gpe_resource(struct i965_gpe_resource *res);
+
+void i965_unmap_gpe_resource(struct i965_gpe_resource *res);
+
#endif /* _I965_GPE_UTILS_H_ */