TEST_F(AdfTest, simple_buffer) { uint32_t w = 0, h = 0; ASSERT_NO_FATAL_FAILURE(getCurrentMode(w, h)); uint32_t format = 0; char format_str[ADF_FORMAT_STR_SIZE]; ASSERT_NO_FATAL_FAILURE(get8888Format(format, format_str)); uint32_t offset; uint32_t pitch; int buf_fd = adf_interface_simple_buffer_alloc(intf, w, h, format, &offset, &pitch); ASSERT_GE(buf_fd, 0) << "allocating " << w << "x" << h << " " << format_str << " buffer failed: " << strerror(-buf_fd); EXPECT_GE(pitch, w * 4); void *mapped = mmap(NULL, pitch * h, PROT_WRITE, MAP_SHARED, buf_fd, offset); ASSERT_NE(mapped, MAP_FAILED) << "mapping " << w << "x" << h << " " << format_str << " buffer failed: " << strerror(-errno); drawCheckerboard(mapped, w, h, pitch); munmap(mapped, pitch * h); ASSERT_NO_FATAL_FAILURE(attach()); ASSERT_NO_FATAL_FAILURE(blank(DRM_MODE_DPMS_ON)); int release_fence = adf_interface_simple_post(intf, eng_id, w, h, format, buf_fd, offset, pitch, -1); close(buf_fd); ASSERT_GE(release_fence, 0) << "posting " << w << "x" << h << " " << format_str << " buffer failed: " << strerror(-release_fence); close(release_fence); }
static int adf_surface_init(struct adf_pdata *pdata, struct drm_mode_modeinfo *mode, struct adf_surface_pdata *surf) { memset(surf, 0, sizeof(*surf)); surf->fd = adf_interface_simple_buffer_alloc(pdata->intf_fd, mode->hdisplay, mode->vdisplay, pdata->format, &surf->offset, &surf->pitch); if (surf->fd < 0) return surf->fd; //ActionsCode(author:lipeng, type:newcode, comment:init fence_fd) surf->fence_fd = -1; // end ActionsCode surf->base.width = mode->hdisplay; surf->base.height = mode->vdisplay; surf->base.row_bytes = surf->pitch; surf->base.pixel_bytes = (pdata->format == DRM_FORMAT_RGB565) ? 2 : 4; surf->base.data = mmap(NULL, surf->pitch * surf->base.height, PROT_WRITE, MAP_SHARED, surf->fd, surf->offset); if (surf->base.data == MAP_FAILED) { close(surf->fd); return -errno; } return 0; }
static int adf_fb_alloc(struct adf_fbdev *fbdev) { int ret; ret = adf_interface_simple_buffer_alloc(fbdev->intf, fbdev->default_xres_virtual, fbdev->default_yres_virtual, fbdev->default_format, &fbdev->dma_buf, &fbdev->offset, &fbdev->pitch); if (ret < 0) { dev_err(fbdev->info->dev, "allocating fb failed: %d\n", ret); return ret; } fbdev->vaddr = dma_buf_vmap(fbdev->dma_buf); if (!fbdev->vaddr) { ret = -ENOMEM; dev_err(fbdev->info->dev, "vmapping fb failed\n"); goto err_vmap; } fbdev->info->fix.line_length = fbdev->pitch; fbdev->info->var.xres_virtual = fbdev->default_xres_virtual; fbdev->info->var.yres_virtual = fbdev->default_yres_virtual; fbdev->info->fix.smem_len = fbdev->dma_buf->size; fbdev->info->screen_base = fbdev->vaddr; return 0; err_vmap: dma_buf_put(fbdev->dma_buf); return ret; }
TEST_F(AdfTest, simple_buffer_alloc) { uint32_t w = 0, h = 0; ASSERT_NO_FATAL_FAILURE(getCurrentMode(w, h)); uint32_t format; char format_str[ADF_FORMAT_STR_SIZE]; ASSERT_NO_FATAL_FAILURE(get8888Format(format, format_str)); uint32_t offset; uint32_t pitch; int buf_fd = adf_interface_simple_buffer_alloc(intf, w, h, format, &offset, &pitch); EXPECT_GE(buf_fd, 0) << "allocating " << w << "x" << h << " " << format_str << " buffer failed: " << strerror(-buf_fd); EXPECT_GE(pitch, w * 4); close(buf_fd); buf_fd = adf_interface_simple_buffer_alloc(intf, w, h, 0xDEADBEEF, &offset, &pitch); /* n.b.: ADF only allows simple buffers with built-in RGB formats, so this should fail even if a driver supports custom format 0xDEADBEEF */ EXPECT_EQ(-EINVAL, buf_fd) << "allocating buffer with bogus format should have failed"; }
static int adf_surface_init(adf_pdata *pdata, drm_mode_modeinfo *mode, adf_surface_pdata *surf) { memset(surf, 0, sizeof(*surf)); surf->fd = adf_interface_simple_buffer_alloc(pdata->intf_fd, mode->hdisplay, mode->vdisplay, pdata->format, &surf->offset, &surf->pitch); if (surf->fd < 0) return surf->fd; surf->base.width = mode->hdisplay; surf->base.height = mode->vdisplay; surf->base.row_bytes = surf->pitch; surf->base.pixel_bytes = (pdata->format == DRM_FORMAT_RGB565) ? 2 : 4; surf->base.data = reinterpret_cast<uint8_t*>(mmap(NULL, surf->pitch * surf->base.height, PROT_WRITE, MAP_SHARED, surf->fd, surf->offset)); if (surf->base.data == MAP_FAILED) { close(surf->fd); return -errno; } return 0; }
static int adf_surface_init(adf_pdata *pdata, drm_mode_modeinfo *mode, adf_surface_pdata *surf) { memset(surf, 0, sizeof(*surf)); surf->fd = adf_interface_simple_buffer_alloc(pdata->intf_fd, mode->hdisplay, mode->vdisplay, pdata->format, &surf->offset, &surf->pitch); if (surf->fd < 0) { return surf->fd; } surf->base.width = mode->hdisplay; surf->base.height = mode->vdisplay; surf->base.row_bytes = surf->pitch; surf->base.pixel_bytes = (pdata->format == DRM_FORMAT_RGB565) ? 2 : 4; if (pdata->format == DRM_FORMAT_ABGR8888) { surf->base.format = GGL_PIXEL_FORMAT_BGRA_8888; } else if (pdata->format == DRM_FORMAT_BGRA8888) { surf->base.format = GGL_PIXEL_FORMAT_BGRA_8888; } else if (pdata->format == DRM_FORMAT_RGBA8888) { surf->base.format = GGL_PIXEL_FORMAT_RGBA_8888; } else if (pdata->format == DRM_FORMAT_RGBX8888) { surf->base.format = GGL_PIXEL_FORMAT_RGBX_8888; } else { surf->base.format = GGL_PIXEL_FORMAT_RGB_565; } surf->adf_data = reinterpret_cast<uint8_t*>(mmap(nullptr, surf->pitch * surf->base.height, PROT_WRITE, MAP_SHARED, surf->fd, surf->offset)); if (surf->adf_data == MAP_FAILED) { close(surf->fd); return -errno; } return 0; }
int MinuiBackendAdf::SurfaceInit(const drm_mode_modeinfo* mode, GRSurfaceAdf* surf) { *surf = {}; surf->fence_fd = -1; surf->fd = adf_interface_simple_buffer_alloc(intf_fd, mode->hdisplay, mode->vdisplay, format, &surf->offset, &surf->pitch); if (surf->fd < 0) { return surf->fd; } surf->width = mode->hdisplay; surf->height = mode->vdisplay; surf->row_bytes = surf->pitch; surf->pixel_bytes = (format == DRM_FORMAT_RGB565) ? 2 : 4; surf->data = static_cast<uint8_t*>( mmap(nullptr, surf->pitch * surf->height, PROT_WRITE, MAP_SHARED, surf->fd, surf->offset)); if (surf->data == MAP_FAILED) { int saved_errno = errno; close(surf->fd); return -saved_errno; } return 0; }