When the map flags do not feature BO_TRANSFER_WRITE, we should
not copy back any shadow buffers we maintain.
BUG=b:
67434931
TEST=android.view.cts.SurfaceViewSyncTests on Mediatek/Rockchip
Change-Id: I7078bfc5a8d770a52949d43ea68efc4a870e9227
Reviewed-on: https://chromium-review.googlesource.com/703875
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
if (!drmHashLookup(bo->drv->map_table, bo->handles[plane].u32, &ptr)) {
data = (struct map_info *)ptr;
+ /* TODO(gsingh): support mapping same buffer with different flags. */
+ assert(data->map_flags == map_flags);
data->refcount++;
goto success;
}
data->refcount = 1;
data->addr = addr;
data->handle = bo->handles[plane].u32;
+ data->map_flags = map_flags;
drmHashInsert(bo->drv->map_table, bo->handles[plane].u32, (void *)data);
success:
void *addr;
size_t length;
uint32_t handle;
+ uint32_t map_flags;
int32_t refcount;
void *priv;
};
static int mediatek_bo_flush(struct bo *bo, struct map_info *data)
{
struct mediatek_private_map_data *priv = data->priv;
- if (priv)
+ if (priv && (data->map_flags & BO_MAP_WRITE))
memcpy(priv->gem_addr, priv->cached_addr, bo->total_size);
return 0;
static int rockchip_bo_flush(struct bo *bo, struct map_info *data)
{
struct rockchip_private_map_data *priv = data->priv;
- if (priv)
+ if (priv && (data->map_flags & BO_MAP_WRITE))
memcpy(priv->gem_addr, priv->cached_addr, bo->total_size);
return 0;
struct tegra_private_map_data {
void *tiled;
void *untiled;
- uint32_t map_flags;
};
static const uint32_t render_target_formats[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888 };
priv = calloc(1, sizeof(*priv));
priv->untiled = calloc(1, bo->total_size);
priv->tiled = addr;
- priv->map_flags = map_flags;
data->priv = priv;
transfer_tiled_memory(bo, priv->tiled, priv->untiled, TEGRA_READ_TILED_BUFFER);
addr = priv->untiled;
{
struct tegra_private_map_data *priv = data->priv;
- if (priv && (priv->map_flags & BO_MAP_WRITE))
+ if (priv && (data->map_flags & BO_MAP_WRITE))
transfer_tiled_memory(bo, priv->tiled, priv->untiled, TEGRA_WRITE_TILED_BUFFER);
return 0;