|
25 | 25 | #include <cstring> |
26 | 26 |
|
27 | 27 | #include "utils/log.h" |
| 28 | +#include <cros_gralloc_helpers.h> |
| 29 | +#include <i915_private_android_types.h> |
28 | 30 | namespace android { |
29 | 31 |
|
30 | 32 | LEGACY_BUFFER_INFO_GETTER(BufferInfoMinigbm); |
@@ -122,4 +124,91 @@ int BufferInfoMinigbm::ValidateGralloc() { |
122 | 124 | return 0; |
123 | 125 | } |
124 | 126 |
|
| 127 | +void BufferInfoMinigbm::InitializeGralloc1(DrmDevice *drmDevice) { |
| 128 | + hw_device_t *device; |
| 129 | + |
| 130 | + struct dri2_drm_display *dri_drm = (struct dri2_drm_display *)calloc(1, sizeof(*dri_drm)); |
| 131 | + if (!dri_drm) |
| 132 | + return; |
| 133 | + |
| 134 | + dri_drm->fd = -1; |
| 135 | + int ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, |
| 136 | + (const hw_module_t **)&dri_drm->gralloc); |
| 137 | + if (ret) { |
| 138 | + return; |
| 139 | + } |
| 140 | + |
| 141 | + dri_drm->gralloc_version = dri_drm->gralloc->common.module_api_version; |
| 142 | + if (dri_drm->gralloc_version == HARDWARE_MODULE_API_VERSION(1, 0)) { |
| 143 | + ret = dri_drm->gralloc->common.methods->open(&dri_drm->gralloc->common, GRALLOC_HARDWARE_MODULE_ID, &device); |
| 144 | + if (ret) { |
| 145 | + ALOGE("Failed to open device"); |
| 146 | + return; |
| 147 | + } else { |
| 148 | + ALOGE("success to open device, Initialize"); |
| 149 | + dri_drm->gralloc1_dvc = (gralloc1_device_t *)device; |
| 150 | + dri_drm->pfn_lock = (GRALLOC1_PFN_LOCK)dri_drm->gralloc1_dvc->getFunction(dri_drm->gralloc1_dvc, GRALLOC1_FUNCTION_LOCK); |
| 151 | + dri_drm->pfn_importBuffer = (GRALLOC1_PFN_IMPORT_BUFFER)dri_drm->gralloc1_dvc->getFunction(dri_drm->gralloc1_dvc, GRALLOC1_FUNCTION_IMPORT_BUFFER); |
| 152 | + dri_drm->pfn_release = (GRALLOC1_PFN_RELEASE)dri_drm->gralloc1_dvc->getFunction(dri_drm->gralloc1_dvc, GRALLOC1_FUNCTION_RELEASE); |
| 153 | + dri_drm->pfn_unlock = (GRALLOC1_PFN_UNLOCK)dri_drm->gralloc1_dvc->getFunction(dri_drm->gralloc1_dvc, GRALLOC1_FUNCTION_UNLOCK); |
| 154 | + dri_drm->pfn_get_stride = (GRALLOC1_PFN_GET_STRIDE)dri_drm->gralloc1_dvc->getFunction(dri_drm->gralloc1_dvc, GRALLOC1_FUNCTION_GET_STRIDE); |
| 155 | + drmDevice->dri_drm_ = (void *)dri_drm; |
| 156 | + } |
| 157 | + } |
| 158 | + return; |
| 159 | +} |
| 160 | + |
| 161 | +void BufferInfoMinigbm::DumpBuffer(DrmDevice *drmDevice, buffer_handle_t handle, int z_order) { |
| 162 | + if (NULL == handle) |
| 163 | + return; |
| 164 | + char dump_file[256] = {0}; |
| 165 | + buffer_handle_t handle_copy; |
| 166 | + uint8_t* pixels = nullptr; |
| 167 | + cros_gralloc_handle *gr_handle = (cros_gralloc_handle *)handle; |
| 168 | + gralloc1_rect_t accessRegion = {0, 0, (int32_t)gr_handle->width, (int32_t)gr_handle->height};; |
| 169 | + |
| 170 | + struct dri2_drm_display *dri_drm = (struct dri2_drm_display *)drmDevice->dri_drm_; |
| 171 | + |
| 172 | + assert (dri_drm == nullptr || |
| 173 | + dri_drm->pfn_importBuffer == nullptr || |
| 174 | + dri_drm->pfn_lock == nullptr || |
| 175 | + dri_drm->pfn_unlock == nullptr || |
| 176 | + dri_drm->pfn_release == nullptr || |
| 177 | + dri_drm->pfn_get_stride); |
| 178 | + |
| 179 | + int ret = dri_drm->pfn_importBuffer(dri_drm->gralloc1_dvc, handle, &handle_copy); |
| 180 | + if (ret) { |
| 181 | + ALOGE("Gralloc importBuffer failed"); |
| 182 | + return; |
| 183 | + } |
| 184 | + ret = dri_drm->pfn_lock(dri_drm->gralloc1_dvc, handle_copy, |
| 185 | + GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_NEVER, |
| 186 | + &accessRegion, reinterpret_cast<void**>(&pixels), 0); |
| 187 | + if (ret) { |
| 188 | + ALOGE("gralloc->lock failed: %d", ret); |
| 189 | + return; |
| 190 | + } else { |
| 191 | + char ctime[32]; |
| 192 | + time_t t = time(0); |
| 193 | + static int i = 0; |
| 194 | + strftime(ctime, sizeof(ctime), "%Y-%m-%d", localtime(&t)); |
| 195 | + sprintf(dump_file, "/data/local/traces/dump_%d_%dx%d_%s_%d", z_order, gr_handle->width, gr_handle->height, ctime,i++); |
| 196 | + int file_fd = 0; |
| 197 | + file_fd = open(dump_file, O_RDWR|O_CREAT, 0666); |
| 198 | + if (file_fd == -1) { |
| 199 | + ALOGE("Failed to open %s while dumping", dump_file); |
| 200 | + } else { |
| 201 | + size_t size = 0; |
| 202 | + if (gr_handle->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) |
| 203 | + size = gr_handle->width * gr_handle->height * 1.5; |
| 204 | + else |
| 205 | + size = gr_handle->width * gr_handle->height * 4; |
| 206 | + write(file_fd, pixels, size); |
| 207 | + close(file_fd); |
| 208 | + } |
| 209 | + int outReleaseFence = 0; |
| 210 | + dri_drm->pfn_unlock(dri_drm->gralloc1_dvc, handle_copy, &outReleaseFence); |
| 211 | + dri_drm->pfn_release(dri_drm->gralloc1_dvc, handle_copy); |
| 212 | + } |
| 213 | +} |
125 | 214 | } // namespace android |
0 commit comments