screen->base.screen->resource_get_handle(screen->base.screen, NULL,
buffer->resource, &whandle,
- PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ);
+ PIPE_HANDLE_USAGE_EXPLICIT_FLUSH);
buffer->base.attachment = attachment;
buffer->base.name = whandle.handle;
drawable->textures[statt] =
screen->base.screen->resource_from_handle(screen->base.screen,
&templ, &whandle,
- PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ);
+ PIPE_HANDLE_USAGE_EXPLICIT_FLUSH);
assert(drawable->textures[statt]);
}
}
struct pipe_screen *pscreen = screen->base.screen;
__DRIimage *img;
struct pipe_resource templ;
- unsigned tex_usage;
+ unsigned tex_usage = 0;
enum pipe_format pf;
int i;
- tex_usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
-
pf = dri2_format_to_pipe_format (format);
if (pf == PIPE_FORMAT_NONE)
return NULL;
+ if (pscreen->is_format_supported(pscreen, pf, screen->target, 0, 0,
+ PIPE_BIND_RENDER_TARGET))
+ tex_usage |= PIPE_BIND_RENDER_TARGET;
+ if (pscreen->is_format_supported(pscreen, pf, screen->target, 0, 0,
+ PIPE_BIND_SAMPLER_VIEW))
+ tex_usage |= PIPE_BIND_SAMPLER_VIEW;
+
img = CALLOC_STRUCT(__DRIimageRec);
if (!img)
return NULL;
}
tex = pscreen->resource_from_handle(pscreen,
- &templ, &whandle[i], PIPE_HANDLE_USAGE_READ_WRITE);
+ &templ, &whandle[i], PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE);
if (!tex) {
pipe_resource_reference(&img->texture, NULL);
FREE(img);
unsigned usage;
if (image->use & __DRI_IMAGE_USE_BACKBUFFER)
- usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ;
+ usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
else
- usage = PIPE_HANDLE_USAGE_READ_WRITE;
+ usage = PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE;
memset(&whandle, 0, sizeof(whandle));
{
struct dri_screen *screen = dri_screen(_screen);
struct pipe_screen *pscreen = screen->base.screen;
- const unsigned bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
int i, j;
for (i = 0, j = 0; (i < ARRAY_SIZE(fourcc_formats)) &&
(j < max || max == 0); i++) {
+ enum pipe_format format = fourcc_to_pipe_format(fourcc_formats[i]);
+
/* The sRGB format is not a real FourCC as defined by drm_fourcc.h, so we
* must not leak it out to clients.
*/
if (fourcc_formats[i] == __DRI_IMAGE_FOURCC_SARGB8888)
continue;
- if (pscreen->is_format_supported(pscreen,
- fourcc_to_pipe_format(
- fourcc_formats[i]),
- screen->target,
- 0, 0, bind)) {
+ if (pscreen->is_format_supported(pscreen, format, screen->target, 0, 0,
+ PIPE_BIND_RENDER_TARGET) ||
+ pscreen->is_format_supported(pscreen, format, screen->target, 0, 0,
+ PIPE_BIND_SAMPLER_VIEW)) {
if (j < max)
formats[j] = fourcc_formats[i];
j++;
struct dri_screen *screen = dri_screen(_screen);
struct pipe_screen *pscreen = screen->base.screen;
enum pipe_format format = fourcc_to_pipe_format(fourcc);
- const unsigned usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
if (pscreen->query_dmabuf_modifiers != NULL &&
- pscreen->is_format_supported(pscreen, format, screen->target, 0, 0,
- usage)) {
+ (pscreen->is_format_supported(pscreen, format, screen->target, 0, 0,
+ PIPE_BIND_RENDER_TARGET) ||
+ pscreen->is_format_supported(pscreen, format, screen->target, 0, 0,
+ PIPE_BIND_SAMPLER_VIEW))) {
pscreen->query_dmabuf_modifiers(pscreen, format, max, modifiers,
external_only, count);
return true;
/* Get the handle. */
switch (in->access) {
- case MESA_GLINTEROP_ACCESS_READ_WRITE:
- usage = PIPE_HANDLE_USAGE_READ_WRITE;
- break;
case MESA_GLINTEROP_ACCESS_READ_ONLY:
- usage = PIPE_HANDLE_USAGE_READ;
+ usage = 0;
break;
+ case MESA_GLINTEROP_ACCESS_READ_WRITE:
case MESA_GLINTEROP_ACCESS_WRITE_ONLY:
- usage = PIPE_HANDLE_USAGE_WRITE;
+ usage = PIPE_HANDLE_USAGE_SHADER_WRITE;
break;
default:
usage = 0;