27,7 → 27,6 |
bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
|
mutex_lock(&main_device->struct_mutex); |
|
drm_gem_object_unreference(&bitmap->obj->base); |
mutex_unlock(&main_device->struct_mutex); |
|
210,6 → 209,11 |
|
MapPage(vaddr, page, 0x207); //map as shared page |
}; |
for(;i < max_count; i++, vaddr+= PAGE_SIZE) |
{ |
MapPage(vaddr, 0, 0); //map as shared page |
}; |
|
bitmap->page_count = page_count; |
bitmap->max_count = max_count; |
}; |
339,14 → 343,8 |
DRM_DEBUG("new width %d height %d pitch %d size %d\n", |
width, height, pitch, size); |
|
if( page_count == bitmap->page_count ) |
if(page_count > bitmap->page_count) |
{ |
bitmap->width = width; |
bitmap->height = height; |
bitmap->pitch = pitch; |
} |
else if(page_count > bitmap->page_count) |
{ |
char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count; |
|
pages = bitmap->obj->allocated_pages; |
366,8 → 364,6 |
DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, |
page_count - bitmap->page_count); |
|
// mutex_lock(&main_device->struct_mutex); |
|
i915_gem_object_unpin(bitmap->obj); |
i915_gem_object_unbind(bitmap->obj); |
bitmap->obj->base.size = size; |
376,24 → 372,49 |
ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
if (ret) |
goto err4; |
// mutex_unlock(&main_device->struct_mutex); |
|
bitmap->page_count = page_count; |
bitmap->width = width; |
bitmap->height = height; |
bitmap->pitch = pitch; |
bitmap->gaddr = bitmap->obj->gtt_offset; |
}; |
} |
else if(page_count < bitmap->page_count) |
{ |
char *vaddr = bitmap->uaddr + PAGE_SIZE * page_count; |
|
if(ret != 0 ) |
i915_gem_object_unpin(bitmap->obj); |
i915_gem_object_unbind(bitmap->obj); |
|
pages = bitmap->obj->allocated_pages; |
|
DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
bitmap->page_count, page_count, vaddr); |
|
for(i = page_count; i < bitmap->page_count; i++, vaddr+= PAGE_SIZE) |
{ |
pbitmap->data = NULL; |
pbitmap->pitch = 0; |
MapPage(vaddr, 0, 0); //unmap |
|
dbgprintf("%s fail\n", __FUNCTION__); |
return ret; |
FreePage(pages[i]); |
pages[i] = 0; |
}; |
|
DRM_DEBUG("%s release %d pages\n", __FUNCTION__, |
bitmap->page_count - page_count); |
|
bitmap->obj->base.size = size; |
bitmap->obj->pages.nents = page_count; |
|
ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
if (ret) |
goto err3; |
|
bitmap->page_count = page_count; |
bitmap->gaddr = bitmap->obj->gtt_offset; |
}; |
|
bitmap->width = width; |
bitmap->height = height; |
bitmap->pitch = pitch; |
|
|
pbitmap->data = bitmap->uaddr; |
pbitmap->pitch = bitmap->pitch; |
|
403,6 → 424,7 |
while (i-- > bitmap->page_count) |
FreePage(pages[i]); |
|
err3: |
return -1; |
}; |
|
447,6 → 469,8 |
|
context_map[context->slot] = NULL; |
|
FreeKernelSpace(context->cmd_buffer); |
|
mutex_lock(&main_device->struct_mutex); |
drm_gem_object_unreference(&context->obj->base); |
mutex_unlock(&main_device->struct_mutex); |