summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/winsys/intel/drm/intel_drm_winsys.c498
1 files changed, 249 insertions, 249 deletions
diff --git a/src/gallium/winsys/intel/drm/intel_drm_winsys.c b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
index d44113873cb..f4e8bd4e080 100644
--- a/src/gallium/winsys/intel/drm/intel_drm_winsys.c
+++ b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
@@ -61,177 +61,144 @@ struct intel_bo {
drm_intel_bo *bo;
};
-int
-intel_winsys_export_handle(struct intel_winsys *winsys,
- struct intel_bo *bo,
- enum intel_tiling_mode tiling,
- unsigned long pitch,
- struct winsys_handle *handle)
+static bool
+get_param(struct intel_winsys *winsys, int param, int *value)
{
- int err = 0;
+ struct drm_i915_getparam gp;
+ int err;
- switch (handle->type) {
- case DRM_API_HANDLE_TYPE_SHARED:
- {
- uint32_t name;
+ *value = 0;
- err = drm_intel_bo_flink(bo->bo, &name);
- if (!err)
- handle->handle = name;
- }
- break;
- case DRM_API_HANDLE_TYPE_KMS:
- handle->handle = bo->bo->handle;
- break;
-#if 0
- case DRM_API_HANDLE_TYPE_PRIME:
- {
- int fd;
+ memset(&gp, 0, sizeof(gp));
+ gp.param = param;
+ gp.value = value;
- err = drm_intel_bo_gem_export_to_prime(bo->bo, &fd);
- if (!err)
- handle->handle = fd;
- }
-#endif
- break;
- default:
- err = -EINVAL;
- break;
+ err = drmCommandWriteRead(winsys->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
+ if (err) {
+ *value = 0;
+ return false;
}
- if (err)
- return err;
-
- handle->stride = pitch;
-
- return 0;
+ return true;
}
-int
-intel_bo_exec(struct intel_bo *bo, int used,
- struct intel_context *ctx, unsigned long flags)
+static bool
+test_address_swizzling(struct intel_winsys *winsys)
{
- if (ctx) {
- return drm_intel_gem_bo_context_exec(bo->bo,
- (drm_intel_context *) ctx, used, flags);
+ drm_intel_bo *bo;
+ uint32_t tiling = I915_TILING_X, swizzle;
+ unsigned long pitch;
+
+ bo = drm_intel_bo_alloc_tiled(winsys->bufmgr,
+ "address swizzling test", 64, 64, 4, &tiling, &pitch, 0);
+ if (bo) {
+ drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
+ drm_intel_bo_unreference(bo);
}
else {
- return drm_intel_bo_mrb_exec(bo->bo, used, NULL, 0, 0, flags);
+ swizzle = I915_BIT_6_SWIZZLE_NONE;
}
+
+ return (swizzle != I915_BIT_6_SWIZZLE_NONE);
}
-int
-intel_bo_wait(struct intel_bo *bo, int64_t timeout)
+static bool
+init_info(struct intel_winsys *winsys)
{
- int err;
+ struct intel_winsys_info *info = &winsys->info;
+ int val;
- err = drm_intel_gem_bo_wait(bo->bo, timeout);
- /* consider the bo idle on errors */
- if (err && err != -ETIME)
- err = 0;
+ /* follow the classic driver here */
+ get_param(winsys, I915_PARAM_HAS_RELAXED_DELTA, &val);
+ if (!val) {
+ debug_error("kernel 2.6.39 required");
+ return false;
+ }
- return err;
-}
+ info->devid = drm_intel_bufmgr_gem_get_devid(winsys->bufmgr);
-int
-intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset,
- struct intel_bo *target_bo, uint32_t target_offset,
- uint32_t read_domains, uint32_t write_domain)
-{
- return drm_intel_bo_emit_reloc(bo->bo, offset,
- target_bo->bo, target_offset, read_domains, write_domain);
-}
+ get_param(winsys, I915_PARAM_HAS_LLC, &val);
+ info->has_llc = val;
-int
-intel_bo_get_reloc_count(struct intel_bo *bo)
-{
- return drm_intel_gem_bo_get_reloc_count(bo->bo);
-}
+ get_param(winsys, I915_PARAM_HAS_GEN7_SOL_RESET, &val);
+ info->has_gen7_sol_reset = val;
-void
-intel_bo_clear_relocs(struct intel_bo *bo, int start)
-{
- return drm_intel_gem_bo_clear_relocs(bo->bo, start);
-}
+ info->has_address_swizzling = test_address_swizzling(winsys);
-bool
-intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo)
-{
- return drm_intel_bo_references(bo->bo, target_bo->bo);
+ return true;
}
-int
-intel_bo_map(struct intel_bo *bo, bool write_enable)
+struct intel_winsys *
+intel_winsys_create_for_fd(int fd)
{
- return drm_intel_bo_map(bo->bo, write_enable);
-}
+ struct intel_winsys *winsys;
-int
-intel_bo_map_gtt(struct intel_bo *bo)
-{
- return drm_intel_gem_bo_map_gtt(bo->bo);
-}
+ winsys = CALLOC_STRUCT(intel_winsys);
+ if (!winsys)
+ return NULL;
-int
-intel_bo_map_unsynchronized(struct intel_bo *bo)
-{
- return drm_intel_gem_bo_map_unsynchronized(bo->bo);
-}
+ winsys->fd = fd;
-void
-intel_bo_unmap(struct intel_bo *bo)
-{
- int err;
+ winsys->bufmgr = drm_intel_bufmgr_gem_init(winsys->fd, BATCH_SZ);
+ if (!winsys->bufmgr) {
+ debug_error("failed to create GEM buffer manager");
+ FREE(winsys);
+ return NULL;
+ }
- err = drm_intel_bo_unmap(bo->bo);
- assert(!err);
-}
+ if (!init_info(winsys)) {
+ drm_intel_bufmgr_destroy(winsys->bufmgr);
+ FREE(winsys);
+ return NULL;
+ }
-int
-intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
- unsigned long size, const void *data)
-{
- return drm_intel_bo_subdata(bo->bo, offset, size, data);
+ drm_intel_bufmgr_gem_enable_fenced_relocs(winsys->bufmgr);
+
+ return winsys;
}
-int
-intel_bo_pread(struct intel_bo *bo, unsigned long offset,
- unsigned long size, void *data)
+void
+intel_winsys_destroy(struct intel_winsys *winsys)
{
- return drm_intel_bo_get_subdata(bo->bo, offset, size, data);
+ if (winsys->decode)
+ drm_intel_decode_context_free(winsys->decode);
+
+ drm_intel_bufmgr_destroy(winsys->bufmgr);
+ FREE(winsys->drm_bo_array);
+ FREE(winsys);
}
-unsigned long
-intel_bo_get_size(const struct intel_bo *bo)
+const struct intel_winsys_info *
+intel_winsys_get_info(const struct intel_winsys *winsys)
{
- return bo->bo->size;
+ return &winsys->info;
}
-unsigned long
-intel_bo_get_offset(const struct intel_bo *bo)
+void
+intel_winsys_enable_reuse(struct intel_winsys *winsys)
{
- return bo->bo->offset;
+ drm_intel_bufmgr_gem_enable_reuse(winsys->bufmgr);
}
-void *
-intel_bo_get_virtual(const struct intel_bo *bo)
+struct intel_context *
+intel_winsys_create_context(struct intel_winsys *winsys)
{
- return bo->bo->virtual;
+ return (struct intel_context *)
+ drm_intel_gem_context_create(winsys->bufmgr);
}
void
-intel_bo_reference(struct intel_bo *bo)
+intel_winsys_destroy_context(struct intel_winsys *winsys,
+ struct intel_context *ctx)
{
- pipe_reference(NULL, &bo->reference);
+ drm_intel_gem_context_destroy((drm_intel_context *) ctx);
}
-void
-intel_bo_unreference(struct intel_bo *bo)
+int
+intel_winsys_read_reg(struct intel_winsys *winsys,
+ uint32_t reg, uint64_t *val)
{
- if (pipe_reference(&bo->reference, NULL)) {
- drm_intel_bo_unreference(bo->bo);
- FREE(bo);
- }
+ return drm_intel_reg_read(winsys->bufmgr, reg, val);
}
static struct intel_bo *
@@ -249,30 +216,28 @@ create_bo(void)
}
struct intel_bo *
-intel_winsys_alloc_texture(struct intel_winsys *winsys,
- const char *name,
- int width, int height, int cpp,
- enum intel_tiling_mode tiling,
- unsigned long flags,
- unsigned long *pitch)
+intel_winsys_alloc_buffer(struct intel_winsys *winsys,
+ const char *name,
+ unsigned long size,
+ unsigned long flags)
{
+ const int alignment = 4096; /* always page-aligned */
struct intel_bo *bo;
- uint32_t real_tiling = tiling;
bo = create_bo();
if (!bo)
return NULL;
- bo->bo = drm_intel_bo_alloc_tiled(winsys->bufmgr, name,
- width, height, cpp, &real_tiling, pitch, flags);
- if (!bo->bo) {
- FREE(bo);
- return NULL;
+ if (flags == INTEL_ALLOC_FOR_RENDER) {
+ bo->bo = drm_intel_bo_alloc_for_render(winsys->bufmgr,
+ name, size, alignment);
+ }
+ else {
+ assert(!flags);
+ bo->bo = drm_intel_bo_alloc(winsys->bufmgr, name, size, alignment);
}
- if (tiling != real_tiling) {
- assert(!"tiling mis-match");
- drm_intel_bo_unreference(bo->bo);
+ if (!bo->bo) {
FREE(bo);
return NULL;
}
@@ -281,28 +246,30 @@ intel_winsys_alloc_texture(struct intel_winsys *winsys,
}
struct intel_bo *
-intel_winsys_alloc_buffer(struct intel_winsys *winsys,
- const char *name,
- unsigned long size,
- unsigned long flags)
+intel_winsys_alloc_texture(struct intel_winsys *winsys,
+ const char *name,
+ int width, int height, int cpp,
+ enum intel_tiling_mode tiling,
+ unsigned long flags,
+ unsigned long *pitch)
{
- const int alignment = 4096; /* always page-aligned */
+ uint32_t real_tiling = tiling;
struct intel_bo *bo;
bo = create_bo();
if (!bo)
return NULL;
- if (flags == INTEL_ALLOC_FOR_RENDER) {
- bo->bo = drm_intel_bo_alloc_for_render(winsys->bufmgr,
- name, size, alignment);
- }
- else {
- assert(!flags);
- bo->bo = drm_intel_bo_alloc(winsys->bufmgr, name, size, alignment);
+ bo->bo = drm_intel_bo_alloc_tiled(winsys->bufmgr, name,
+ width, height, cpp, &real_tiling, pitch, flags);
+ if (!bo->bo) {
+ FREE(bo);
+ return NULL;
}
- if (!bo->bo) {
+ if (real_tiling != tiling) {
+ assert(!"tiling mismatch");
+ drm_intel_bo_unreference(bo->bo);
FREE(bo);
return NULL;
}
@@ -366,6 +333,52 @@ intel_winsys_import_handle(struct intel_winsys *winsys,
}
int
+intel_winsys_export_handle(struct intel_winsys *winsys,
+ struct intel_bo *bo,
+ enum intel_tiling_mode tiling,
+ unsigned long pitch,
+ struct winsys_handle *handle)
+{
+ int err = 0;
+
+ switch (handle->type) {
+ case DRM_API_HANDLE_TYPE_SHARED:
+ {
+ uint32_t name;
+
+ err = drm_intel_bo_flink(bo->bo, &name);
+ if (!err)
+ handle->handle = name;
+ }
+ break;
+ case DRM_API_HANDLE_TYPE_KMS:
+ handle->handle = bo->bo->handle;
+ break;
+#if 0
+ case DRM_API_HANDLE_TYPE_PRIME:
+ {
+ int fd;
+
+ err = drm_intel_bo_gem_export_to_prime(bo->bo, &fd);
+ if (!err)
+ handle->handle = fd;
+ }
+ break;
+#endif
+ default:
+ err = -EINVAL;
+ break;
+ }
+
+ if (err)
+ return err;
+
+ handle->stride = pitch;
+
+ return 0;
+}
+
+int
intel_winsys_check_aperture_space(struct intel_winsys *winsys,
struct intel_bo **bo_array,
int count)
@@ -432,142 +445,129 @@ intel_winsys_decode_commands(struct intel_winsys *winsys,
drm_intel_bo_unmap(bo->bo);
}
-int
-intel_winsys_read_reg(struct intel_winsys *winsys,
- uint32_t reg, uint64_t *val)
+void
+intel_bo_reference(struct intel_bo *bo)
{
- return drm_intel_reg_read(winsys->bufmgr, reg, val);
+ pipe_reference(NULL, &bo->reference);
}
void
-intel_winsys_enable_reuse(struct intel_winsys *winsys)
+intel_bo_unreference(struct intel_bo *bo)
{
- drm_intel_bufmgr_gem_enable_reuse(winsys->bufmgr);
+ if (pipe_reference(&bo->reference, NULL)) {
+ drm_intel_bo_unreference(bo->bo);
+ FREE(bo);
+ }
}
-void
-intel_winsys_destroy_context(struct intel_winsys *winsys,
- struct intel_context *ctx)
+unsigned long
+intel_bo_get_size(const struct intel_bo *bo)
{
- drm_intel_gem_context_destroy((drm_intel_context *) ctx);
+ return bo->bo->size;
}
-struct intel_context *
-intel_winsys_create_context(struct intel_winsys *winsys)
+unsigned long
+intel_bo_get_offset(const struct intel_bo *bo)
{
- return (struct intel_context *)
- drm_intel_gem_context_create(winsys->bufmgr);
+ return bo->bo->offset;
}
-const struct intel_winsys_info *
-intel_winsys_get_info(const struct intel_winsys *winsys)
+void *
+intel_bo_get_virtual(const struct intel_bo *bo)
{
- return &winsys->info;
+ return bo->bo->virtual;
}
-void
-intel_winsys_destroy(struct intel_winsys *winsys)
+int
+intel_bo_map(struct intel_bo *bo, bool write_enable)
{
- if (winsys->decode)
- drm_intel_decode_context_free(winsys->decode);
-
- drm_intel_bufmgr_destroy(winsys->bufmgr);
- FREE(winsys->drm_bo_array);
- FREE(winsys);
+ return drm_intel_bo_map(bo->bo, write_enable);
}
-static bool
-get_param(struct intel_winsys *winsys, int param, int *value)
+int
+intel_bo_map_gtt(struct intel_bo *bo)
{
- struct drm_i915_getparam gp;
- int err;
-
- *value = 0;
-
- memset(&gp, 0, sizeof(gp));
- gp.param = param;
- gp.value = value;
-
- err = drmCommandWriteRead(winsys->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
- if (err) {
- *value = 0;
- return false;
- }
-
- return true;
+ return drm_intel_gem_bo_map_gtt(bo->bo);
}
-static bool
-test_address_swizzling(struct intel_winsys *winsys)
+int
+intel_bo_map_unsynchronized(struct intel_bo *bo)
{
- drm_intel_bo *bo;
- uint32_t tiling = I915_TILING_X, swizzle;
- unsigned long pitch;
-
- bo = drm_intel_bo_alloc_tiled(winsys->bufmgr,
- "address swizzling test", 64, 64, 4, &tiling, &pitch, 0);
- if (bo) {
- drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
- drm_intel_bo_unreference(bo);
- }
- else {
- swizzle = I915_BIT_6_SWIZZLE_NONE;
- }
-
- return (swizzle != I915_BIT_6_SWIZZLE_NONE);
+ return drm_intel_gem_bo_map_unsynchronized(bo->bo);
}
-static bool
-init_info(struct intel_winsys *winsys)
+void
+intel_bo_unmap(struct intel_bo *bo)
{
- struct intel_winsys_info *info = &winsys->info;
- int val;
-
- /* follow the classic driver here */
- get_param(winsys, I915_PARAM_HAS_RELAXED_DELTA, &val);
- if (!val) {
- debug_error("kernel 2.6.39 required");
- return false;
- }
-
- info->devid = drm_intel_bufmgr_gem_get_devid(winsys->bufmgr);
+ int err;
- get_param(winsys, I915_PARAM_HAS_LLC, &val);
- info->has_llc = val;
+ err = drm_intel_bo_unmap(bo->bo);
+ assert(!err);
+}
- get_param(winsys, I915_PARAM_HAS_GEN7_SOL_RESET, &val);
- info->has_gen7_sol_reset = val;
+int
+intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
+ unsigned long size, const void *data)
+{
+ return drm_intel_bo_subdata(bo->bo, offset, size, data);
+}
- info->has_address_swizzling = test_address_swizzling(winsys);
+int
+intel_bo_pread(struct intel_bo *bo, unsigned long offset,
+ unsigned long size, void *data)
+{
+ return drm_intel_bo_get_subdata(bo->bo, offset, size, data);
+}
- return true;
+int
+intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset,
+ struct intel_bo *target_bo, uint32_t target_offset,
+ uint32_t read_domains, uint32_t write_domain)
+{
+ return drm_intel_bo_emit_reloc(bo->bo, offset,
+ target_bo->bo, target_offset, read_domains, write_domain);
}
-struct intel_winsys *
-intel_winsys_create_for_fd(int fd)
+int
+intel_bo_get_reloc_count(struct intel_bo *bo)
{
- struct intel_winsys *winsys;
+ return drm_intel_gem_bo_get_reloc_count(bo->bo);
+}
- winsys = CALLOC_STRUCT(intel_winsys);
- if (!winsys)
- return NULL;
+void
+intel_bo_clear_relocs(struct intel_bo *bo, int start)
+{
+ return drm_intel_gem_bo_clear_relocs(bo->bo, start);
+}
- winsys->fd = fd;
+bool
+intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo)
+{
+ return drm_intel_bo_references(bo->bo, target_bo->bo);
+}
- winsys->bufmgr = drm_intel_bufmgr_gem_init(winsys->fd, BATCH_SZ);
- if (!winsys->bufmgr) {
- debug_error("failed to create GEM buffer manager");
- FREE(winsys);
- return NULL;
+int
+intel_bo_exec(struct intel_bo *bo, int used,
+ struct intel_context *ctx, unsigned long flags)
+{
+ if (ctx) {
+ return drm_intel_gem_bo_context_exec(bo->bo,
+ (drm_intel_context *) ctx, used, flags);
}
-
- if (!init_info(winsys)) {
- drm_intel_bufmgr_destroy(winsys->bufmgr);
- FREE(winsys);
- return NULL;
+ else {
+ return drm_intel_bo_mrb_exec(bo->bo, used, NULL, 0, 0, flags);
}
+}
- drm_intel_bufmgr_gem_enable_fenced_relocs(winsys->bufmgr);
+int
+intel_bo_wait(struct intel_bo *bo, int64_t timeout)
+{
+ int err;
- return winsys;
+ err = drm_intel_gem_bo_wait(bo->bo, timeout);
+ /* consider the bo idle on errors */
+ if (err && err != -ETIME)
+ err = 0;
+
+ return err;
}