2015-11-23 3 views
-1

Я ищу кого-то, у кого есть опыт/знания о том, как реализовать dri3 и настоящее расширение в клиентском приложении.Расширение Dri3 и Present на клиентском приложении

My use case будет: У меня есть буфер dma, созданный в моем приложении, и вы хотите использовать существующее расширение, чтобы отобразить его на экране.

+0

Пробовал искать пример онлайн, но вряд ли его можно найти. – Kinux

+0

Сейчас вопрос непонятен. Чтобы избежать пометок для закрытия, вы должны показать, что вы пробовали до сих пор, и сузить круг вопросов – Greg

ответ

0

Спасибо Sharvil111 и Gray за быстрый ответ. Я нашел настоящий тест от xf86-intel-driver - test/present-test.c. Я поместил приведенный ниже код в свое приложение. Я получаю черный экран в конце. Я ожидаю, что созданная pixmap будет пуста, и поэтому ожидается черный экран.

Исправьте меня, если я ошибаюсь.

static int test_dri3(Display *dpy) 
{ 
    Window win = DefaultRootWindow(dpy); 
    Pixmap pixmap; 
    Window root; 
    unsigned int width, height; 
    unsigned border, depth; 
    unsigned stride, size; 
    int x, y, ret = 1; 
    int device, handle; 
    int bpp; 

    device = dri3_open(dpy); 
    if (device < 0) 
      return 0; 

    if (!is_intel(device)) 
      return 0; 

    printf("Opened Intel DRI3 device\n"); 

    XGetGeometry(dpy, win, &root, &x, &y, 
       &width, &height, &border, &depth); 

    switch (depth) { 
    case 8: bpp = 8; break; 
    case 15: case 16: bpp = 16; break; 
    case 24: case 32: bpp = 32; break; 
    default: return 0; 
    } 

    stride = width * bpp/8; 
    size = PAGE_ALIGN(stride * height); 
    printf("Creating DRI3 %dx%d (source stride=%d, size=%d) for GTT\n", 
      width, height, stride, size); 

    pixmap = 0; 
    handle = gem_create(device, size); 
    if (handle) { 
      pixmap = dri3_create_pixmap(dpy, root, 
             width, height, depth, 
             gem_export(device, handle), bpp, stride, size); 
      gem_close(device, handle); 
    } 
    if (pixmap == 0) 
      goto fail; 

    xcb_present_pixmap(XGetXCBConnection(dpy), 
         win, pixmap, 
         0, /* sbc */ 
         0, /* valid */ 
         0, /* update */ 
         0, /* x_off */ 
         0, /* y_off */ 
         None, 
         None, /* wait fence */ 
         None, 
         XCB_PRESENT_OPTION_NONE, 
         0, /* target msc */ 
         0, /* divisor */ 
         0, /* remainder */ 
         0, NULL); 
    XFreePixmap(dpy, pixmap); 

    XSync(dpy, True); 
    if (_x_error_occurred) 
      goto fail; 

fail: 
    close(device); 
    return ret; 
}