diff --git a/drivers/video/drm/i915/bitmap.c b/drivers/video/drm/i915/bitmap.c index 66d173c3d1..a532ac16cb 100644 --- a/drivers/video/drm/i915/bitmap.c +++ b/drivers/video/drm/i915/bitmap.c @@ -1,26 +1,29 @@ -#include -#include -#include "i915_drm.h" +#include +#include #include "i915_drv.h" #include "intel_drv.h" +#include "hmm.h" #include "bitmap.h" -#define memmove __builtin_memmove - -int gem_object_lock(struct drm_i915_gem_object *obj); - -#define DRIVER_CAPS_0 HW_BIT_BLIT | HW_TEX_BLIT; +#define DRIVER_CAPS_0 HW_BIT_BLIT; #define DRIVER_CAPS_1 0 +struct context *context_map[256]; + +struct hmm bm_mm; + extern struct drm_device *main_device; -struct hman bm_man; + void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) { + dma_addr_t *pages = bitmap->obj->allocated_pages;; + int i; + printf("destroy bitmap %d\n", bitmap->handle); - free_handle(&bm_man, bitmap->handle); + free_handle(&bm_mm, bitmap->handle); bitmap->handle = 0; bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; @@ -29,20 +32,86 @@ void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) drm_gem_object_unreference(&bitmap->obj->base); mutex_unlock(&main_device->struct_mutex); + if(pages != NULL) + { + for (i = 0; i < bitmap->page_count; i++) + FreePage(pages[i]); + + free(pages); + }; + UserFree(bitmap->uaddr); __DestroyObject(bitmap); }; -int init_bitmaps() + +static int bitmap_get_pages_gtt(struct drm_i915_gem_object *obj) { - int ret; + int page_count; - ret = init_hman(&bm_man, 1024); + /* Get the list of pages out of our struct file. They'll be pinned + * at this point until we release them. + */ + page_count = obj->base.size / PAGE_SIZE; + BUG_ON(obj->allocated_pages == NULL); + BUG_ON(obj->pages.page != NULL); - return ret; + obj->pages.page = obj->allocated_pages; + obj->pages.nents = page_count; + + +// if (obj->tiling_mode != I915_TILING_NONE) +// i915_gem_object_do_bit_17_swizzle(obj); + + return 0; +} + +static void bitmap_put_pages_gtt(struct drm_i915_gem_object *obj) +{ + int ret, i; + + BUG_ON(obj->madv == __I915_MADV_PURGED); + + ret = i915_gem_object_set_to_cpu_domain(obj, true); + if (ret) { + /* In the event of a disaster, abandon all caches and + * hope for the best. + */ + WARN_ON(ret != -EIO); + i915_gem_clflush_object(obj); + obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; + } + + if (obj->madv == I915_MADV_DONTNEED) + obj->dirty = 0; + + obj->dirty = 0; +} + +static const struct drm_i915_gem_object_ops bitmap_object_ops = { + .get_pages = bitmap_get_pages_gtt, + .put_pages = bitmap_put_pages_gtt, }; -int create_surface(struct io_call_10 *pbitmap) + +#if 0 +struct io_call_10 /* SRV_CREATE_SURFACE */ +{ + u32 handle; // ignored + void *data; // ignored + + u32 width; + u32 height; + u32 pitch; // ignored + + u32 max_width; + u32 max_height; + u32 format; // reserved mbz +}; + +#endif + +int create_surface(struct drm_device *dev, struct io_call_10 *pbitmap) { struct drm_i915_gem_object *obj; @@ -53,6 +122,10 @@ int create_surface(struct io_call_10 *pbitmap) u32 size, max_size; u32 pitch, max_pitch; void *uaddr; + dma_addr_t *pages; + u32 page_count; + + int i; int ret; @@ -62,10 +135,10 @@ int create_surface(struct io_call_10 *pbitmap) width = pbitmap->width; height = pbitmap->height; -/* - if((width==0)||(height==0)||(width>4096)||(height>4096)) + if((width == 0)||(height == 0)||(width > 4096)||(height > 4096)) goto err1; +/* if( ((pbitmap->max_width !=0 ) && (pbitmap->max_width < width)) || (pbitmap->max_width > 4096) ) @@ -83,7 +156,7 @@ int create_surface(struct io_call_10 *pbitmap) max_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width; max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; - handle = alloc_handle(&bm_man); + handle = alloc_handle(&bm_mm); // printf("%s %d\n",__FUNCTION__, handle); if(handle == 0) @@ -92,54 +165,63 @@ int create_surface(struct io_call_10 *pbitmap) bitmap = CreateObject(GetPid(), sizeof(*bitmap)); // printf("bitmap %x\n", bitmap); if( bitmap == NULL) - goto err1; + goto err2; bitmap->handle = handle; bitmap->header.destroy = destroy_bitmap; bitmap->obj = NULL; - - hman_set_data(&bm_man, handle, bitmap); + hmm_set_data(&bm_mm, handle, bitmap); pitch = ALIGN(width*4,64); - size = roundup(pitch*height, PAGE_SIZE); // printf("pitch %d size %d\n", pitch, size); - obj = i915_gem_alloc_object(main_device, size); - if (obj == NULL) - goto err2; - - ret = i915_gem_object_pin(obj, 4096, true); - if (ret) - goto err3; - max_pitch = ALIGN(max_width*4,64); max_size = roundup(max_pitch*max_height, PAGE_SIZE); +// printf("max_pitch %d max_size %d\n", max_pitch, max_size); + uaddr = UserAlloc(max_size); if( uaddr == NULL) - goto err4; + goto err3; else { - u32_t *src, *dst; - u32 count, max_count; + u32 max_count; + dma_addr_t page; + char *vaddr = uaddr; -#define page_tabs 0xFDC00000 /* really dirty hack */ + page_count = size/PAGE_SIZE; + max_count = max_size/PAGE_SIZE; - src = (u32_t*)obj->pages; - dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; - count = size/4096; - max_count = max_size/4096 - count; + pages = kzalloc(max_count*sizeof(dma_addr_t), 0); + if( pages == NULL) + goto err4; - while(count--) + for(i = 0; i < page_count; i++, vaddr+= PAGE_SIZE) { - *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page + page = AllocPage(); + if ( page == 0 ) + goto err4; + pages[i] = page; + + MapPage(vaddr, page, 0x207); //map as shared page }; - while(max_count--) - *dst++ = 0; // cleanup unused space - } + bitmap->page_count = page_count; + bitmap->max_count = max_count; + }; + + obj = i915_gem_alloc_object(dev, size); + if (obj == NULL) + goto err4; + + obj->ops = &bitmap_object_ops; + obj->allocated_pages = pages; + + ret = i915_gem_object_pin(obj, PAGE_SIZE, true,true); + if (ret) + goto err5; obj->mapped = uaddr ; @@ -166,16 +248,23 @@ int create_surface(struct io_call_10 *pbitmap) return 0; -err4: - i915_gem_object_unpin(obj); -err3: +err5: + mutex_lock(&dev->struct_mutex); drm_gem_object_unreference(&obj->base); -err2: - free_handle(&bm_man, handle); + mutex_unlock(&dev->struct_mutex); + +err4: + while (i--) + FreePage(pages[i]); + free(pages); + UserFree(uaddr); + +err3: __DestroyObject(bitmap); +err2: + free_handle(&bm_mm, handle); err1: return -1; - }; @@ -183,20 +272,19 @@ int lock_surface(struct io_call_12 *pbitmap) { int ret; - drm_i915_private_t *dev_priv = main_device->dev_private; - bitmap_t *bitmap; if(unlikely(pbitmap->handle == 0)) return -1; - bitmap = (bitmap_t*)hman_get_data(&bm_man, pbitmap->handle); + bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); if(unlikely(bitmap==NULL)) return -1; - ret = gem_object_lock(bitmap->obj); - if(ret !=0 ) + ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true); + + if(ret != 0 ) { pbitmap->data = NULL; pbitmap->pitch = 0; @@ -212,120 +300,22 @@ int lock_surface(struct io_call_12 *pbitmap) }; -int init_hman(struct hman *man, u32 count) + + +int init_bitmaps() { - u32* data; + int ret; - data = malloc(count*sizeof(u32*)); - if(data) - { - int i; - - for(i=0;i < count-1;) - data[i] = ++i; - data[i] = 0; - - man->table = data; - man->next = 0; - man->avail = count; - man->count = count; - - return 0; - }; - return -ENOMEM; -}; - -u32 alloc_handle(struct hman *man) -{ - u32 handle = 0; - - if(man->avail) - { - handle = man->next; - man->next = man->table[handle]; - man->avail--; - handle++; - } - return handle; -}; - -int free_handle(struct hman *man, u32 handle) -{ - int ret = -1; - - handle--; - - if(handle < man->count) - { - man->table[handle] = man->next; - man->next = handle; - man->avail++; - ret = 0; - }; + ret = init_hmm(&bm_mm, 1024); return ret; }; -void *drm_intel_bo_map(struct drm_i915_gem_object *obj, int write_enable) -{ - u8 *kaddr; - - kaddr = AllocKernelSpace(obj->base.size); - if( kaddr != NULL) - { - u32_t *src = (u32_t*)obj->pages; - u32_t *dst = &((u32_t*)page_tabs)[(u32_t)kaddr >> 12]; - - u32 count = obj->base.size/4096; - - while(count--) - { - *dst++ = (0xFFFFF000 & *src++) | 0x003 ; - }; - return kaddr; - }; - return NULL; -} - -void destroy_gem_object(uint32_t handle) -{ - struct drm_i915_gem_object *obj = (void*)handle; - drm_gem_object_unreference(&obj->base); - -}; - - -void write_gem_object(uint32_t handle, u32 offset, u32 size, u8* src) -{ - struct drm_i915_gem_object *obj = (void*)handle; - u8 *dst; - int ret; - - ret = i915_gem_object_pin(obj, 4096, true); - if (ret) - return; - - dst = drm_intel_bo_map(obj, true); - if( dst != NULL ) - { - memmove(dst+offset, src, size); - FreeKernelSpace(dst); - }; -}; - -u32 get_buffer_offset(uint32_t handle) -{ - struct drm_i915_gem_object *obj = (void*)handle; - - return obj->gtt_offset; -}; - int get_driver_caps(hwcaps_t *caps) { int ret = 0; - ENTER(); switch(caps->idx) { @@ -345,3 +335,56 @@ int get_driver_caps(hwcaps_t *caps) return ret; } + +void __attribute__((regparm(1))) destroy_context(struct context *context) +{ + printf("destroy context %x\n", context); + + context_map[context->slot] = NULL; + + mutex_lock(&main_device->struct_mutex); + drm_gem_object_unreference(&context->obj->base); + mutex_unlock(&main_device->struct_mutex); + + __DestroyObject(context); +}; + + +#define CURRENT_TASK (0x80003000) + +struct context *get_context(struct drm_device *dev) +{ + struct context *context; + struct io_call_10 io_10; + int slot = *((u8*)CURRENT_TASK); + int ret; + + context = context_map[slot]; + + if( context != NULL) + return context; + + context = CreateObject(GetPid(), sizeof(*context)); + printf("context %x\n", context); + if( context != NULL) + { + drm_i915_private_t *dev_priv = dev->dev_private; + struct drm_i915_gem_object *obj; + + obj = i915_gem_alloc_object(dev, 4096); + i915_gem_object_pin(obj, 4096, true, true); + + context->obj = obj; + context->cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE); + context->cmd_offset = obj->gtt_offset; + + context->header.destroy = destroy_context; + context->mask = NULL; + context->seqno = 0; + context->slot = slot; + + context_map[slot] = context; + }; + return context; +}; + diff --git a/drivers/video/drm/i915/bitmap.h b/drivers/video/drm/i915/bitmap.h index 4d00b724e8..90b062efb1 100644 --- a/drivers/video/drm/i915/bitmap.h +++ b/drivers/video/drm/i915/bitmap.h @@ -2,26 +2,6 @@ typedef struct tag_object kobj_t; typedef struct tag_display display_t; -struct hman -{ - u32 *table; - u32 next; - u32 avail; - u32 count; -}; - -extern struct hman bm_man; - -int init_hman(struct hman *man, u32 count); -u32 alloc_handle(struct hman *man); -int free_handle(struct hman *man, u32 handle); - -#define hman_get_data(man, handle) \ - ((man)->table[(handle)-1]) - -#define hman_set_data(man, handle, val) \ - ((man)->table[(handle)-1]) = (u32)(val) - struct tag_object { @@ -46,6 +26,8 @@ typedef struct u32 height; u32 max_width; u32 max_height; + u32 page_count; + u32 max_count; u32 format; struct drm_i915_gem_object *obj; @@ -94,19 +76,25 @@ typedef struct #define HW_TEX_BLIT (1<<1) /* stretch blit */ #define HW_VID_BLIT (1<<2) /* planar and packed video */ /* 3 - 63 reserved */ - struct context { kobj_t header; + struct drm_i915_gem_object *obj; + u32 cmd_buffer; + u32 cmd_offset; + bitmap_t *mask; u32 seqno; int slot; + }; int get_driver_caps(hwcaps_t *caps); -int create_surface(struct io_call_10 *pbitmap); +int create_surface(struct drm_device *dev, struct io_call_10 *pbitmap); int lock_surface(struct io_call_12 *pbitmap); +struct context *get_context(struct drm_device *dev); + int init_bitmaps(); diff --git a/drivers/video/drm/i915/hmm.c b/drivers/video/drm/i915/hmm.c new file mode 100644 index 0000000000..01c5cf8916 --- /dev/null +++ b/drivers/video/drm/i915/hmm.c @@ -0,0 +1,71 @@ + +#include +#include +#include "hmm.h" + +int init_hmm(struct hmm *mm, u32 count) +{ + u32* data; + + if( mm == NULL) + return -EINVAL; + + data = malloc(count*sizeof(u32*)); + if( data ) + { + int i; + + for(i = 0; i < count-1; ) + data[i] = ++i; + data[i] = 0; + + mm->table = data; + mm->next = 0; + mm->avail = count; + mm->count = count; + + return 0; + }; + return -ENOMEM; +}; + +u32 alloc_handle(struct hmm *mm) +{ + u32 handle = 0; + u32 ifl; + + ifl = safe_cli(); + if(mm->avail) + { + handle = mm->next; + mm->next = mm->table[handle]; + mm->avail--; + handle++; + } + safe_sti(ifl); + + return handle; +}; + +int free_handle(struct hmm *mm, u32 handle) +{ + int ret = -1; + u32 ifl; + + handle--; + + ifl = safe_cli(); + if(handle < mm->count) + { + mm->table[handle] = mm->next; + mm->next = handle; + mm->avail++; + ret = 0; + }; + safe_sti(ifl); + + return ret; +}; + + + diff --git a/drivers/video/drm/i915/hmm.h b/drivers/video/drm/i915/hmm.h new file mode 100644 index 0000000000..dfb43d6128 --- /dev/null +++ b/drivers/video/drm/i915/hmm.h @@ -0,0 +1,24 @@ + +#ifndef __HMM_H__ +#define __HMM_H__ + +struct hmm +{ + u32 *table; + u32 next; + u32 avail; + u32 count; +}; + +int init_hmm(struct hmm *mm, u32 count); +u32 alloc_handle(struct hmm *mm); +int free_handle(struct hmm *mm, u32 handle); + +#define hmm_get_data(mm, handle) \ + ((mm)->table[(handle)-1]) + +#define hmm_set_data(mm, handle, val) \ + ((mm)->table[(handle)-1]) = (u32)(val) + + +#endif /* __HMM_H__ */ diff --git a/drivers/video/drm/i915/i915_drv.h b/drivers/video/drm/i915/i915_drv.h index 1a492cd943..59aae56548 100644 --- a/drivers/video/drm/i915/i915_drv.h +++ b/drivers/video/drm/i915/i915_drv.h @@ -1012,6 +1012,7 @@ struct drm_i915_gem_object { unsigned int has_global_gtt_mapping:1; unsigned int has_dma_mapping:1; + dma_addr_t *allocated_pages; struct pagelist pages; int pages_pin_count; diff --git a/drivers/video/drm/i915/i915_gem_gtt.c b/drivers/video/drm/i915/i915_gem_gtt.c index ba733a5e11..305a9714d8 100644 --- a/drivers/video/drm/i915/i915_gem_gtt.c +++ b/drivers/video/drm/i915/i915_gem_gtt.c @@ -309,14 +309,6 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) { - if (obj->has_dma_mapping) - return 0; - -// if (!dma_map_sg(&obj->base.dev->pdev->dev, -// obj->pages->sgl, obj->pages->nents, -// PCI_DMA_BIDIRECTIONAL)) -// return -ENOSPC; - return 0; } diff --git a/drivers/video/drm/i915/i915_irq.c b/drivers/video/drm/i915/i915_irq.c index 06a778f3d2..a72be3a72b 100644 --- a/drivers/video/drm/i915/i915_irq.c +++ b/drivers/video/drm/i915/i915_irq.c @@ -2518,7 +2518,7 @@ static struct drm_device *irq_device; void irq_handler_kms() { -// printf("%s\n",__FUNCTION__); + printf("%s\n",__FUNCTION__); ironlake_irq_handler(irq_device); } diff --git a/drivers/video/drm/i915/kms_display.c b/drivers/video/drm/i915/kms_display.c index 400689df26..3a57f1e0f0 100644 --- a/drivers/video/drm/i915/kms_display.c +++ b/drivers/video/drm/i915/kms_display.c @@ -15,6 +15,7 @@ #include +#include "hmm.h" #include "bitmap.h" extern struct drm_device *main_device; @@ -275,6 +276,7 @@ int init_display_kms(struct drm_device *dev) cursor_t *cursor; u32_t ifl; + int err; // ENTER(); @@ -366,39 +368,14 @@ int init_display_kms(struct drm_device *dev) }; safe_sti(ifl); -#define XY_COLOR_BLT ((2<<29)|(0x50<<22)|(0x4)) -#define BLT_WRITE_ALPHA (1<<21) -#define BLT_WRITE_RGB (1<<20) - -#if 0 - -#if 1 - { - - drm_i915_private_t *dev_priv = dev->dev_private; - struct drm_i915_gem_object *obj; - struct intel_ring_buffer *ring; - - obj = i915_gem_alloc_object(dev, 4096); - i915_gem_object_pin(obj, 4096, true, true); - - cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE); - cmd_offset = obj->gtt_offset; - }; -#endif - main_device = dev; - int err; - err = init_bitmaps(); if( !err ) { printf("Initialize bitmap manager\n"); }; - sna_init(); -#endif // LEAVE(); @@ -657,9 +634,11 @@ cursor_t* __stdcall select_cursor_kms(cursor_t *cursor) return old; }; -#if 0 -#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) + + + +extern struct hmm bm_mm; typedef struct @@ -686,18 +665,57 @@ static u32_t get_display_map() return *(u32_t*)addr; } +#define XY_COLOR_BLT ((2<<29)|(0x50<<22)|(0x4)) +#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) #define XY_SRC_COPY_CHROMA_CMD ((2<<29)|(0x73<<22)|8) #define ROP_COPY_SRC 0xCC #define FORMAT8888 3 +#define BLT_WRITE_ALPHA (1<<21) +#define BLT_WRITE_RGB (1<<20) + + + typedef int v4si __attribute__ ((vector_size (16))); +static void +i915_gem_execbuffer_retire_commands(struct drm_device *dev, + struct intel_ring_buffer *ring) +{ + struct drm_i915_gem_request *request; + u32 invalidate; + u32 req; + /* + * Ensure that the commands in the batch buffer are + * finished before the interrupt fires. + * + * The sampler always gets flushed on i965 (sigh). + */ + invalidate = I915_GEM_DOMAIN_COMMAND; + if (INTEL_INFO(dev)->gen >= 4) + invalidate |= I915_GEM_DOMAIN_SAMPLER; + if (ring->flush(ring, invalidate, 0)) { + i915_gem_next_request_seqno(ring); + return; + } + + /* Add a breadcrumb for the completion of the batch buffer */ + if (request == NULL || i915_add_request(ring, NULL, &req)) { + i915_gem_next_request_seqno(ring); + } +} + + + + + int blit_video(u32 hbitmap, int dst_x, int dst_y, int src_x, int src_y, u32 w, u32 h) { drm_i915_private_t *dev_priv = main_device->dev_private; struct intel_ring_buffer *ring; + struct context *context; bitmap_t *bitmap; rect_t winrc; @@ -714,11 +732,14 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y, if(unlikely(hbitmap==0)) return -1; - bitmap = (bitmap_t*)hman_get_data(&bm_man, hbitmap); + bitmap = (bitmap_t*)hmm_get_data(&bm_mm, hbitmap); if(unlikely(bitmap==NULL)) return -1; + context = get_context(main_device); + if(unlikely(context == NULL)) + return -1; GetWindowRect(&winrc); @@ -860,12 +881,12 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y, } #endif - if((cmd_buffer & 0xFC0)==0xFC0) - cmd_buffer&= 0xFFFFF000; + if((context->cmd_buffer & 0xFC0)==0xFC0) + context->cmd_buffer&= 0xFFFFF000; - b = (u32_t*)ALIGN(cmd_buffer,16); + b = (u32_t*)ALIGN(context->cmd_buffer,16); - offset = cmd_offset + ((u32_t)b & 0xFFF); + offset = context->cmd_offset + ((u32_t)b & 0xFFF); cmd = XY_SRC_COPY_CHROMA_CMD | BLT_WRITE_RGB | BLT_WRITE_ALPHA; cmd |= 3 << 17; @@ -890,29 +911,26 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y, if( n & 1) b[n++] = MI_NOOP; - i915_gem_object_set_to_gtt_domain(bitmap->obj, false); + context->cmd_buffer+= n*4; + +// i915_gem_object_set_to_gtt_domain(bitmap->obj, false); if (HAS_BLT(main_device)) { int ret; ring = &dev_priv->ring[BCS]; - ring->dispatch_execbuffer(ring, cmd_offset, n*4); +// printf("dispatch... "); + ring->dispatch_execbuffer(ring, offset, n*4); +// printf("done\n"); - ret = intel_ring_begin(ring, 4); - if (ret) - return ret; - - intel_ring_emit(ring, MI_FLUSH_DW); - intel_ring_emit(ring, 0); - intel_ring_emit(ring, 0); - intel_ring_emit(ring, MI_NOOP); - intel_ring_advance(ring); + i915_gem_execbuffer_retire_commands(main_device, ring); +// printf("retire\n"); } else { ring = &dev_priv->ring[RCS]; - ring->dispatch_execbuffer(ring, cmd_offset, n*4); + ring->dispatch_execbuffer(ring, offset, n*4); ring->flush(ring, 0, I915_GEM_DOMAIN_RENDER); }; @@ -925,6 +943,9 @@ fail: }; +#if 0 + + i915_gem_execbuffer_retire_commands(dev, ring); /* For display hotplug interrupt */ static void ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask) @@ -1082,8 +1103,6 @@ int sna_blit_tex(bitmap_t *dst_bitmap, int dst_x, int dst_y, int w, int h, bitmap_t *src_bitmap, int src_x, int src_y, bitmap_t *mask_bitmap); -int create_context(); -struct context *get_context(); int blit_tex(u32 hbitmap, int dst_x, int dst_y, int src_x, int src_y, u32 w, u32 h) @@ -1257,75 +1276,6 @@ int blit_tex(u32 hbitmap, int dst_x, int dst_y, }; -struct context *context_map[256]; - -void __attribute__((regparm(1))) destroy_context(struct context *context) -{ - printf("destroy context %x\n", context); - - context_map[context->slot] = NULL; - __DestroyObject(context); -}; - - -int create_context() -{ - struct context *context; - - bitmap_t *mask; - int slot; - - struct io_call_10 io_10; - int ret; - - slot = *((u8*)CURRENT_TASK); - - if(context_map[slot] != NULL) - return 0; - - context = CreateObject(GetPid(), sizeof(*context)); -// printf("context %x\n", coontext); - if( context == NULL) - goto err1; - context->header.destroy = destroy_context; - - dbgprintf("Create mask surface\n"); - - io_10.width = os_display->width/4; /* need bitmap format here */ - io_10.height = os_display->height+1; - io_10.max_width = os_display->width/4; - io_10.max_height = os_display->height+1; - - ret = create_surface(&io_10); - if(ret) - goto err2; - - mask= (bitmap_t*)hman_get_data(&bm_man, io_10.handle); - if(unlikely(mask == NULL)) /* something really terrible happend */ - goto err2; - dbgprintf("done\n"); - - context->mask = mask; - context->seqno = os_display->mask_seqno-1; - context->slot = slot; - - context_map[slot] = context; - return 0; - -err2: - __DestroyObject(context); -err1: - return -1; -}; - -struct context *get_context() -{ - - int slot = *((u8*)CURRENT_TASK); - - return context_map[slot]; -} - #endif diff --git a/drivers/video/drm/i915/main.c b/drivers/video/drm/i915/main.c index 2de2f011e2..29e46df2dc 100644 --- a/drivers/video/drm/i915/main.c +++ b/drivers/video/drm/i915/main.c @@ -13,6 +13,8 @@ #include "bitmap.h" +extern struct drm_device *main_device; + void cpu_detect(); void parse_cmdline(char *cmdline, char *log); @@ -142,14 +144,14 @@ int _stdcall display_handler(ioctl_t *io) if( i915_modeset ) retval = set_user_mode((videomode_t*)inp); break; -#if 0 + case SRV_GET_CAPS: retval = get_driver_caps((hwcaps_t*)inp); break; case SRV_CREATE_SURFACE: // check_input(8); - retval = create_surface((struct io_call_10*)inp); + retval = create_surface(main_device, (struct io_call_10*)inp); break; case SRV_LOCK_SURFACE: @@ -157,16 +159,15 @@ int _stdcall display_handler(ioctl_t *io) break; case SRV_BLIT_VIDEO: -// blit_video( inp[0], inp[1], inp[2], -// inp[3], inp[4], inp[5], inp[6]); + blit_video( inp[0], inp[1], inp[2], + inp[3], inp[4], inp[5], inp[6]); - blit_tex( inp[0], inp[1], inp[2], - inp[3], inp[4], inp[5], inp[6]); +// blit_tex( inp[0], inp[1], inp[2], +// inp[3], inp[4], inp[5], inp[6]); retval = 0; break; -#endif };