forked from KolibriOS/kolibrios
i915 hw blitter: Back in the game
git-svn-id: svn://kolibrios.org@3033 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
b4394bfc2f
commit
88dd19b554
@ -1,26 +1,29 @@
|
|||||||
|
|
||||||
#include <drmP.h>
|
#include <drm/drmP.h>
|
||||||
#include <drm.h>
|
#include <drm/i915_drm.h>
|
||||||
#include "i915_drm.h"
|
|
||||||
#include "i915_drv.h"
|
#include "i915_drv.h"
|
||||||
#include "intel_drv.h"
|
#include "intel_drv.h"
|
||||||
|
#include "hmm.h"
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
|
|
||||||
#define memmove __builtin_memmove
|
#define DRIVER_CAPS_0 HW_BIT_BLIT;
|
||||||
|
|
||||||
int gem_object_lock(struct drm_i915_gem_object *obj);
|
|
||||||
|
|
||||||
#define DRIVER_CAPS_0 HW_BIT_BLIT | HW_TEX_BLIT;
|
|
||||||
#define DRIVER_CAPS_1 0
|
#define DRIVER_CAPS_1 0
|
||||||
|
|
||||||
|
struct context *context_map[256];
|
||||||
|
|
||||||
|
struct hmm bm_mm;
|
||||||
|
|
||||||
extern struct drm_device *main_device;
|
extern struct drm_device *main_device;
|
||||||
|
|
||||||
struct hman bm_man;
|
|
||||||
|
|
||||||
void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap)
|
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);
|
printf("destroy bitmap %d\n", bitmap->handle);
|
||||||
free_handle(&bm_man, bitmap->handle);
|
free_handle(&bm_mm, bitmap->handle);
|
||||||
bitmap->handle = 0;
|
bitmap->handle = 0;
|
||||||
bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT;
|
bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT;
|
||||||
bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU;
|
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);
|
drm_gem_object_unreference(&bitmap->obj->base);
|
||||||
mutex_unlock(&main_device->struct_mutex);
|
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);
|
__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;
|
struct drm_i915_gem_object *obj;
|
||||||
|
|
||||||
@ -53,6 +122,10 @@ int create_surface(struct io_call_10 *pbitmap)
|
|||||||
u32 size, max_size;
|
u32 size, max_size;
|
||||||
u32 pitch, max_pitch;
|
u32 pitch, max_pitch;
|
||||||
void *uaddr;
|
void *uaddr;
|
||||||
|
dma_addr_t *pages;
|
||||||
|
u32 page_count;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -62,10 +135,10 @@ int create_surface(struct io_call_10 *pbitmap)
|
|||||||
width = pbitmap->width;
|
width = pbitmap->width;
|
||||||
height = pbitmap->height;
|
height = pbitmap->height;
|
||||||
|
|
||||||
/*
|
if((width == 0)||(height == 0)||(width > 4096)||(height > 4096))
|
||||||
if((width==0)||(height==0)||(width>4096)||(height>4096))
|
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
|
/*
|
||||||
if( ((pbitmap->max_width !=0 ) &&
|
if( ((pbitmap->max_width !=0 ) &&
|
||||||
(pbitmap->max_width < width)) ||
|
(pbitmap->max_width < width)) ||
|
||||||
(pbitmap->max_width > 4096) )
|
(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_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width;
|
||||||
max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height;
|
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);
|
// printf("%s %d\n",__FUNCTION__, handle);
|
||||||
|
|
||||||
if(handle == 0)
|
if(handle == 0)
|
||||||
@ -92,54 +165,63 @@ int create_surface(struct io_call_10 *pbitmap)
|
|||||||
bitmap = CreateObject(GetPid(), sizeof(*bitmap));
|
bitmap = CreateObject(GetPid(), sizeof(*bitmap));
|
||||||
// printf("bitmap %x\n", bitmap);
|
// printf("bitmap %x\n", bitmap);
|
||||||
if( bitmap == NULL)
|
if( bitmap == NULL)
|
||||||
goto err1;
|
goto err2;
|
||||||
|
|
||||||
bitmap->handle = handle;
|
bitmap->handle = handle;
|
||||||
bitmap->header.destroy = destroy_bitmap;
|
bitmap->header.destroy = destroy_bitmap;
|
||||||
bitmap->obj = NULL;
|
bitmap->obj = NULL;
|
||||||
|
|
||||||
|
hmm_set_data(&bm_mm, handle, bitmap);
|
||||||
hman_set_data(&bm_man, handle, bitmap);
|
|
||||||
|
|
||||||
pitch = ALIGN(width*4,64);
|
pitch = ALIGN(width*4,64);
|
||||||
|
|
||||||
size = roundup(pitch*height, PAGE_SIZE);
|
size = roundup(pitch*height, PAGE_SIZE);
|
||||||
|
|
||||||
// printf("pitch %d size %d\n", pitch, 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_pitch = ALIGN(max_width*4,64);
|
||||||
max_size = roundup(max_pitch*max_height, PAGE_SIZE);
|
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);
|
uaddr = UserAlloc(max_size);
|
||||||
if( uaddr == NULL)
|
if( uaddr == NULL)
|
||||||
goto err4;
|
goto err3;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u32_t *src, *dst;
|
u32 max_count;
|
||||||
u32 count, 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;
|
pages = kzalloc(max_count*sizeof(dma_addr_t), 0);
|
||||||
dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
|
if( pages == NULL)
|
||||||
count = size/4096;
|
goto err4;
|
||||||
max_count = max_size/4096 - count;
|
|
||||||
|
|
||||||
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--)
|
bitmap->page_count = page_count;
|
||||||
*dst++ = 0; // cleanup unused space
|
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 ;
|
obj->mapped = uaddr ;
|
||||||
|
|
||||||
@ -166,16 +248,23 @@ int create_surface(struct io_call_10 *pbitmap)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err4:
|
err5:
|
||||||
i915_gem_object_unpin(obj);
|
mutex_lock(&dev->struct_mutex);
|
||||||
err3:
|
|
||||||
drm_gem_object_unreference(&obj->base);
|
drm_gem_object_unreference(&obj->base);
|
||||||
err2:
|
mutex_unlock(&dev->struct_mutex);
|
||||||
free_handle(&bm_man, handle);
|
|
||||||
|
err4:
|
||||||
|
while (i--)
|
||||||
|
FreePage(pages[i]);
|
||||||
|
free(pages);
|
||||||
|
UserFree(uaddr);
|
||||||
|
|
||||||
|
err3:
|
||||||
__DestroyObject(bitmap);
|
__DestroyObject(bitmap);
|
||||||
|
err2:
|
||||||
|
free_handle(&bm_mm, handle);
|
||||||
err1:
|
err1:
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -183,20 +272,19 @@ int lock_surface(struct io_call_12 *pbitmap)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
drm_i915_private_t *dev_priv = main_device->dev_private;
|
|
||||||
|
|
||||||
bitmap_t *bitmap;
|
bitmap_t *bitmap;
|
||||||
|
|
||||||
if(unlikely(pbitmap->handle == 0))
|
if(unlikely(pbitmap->handle == 0))
|
||||||
return -1;
|
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))
|
if(unlikely(bitmap==NULL))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = gem_object_lock(bitmap->obj);
|
ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true);
|
||||||
if(ret !=0 )
|
|
||||||
|
if(ret != 0 )
|
||||||
{
|
{
|
||||||
pbitmap->data = NULL;
|
pbitmap->data = NULL;
|
||||||
pbitmap->pitch = 0;
|
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*));
|
ret = init_hmm(&bm_mm, 1024);
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
return ret;
|
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 get_driver_caps(hwcaps_t *caps)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
ENTER();
|
|
||||||
|
|
||||||
switch(caps->idx)
|
switch(caps->idx)
|
||||||
{
|
{
|
||||||
@ -345,3 +335,56 @@ int get_driver_caps(hwcaps_t *caps)
|
|||||||
return ret;
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
@ -2,26 +2,6 @@
|
|||||||
typedef struct tag_object kobj_t;
|
typedef struct tag_object kobj_t;
|
||||||
typedef struct tag_display display_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
|
struct tag_object
|
||||||
{
|
{
|
||||||
@ -46,6 +26,8 @@ typedef struct
|
|||||||
u32 height;
|
u32 height;
|
||||||
u32 max_width;
|
u32 max_width;
|
||||||
u32 max_height;
|
u32 max_height;
|
||||||
|
u32 page_count;
|
||||||
|
u32 max_count;
|
||||||
|
|
||||||
u32 format;
|
u32 format;
|
||||||
struct drm_i915_gem_object *obj;
|
struct drm_i915_gem_object *obj;
|
||||||
@ -94,19 +76,25 @@ typedef struct
|
|||||||
#define HW_TEX_BLIT (1<<1) /* stretch blit */
|
#define HW_TEX_BLIT (1<<1) /* stretch blit */
|
||||||
#define HW_VID_BLIT (1<<2) /* planar and packed video */
|
#define HW_VID_BLIT (1<<2) /* planar and packed video */
|
||||||
/* 3 - 63 reserved */
|
/* 3 - 63 reserved */
|
||||||
|
|
||||||
struct context
|
struct context
|
||||||
{
|
{
|
||||||
kobj_t header;
|
kobj_t header;
|
||||||
|
|
||||||
|
struct drm_i915_gem_object *obj;
|
||||||
|
u32 cmd_buffer;
|
||||||
|
u32 cmd_offset;
|
||||||
|
|
||||||
bitmap_t *mask;
|
bitmap_t *mask;
|
||||||
u32 seqno;
|
u32 seqno;
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int get_driver_caps(hwcaps_t *caps);
|
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);
|
int lock_surface(struct io_call_12 *pbitmap);
|
||||||
|
|
||||||
|
struct context *get_context(struct drm_device *dev);
|
||||||
|
|
||||||
int init_bitmaps();
|
int init_bitmaps();
|
||||||
|
|
||||||
|
71
drivers/video/drm/i915/hmm.c
Normal file
71
drivers/video/drm/i915/hmm.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
#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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
24
drivers/video/drm/i915/hmm.h
Normal file
24
drivers/video/drm/i915/hmm.h
Normal file
@ -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__ */
|
@ -1012,6 +1012,7 @@ struct drm_i915_gem_object {
|
|||||||
unsigned int has_global_gtt_mapping:1;
|
unsigned int has_global_gtt_mapping:1;
|
||||||
unsigned int has_dma_mapping:1;
|
unsigned int has_dma_mapping:1;
|
||||||
|
|
||||||
|
dma_addr_t *allocated_pages;
|
||||||
struct pagelist pages;
|
struct pagelist pages;
|
||||||
int pages_pin_count;
|
int pages_pin_count;
|
||||||
|
|
||||||
|
@ -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)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2518,7 +2518,7 @@ static struct drm_device *irq_device;
|
|||||||
|
|
||||||
void irq_handler_kms()
|
void irq_handler_kms()
|
||||||
{
|
{
|
||||||
// printf("%s\n",__FUNCTION__);
|
printf("%s\n",__FUNCTION__);
|
||||||
ironlake_irq_handler(irq_device);
|
ironlake_irq_handler(irq_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
|
||||||
|
#include "hmm.h"
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
|
|
||||||
extern struct drm_device *main_device;
|
extern struct drm_device *main_device;
|
||||||
@ -275,6 +276,7 @@ int init_display_kms(struct drm_device *dev)
|
|||||||
|
|
||||||
cursor_t *cursor;
|
cursor_t *cursor;
|
||||||
u32_t ifl;
|
u32_t ifl;
|
||||||
|
int err;
|
||||||
|
|
||||||
// ENTER();
|
// ENTER();
|
||||||
|
|
||||||
@ -366,39 +368,14 @@ int init_display_kms(struct drm_device *dev)
|
|||||||
};
|
};
|
||||||
safe_sti(ifl);
|
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;
|
main_device = dev;
|
||||||
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = init_bitmaps();
|
err = init_bitmaps();
|
||||||
if( !err )
|
if( !err )
|
||||||
{
|
{
|
||||||
printf("Initialize bitmap manager\n");
|
printf("Initialize bitmap manager\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
sna_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// LEAVE();
|
// LEAVE();
|
||||||
|
|
||||||
@ -657,9 +634,11 @@ cursor_t* __stdcall select_cursor_kms(cursor_t *cursor)
|
|||||||
return old;
|
return old;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)
|
|
||||||
|
|
||||||
|
|
||||||
|
extern struct hmm bm_mm;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -686,18 +665,57 @@ static u32_t get_display_map()
|
|||||||
return *(u32_t*)addr;
|
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 XY_SRC_COPY_CHROMA_CMD ((2<<29)|(0x73<<22)|8)
|
||||||
#define ROP_COPY_SRC 0xCC
|
#define ROP_COPY_SRC 0xCC
|
||||||
#define FORMAT8888 3
|
#define FORMAT8888 3
|
||||||
|
|
||||||
|
#define BLT_WRITE_ALPHA (1<<21)
|
||||||
|
#define BLT_WRITE_RGB (1<<20)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef int v4si __attribute__ ((vector_size (16)));
|
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 blit_video(u32 hbitmap, int dst_x, int dst_y,
|
||||||
int src_x, int src_y, u32 w, u32 h)
|
int src_x, int src_y, u32 w, u32 h)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = main_device->dev_private;
|
drm_i915_private_t *dev_priv = main_device->dev_private;
|
||||||
struct intel_ring_buffer *ring;
|
struct intel_ring_buffer *ring;
|
||||||
|
struct context *context;
|
||||||
|
|
||||||
bitmap_t *bitmap;
|
bitmap_t *bitmap;
|
||||||
rect_t winrc;
|
rect_t winrc;
|
||||||
@ -714,11 +732,14 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y,
|
|||||||
if(unlikely(hbitmap==0))
|
if(unlikely(hbitmap==0))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
bitmap = (bitmap_t*)hman_get_data(&bm_man, hbitmap);
|
bitmap = (bitmap_t*)hmm_get_data(&bm_mm, hbitmap);
|
||||||
|
|
||||||
if(unlikely(bitmap==NULL))
|
if(unlikely(bitmap==NULL))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
context = get_context(main_device);
|
||||||
|
if(unlikely(context == NULL))
|
||||||
|
return -1;
|
||||||
|
|
||||||
GetWindowRect(&winrc);
|
GetWindowRect(&winrc);
|
||||||
|
|
||||||
@ -860,12 +881,12 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if((cmd_buffer & 0xFC0)==0xFC0)
|
if((context->cmd_buffer & 0xFC0)==0xFC0)
|
||||||
cmd_buffer&= 0xFFFFF000;
|
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 = XY_SRC_COPY_CHROMA_CMD | BLT_WRITE_RGB | BLT_WRITE_ALPHA;
|
||||||
cmd |= 3 << 17;
|
cmd |= 3 << 17;
|
||||||
@ -890,29 +911,26 @@ int blit_video(u32 hbitmap, int dst_x, int dst_y,
|
|||||||
if( n & 1)
|
if( n & 1)
|
||||||
b[n++] = MI_NOOP;
|
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))
|
if (HAS_BLT(main_device))
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ring = &dev_priv->ring[BCS];
|
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);
|
i915_gem_execbuffer_retire_commands(main_device, ring);
|
||||||
if (ret)
|
// printf("retire\n");
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ring = &dev_priv->ring[RCS];
|
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);
|
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 */
|
/* For display hotplug interrupt */
|
||||||
static void
|
static void
|
||||||
ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
|
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,
|
int w, int h, bitmap_t *src_bitmap, int src_x, int src_y,
|
||||||
bitmap_t *mask_bitmap);
|
bitmap_t *mask_bitmap);
|
||||||
|
|
||||||
int create_context();
|
|
||||||
struct context *get_context();
|
|
||||||
|
|
||||||
int blit_tex(u32 hbitmap, int dst_x, int dst_y,
|
int blit_tex(u32 hbitmap, int dst_x, int dst_y,
|
||||||
int src_x, int src_y, u32 w, u32 h)
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
|
|
||||||
|
extern struct drm_device *main_device;
|
||||||
|
|
||||||
void cpu_detect();
|
void cpu_detect();
|
||||||
|
|
||||||
void parse_cmdline(char *cmdline, char *log);
|
void parse_cmdline(char *cmdline, char *log);
|
||||||
@ -142,14 +144,14 @@ int _stdcall display_handler(ioctl_t *io)
|
|||||||
if( i915_modeset )
|
if( i915_modeset )
|
||||||
retval = set_user_mode((videomode_t*)inp);
|
retval = set_user_mode((videomode_t*)inp);
|
||||||
break;
|
break;
|
||||||
#if 0
|
|
||||||
case SRV_GET_CAPS:
|
case SRV_GET_CAPS:
|
||||||
retval = get_driver_caps((hwcaps_t*)inp);
|
retval = get_driver_caps((hwcaps_t*)inp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_CREATE_SURFACE:
|
case SRV_CREATE_SURFACE:
|
||||||
// check_input(8);
|
// check_input(8);
|
||||||
retval = create_surface((struct io_call_10*)inp);
|
retval = create_surface(main_device, (struct io_call_10*)inp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_LOCK_SURFACE:
|
case SRV_LOCK_SURFACE:
|
||||||
@ -157,16 +159,15 @@ int _stdcall display_handler(ioctl_t *io)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_BLIT_VIDEO:
|
case SRV_BLIT_VIDEO:
|
||||||
// blit_video( inp[0], inp[1], inp[2],
|
blit_video( inp[0], inp[1], inp[2],
|
||||||
// inp[3], inp[4], inp[5], inp[6]);
|
inp[3], inp[4], inp[5], inp[6]);
|
||||||
|
|
||||||
blit_tex( inp[0], inp[1], inp[2],
|
// blit_tex( inp[0], inp[1], inp[2],
|
||||||
inp[3], inp[4], inp[5], inp[6]);
|
// inp[3], inp[4], inp[5], inp[6]);
|
||||||
|
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user