pixlib: pxDestroyPlanar()

git-svn-id: svn://kolibrios.org@6142 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2016-02-05 11:58:12 +00:00
parent 48b0ebd898
commit 98b9eb4616
5 changed files with 73 additions and 43 deletions

View File

@ -21,12 +21,6 @@ bitmap_t *pxCreateBitmap(uint32_t width, uint32_t height);
int pxDestroyBitmap(bitmap_t *bitmap);
planar_t* pxCreatePlanar(int name, int format,
uint32_t width, uint32_t height,
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
uint32_t offset2, uint32_t pitch2);
void *pxLockBitmap(bitmap_t *bitmap, uint32_t *pitch);
int pxResizeBitmap(bitmap_t *bitmap, uint32_t width, uint32_t height);
@ -34,6 +28,14 @@ int pxResizeBitmap(bitmap_t *bitmap, uint32_t width, uint32_t height);
int pxBlitBitmap(bitmap_t *bitmap, int dst_x, int dst_y,
uint32_t w, uint32_t h, int src_x, int src_y);
planar_t* pxCreatePlanar(int name, int format,
uint32_t width, uint32_t height,
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
uint32_t offset2, uint32_t pitch2);
int pxDestroyPlanar(planar_t *planar);
int pxBlitPlanar(planar_t *planar, int dst_x, int dst_y,
uint32_t w, uint32_t h, int src_x, int src_y);

View File

@ -18,6 +18,7 @@ struct pix_driver
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
uint32_t offset2, uint32_t pitch2);
int (*destroy_planar)(planar_t *planar);
int (*blit_planar)(planar_t *planar, int dst_x, int dst_y,
uint32_t w, uint32_t h, int src_x, int src_y);
};

View File

@ -156,6 +156,35 @@ int pxBlitBitmap(bitmap_t *bitmap, int dst_x, int dst_y,
w, h, src_x, src_y);
};
planar_t* pxCreatePlanar(int name, int format,
uint32_t width, uint32_t height,
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
uint32_t offset2, uint32_t pitch2)
{
if(driver->create_planar)
return driver->create_planar(name, format, width, height,
offset0, pitch0, offset1, pitch1,
offset2, pitch2);
else
return NULL;
};
int pxDestroyPlanar(planar_t *planar)
{
return driver->destroy_planar(planar);
};
int pxBlitPlanar(planar_t *planar, int dst_x, int dst_y,
uint32_t w, uint32_t h, int src_x, int src_y)
{
if(driver->blit_planar)
return driver->blit_planar(planar, dst_x, dst_y,
w, h, src_x, src_y);
else
return 0;
};
int pxCreateClient(int x, int y, uint32_t width, uint32_t height)
{
return driver->create_client(x, y, width, height);
@ -166,6 +195,7 @@ int pxResizeClient(int x, int y, uint32_t width, uint32_t height)
return driver->resize_client(x, y, width, height);
}
static struct pix_driver sw_driver =
{
0,
@ -176,9 +206,10 @@ static struct pix_driver sw_driver =
sw_blit,
sw_create_client,
sw_resize_client,
NULL,
NULL,
NULL
NULL, /* fini() */
NULL, /* create_planar() */
NULL, /* destroy_planar() */
NULL /* blit_planar() */
};
@ -256,32 +287,3 @@ void pxFini()
driver->fini();
};
planar_t* pxCreatePlanar(int name, int format,
uint32_t width, uint32_t height,
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
uint32_t offset2, uint32_t pitch2)
{
if(driver->create_planar)
return driver->create_planar(name, format, width, height,
offset0, pitch0, offset1, pitch1,
offset2, pitch2);
else
return NULL;
}
int pxBlitPlanar(planar_t *planar, int dst_x, int dst_y,
uint32_t w, uint32_t h, int src_x, int src_y)
{
if(driver->blit_planar)
return driver->blit_planar(planar, dst_x, dst_y,
w, h, src_x, src_y);
else
return 0;
};

View File

@ -615,6 +615,22 @@ err_0:
return NULL;
};
static int hw_destroy_planar(planar_t *planar)
{
glDeleteTextures(planar->num_planes, &planar->tex[0]);
if(planar->image[2] != NULL)
eglDestroyImageKHR(px->dpy, planar->image[2]);
if(planar->image[1] != NULL)
eglDestroyImageKHR(px->dpy, planar->image[1]);
if(planar->image[0] != NULL)
eglDestroyImageKHR(px->dpy, planar->image[0]);
if(planar->planar_image != NULL)
eglDestroyImageKHR(px->dpy, planar->planar_image);
free(planar);
return 0;
};
static planar_t* hw_create_planar(EGLint name, EGLint format, uint32_t width, uint32_t height,
uint32_t offset0, uint32_t pitch0,
uint32_t offset1, uint32_t pitch1,
@ -670,6 +686,7 @@ static planar_t* hw_create_planar(EGLint name, EGLint format, uint32_t width, ui
planar->width = width;
planar->height = height;
planar->name = name;
planar->num_planes = num_planes;
planar->planar_image = img;
planar->offset[0] = offset0;
@ -681,6 +698,8 @@ static planar_t* hw_create_planar(EGLint name, EGLint format, uint32_t width, ui
planar->pitch[2] = pitch2;
glGenTextures(num_planes, &planar->tex[0]);
if(glGetError() != GL_NO_ERROR)
goto err_0;
for(i = 0; i < num_planes; i++)
{
@ -692,19 +711,20 @@ static planar_t* hw_create_planar(EGLint name, EGLint format, uint32_t width, ui
image = eglCreateImageKHR(px->dpy, px->context,
EGL_WAYLAND_BUFFER_WL,(EGLClientBuffer)img, attr);
if(image == NULL)
goto err_1;
planar->image[i] = image;
glBindTexture(GL_TEXTURE_2D, planar->tex[i]);
if(glGetError() != GL_NO_ERROR)
{
goto fail;
goto err_1;
};
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
if(glGetError() != GL_NO_ERROR)
{
goto fail;
goto err_1;
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
@ -713,14 +733,16 @@ static planar_t* hw_create_planar(EGLint name, EGLint format, uint32_t width, ui
return planar;
err_1:
hw_destroy_planar(planar);
return NULL;
err_0:
free(planar);
fail:
return NULL;
}
static int hw_destroy_bitmap(bitmap_t * bitmap)
{
struct drm_gem_close close;
@ -731,6 +753,7 @@ static int hw_destroy_bitmap(bitmap_t * bitmap)
close.handle = bitmap->handle;
drm_ioctl(px->fd, DRM_IOCTL_GEM_CLOSE, &close);
free(bitmap);
return 0;
};
static void *hw_lock_bitmap(bitmap_t *bitmap, uint32_t *pitch)
@ -1015,6 +1038,7 @@ static struct pix_driver gl_driver =
hw_resize_client,
hw_fini,
hw_create_planar,
hw_destroy_planar,
hw_blit_planar
};

View File

@ -87,6 +87,7 @@ struct planar
uint32_t width;
uint32_t height;
GLuint name;
int num_planes;
EGLImageKHR planar_image;
EGLImageKHR image[3];
GLuint offset[3];