return NULL;
}
- if (auto_align && gem->dri2_buffer->pitch != gem->w * gem->depth) {
+ /**
+ * @note
+ * If the "auto_align" is turned on, forcely allocate compensate buffer,
+ * Even if the (pitch == w * depth).
+ * "auto_align" will work like "enabling cache layer"
+ */
+ if (auto_align || gem->dri2_buffer->pitch != gem->w * gem->depth) {
gem->compensate_data = calloc(1, gem->w * gem->h * gem->depth);
if (!gem->compensate_data) {
ErrPrint("Failed to allocate heap\n");
}
}
- DbgPrint("dri2_buffer: %p, name: %p, %dx%d (%dx%d), pitch: %d, buf_count: %d, gem: %p\n",
+ DbgPrint("dri2_buffer: %p, name: %p, %dx%d (%dx%d), pitch: %d, buf_count: %d, gem: %p, comp: %p\n",
gem->dri2_buffer, gem->dri2_buffer->name,
gem->w, gem->h, w, h,
- gem->dri2_buffer->pitch, gem->buf_count, gem);
+ gem->dri2_buffer->pitch, gem->buf_count, gem, gem->compensate_data);
return gem;
}
* it means, acquire_gem didn't grab a lock.
*/
if (gem->compensate_data && gem->data) {
- register int x;
- register int y;
int *gem_pixel;
int *pixel;
int gap;
* write before copy the pixels, we should grab a lock
*/
tbm_bo_map(gem->pixmap_bo, TBM_DEVICE_CPU, TBM_OPTION_READ | TBM_OPTION_WRITE);
- for (y = 0; y < gem->h; y++) {
- for (x = 0; x < gem->w; x++) {
- *gem_pixel++ = *pixel++;
- }
+ if (gap == 0) {
+ /**
+ * @note
+ * I believe that the "memcpy" is faster than my code...
+ */
+ memcpy(gem_pixel, pixel, gem->dri2_buffer->pitch * gem->h);
+ } else {
+ register int x;
+ register int y;
- gem_pixel = (int *)(((char *)gem_pixel) + gap);
+ for (y = 0; y < gem->h; y++) {
+ for (x = 0; x < gem->w; x++) {
+ *gem_pixel++ = *pixel++;
+ }
+
+ gem_pixel = (int *)(((char *)gem_pixel) + gap);
+ }
}
}
tbm_bo_unmap(gem->pixmap_bo);