virgl/gbm: modify conversion to/from gbm formats

Just a refactoring.

v2: modify struct order, don't cast pointer (@davidriley)

Reviewed-by: David Riley <davidriley@chromium.org>
macos/master
Gurchetan Singh 6 years ago
parent 3f5ec0c82c
commit 246265c771
  1. 4
      src/virgl_egl_context.c
  2. 55
      src/virgl_gbm.c
  3. 2
      src/virgl_gbm.h
  4. 10
      src/vrend_renderer.c

@ -276,6 +276,7 @@ virgl_renderer_gl_context virgl_egl_get_current_context(UNUSED struct virgl_egl
int virgl_egl_get_fourcc_for_texture(struct virgl_egl *egl, uint32_t tex_id, uint32_t format, int *fourcc) int virgl_egl_get_fourcc_for_texture(struct virgl_egl *egl, uint32_t tex_id, uint32_t format, int *fourcc)
{ {
int ret = EINVAL; int ret = EINVAL;
uint32_t gbm_format = 0;
EGLImageKHR image; EGLImageKHR image;
EGLBoolean success; EGLBoolean success;
@ -300,7 +301,8 @@ int virgl_egl_get_fourcc_for_texture(struct virgl_egl *egl, uint32_t tex_id, uin
return ret; return ret;
fallback: fallback:
*fourcc = virgl_gbm_convert_format(format); ret = virgl_gbm_convert_format(&format, &gbm_format);
*fourcc = (int)gbm_format;
return ret; return ret;
} }

@ -49,6 +49,11 @@ struct planar_layout {
int bytes_per_pixel[4]; int bytes_per_pixel[4];
}; };
struct format_conversion {
uint32_t gbm_format;
uint32_t virgl_format;
};
static const struct planar_layout packed_1bpp_layout = { static const struct planar_layout packed_1bpp_layout = {
.num_planes = 1, .num_planes = 1,
.horizontal_subsampling = { 1 }, .horizontal_subsampling = { 1 },
@ -84,6 +89,17 @@ static const struct planar_layout triplanar_yuv_420_layout = {
.bytes_per_pixel = { 1, 1, 1 } .bytes_per_pixel = { 1, 1, 1 }
}; };
static const struct format_conversion conversions[] = {
{ GBM_FORMAT_RGB565, VIRGL_FORMAT_B5G6R5_UNORM },
{ GBM_FORMAT_ARGB8888, VIRGL_FORMAT_B8G8R8A8_UNORM },
{ GBM_FORMAT_XRGB8888, VIRGL_FORMAT_B8G8R8X8_UNORM },
{ GBM_FORMAT_NV12, VIRGL_FORMAT_NV12 },
{ GBM_FORMAT_ABGR8888, VIRGL_FORMAT_R8G8B8A8_UNORM},
{ GBM_FORMAT_XBGR8888, VIRGL_FORMAT_R8G8B8X8_UNORM},
{ GBM_FORMAT_R8, VIRGL_FORMAT_R8_UNORM},
{ GBM_FORMAT_YVU420, VIRGL_FORMAT_YV12}
};
static int rendernode_open(void) static int rendernode_open(void)
{ {
DIR *dir; DIR *dir;
@ -267,28 +283,25 @@ void virgl_gbm_fini(struct virgl_gbm *gbm)
free(gbm); free(gbm);
} }
uint32_t virgl_gbm_convert_format(uint32_t virgl_format) int virgl_gbm_convert_format(uint32_t *virgl_format, uint32_t *gbm_format)
{ {
switch (virgl_format) {
case VIRGL_FORMAT_B5G6R5_UNORM: if (!virgl_format || !gbm_format)
return GBM_FORMAT_RGB565; return -1;
case VIRGL_FORMAT_B8G8R8A8_UNORM:
return GBM_FORMAT_ARGB8888; if (*virgl_format != 0 && *gbm_format != 0)
case VIRGL_FORMAT_B8G8R8X8_UNORM: return -1;
return GBM_FORMAT_XRGB8888;
case VIRGL_FORMAT_NV12: for (uint32_t i = 0; i < ARRAY_SIZE(conversions); i++) {
return GBM_FORMAT_NV12; if (conversions[i].gbm_format == *gbm_format ||
case VIRGL_FORMAT_R8G8B8A8_UNORM: conversions[i].virgl_format == *virgl_format) {
return GBM_FORMAT_ABGR8888; *gbm_format = conversions[i].gbm_format;
case VIRGL_FORMAT_R8G8B8X8_UNORM: *virgl_format = conversions[i].virgl_format;
return GBM_FORMAT_XBGR8888; return 0;
case VIRGL_FORMAT_R8_UNORM: }
return GBM_FORMAT_R8; }
case VIRGL_FORMAT_YV12:
return GBM_FORMAT_YVU420; return -1;
default:
return 0;
}
} }
int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iovecs, int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iovecs,

@ -43,7 +43,7 @@ struct virgl_gbm *virgl_gbm_init(int fd);
void virgl_gbm_fini(struct virgl_gbm *gbm); void virgl_gbm_fini(struct virgl_gbm *gbm);
uint32_t virgl_gbm_convert_format(uint32_t virgl_format); int virgl_gbm_convert_format(uint32_t *virgl_format, uint32_t *gbm_format);
int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iovecs, int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iovecs,
uint32_t num_iovecs, const struct vrend_transfer_info *info); uint32_t num_iovecs, const struct vrend_transfer_info *info);

@ -691,7 +691,10 @@ static inline bool vrend_format_is_ds(enum virgl_formats format)
static inline bool vrend_format_can_scanout(enum virgl_formats format) static inline bool vrend_format_can_scanout(enum virgl_formats format)
{ {
#ifdef ENABLE_GBM_ALLOCATION #ifdef ENABLE_GBM_ALLOCATION
uint32_t gbm_format = virgl_gbm_convert_format(format); uint32_t gbm_format = 0;
if (virgl_gbm_convert_format(&format, &gbm_format))
return false;
if (!gbm || !gbm->device || !gbm_format) if (!gbm || !gbm->device || !gbm_format)
return false; return false;
@ -6155,7 +6158,10 @@ static void *vrend_allocate_using_gbm(struct vrend_resource *gr)
{ {
#ifdef ENABLE_GBM_ALLOCATION #ifdef ENABLE_GBM_ALLOCATION
uint32_t gbm_flags = virgl_gbm_convert_flags(gr->base.bind); uint32_t gbm_flags = virgl_gbm_convert_flags(gr->base.bind);
uint32_t gbm_format = virgl_gbm_convert_format(gr->base.format); uint32_t gbm_format = 0;
if (virgl_gbm_convert_format(&gr->base.format, &gbm_format))
return false;
if (gr->base.depth0 != 1 || gr->base.last_level != 0 || gr->base.nr_samples != 0) if (gr->base.depth0 != 1 || gr->base.last_level != 0 || gr->base.nr_samples != 0)
return NULL; return NULL;

Loading…
Cancel
Save