diff options
Diffstat (limited to 'src/gallium/drivers/identity')
| -rw-r--r-- | src/gallium/drivers/identity/id_objects.c | 39 | ||||
| -rw-r--r-- | src/gallium/drivers/identity/id_objects.h | 25 | ||||
| -rw-r--r-- | src/gallium/drivers/identity/id_public.h | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/identity/id_screen.c | 33 | 
4 files changed, 98 insertions, 1 deletions
| diff --git a/src/gallium/drivers/identity/id_objects.c b/src/gallium/drivers/identity/id_objects.c index e893e59940..bc9bc7121d 100644 --- a/src/gallium/drivers/identity/id_objects.c +++ b/src/gallium/drivers/identity/id_objects.c @@ -180,3 +180,42 @@ identity_transfer_destroy(struct identity_transfer *id_transfer)     screen->tex_transfer_destroy(id_transfer->transfer);     FREE(id_transfer);  } + +struct pipe_video_surface * +identity_video_surface_create(struct identity_screen *id_screen, +                              struct pipe_video_surface *video_surface) +{ +   struct identity_video_surface *id_video_surface; + +   if (!video_surface) { +      goto error; +   } + +   assert(video_surface->screen == id_screen->screen); + +   id_video_surface = CALLOC_STRUCT(identity_video_surface); +   if (!id_video_surface) { +      goto error; +   } + +   memcpy(&id_video_surface->base, +          video_surface, +          sizeof(struct pipe_video_surface)); + +   pipe_reference_init(&id_video_surface->base.reference, 1); +   id_video_surface->base.screen = &id_screen->base; +   id_video_surface->video_surface = video_surface; + +   return &id_video_surface->base; + +error: +   pipe_video_surface_reference(&video_surface, NULL); +   return NULL; +} + +void +identity_video_surface_destroy(struct identity_video_surface *id_video_surface) +{ +   pipe_video_surface_reference(&id_video_surface->video_surface, NULL); +   FREE(id_video_surface); +} diff --git a/src/gallium/drivers/identity/id_objects.h b/src/gallium/drivers/identity/id_objects.h index ce58faa3c7..77cc719079 100644 --- a/src/gallium/drivers/identity/id_objects.h +++ b/src/gallium/drivers/identity/id_objects.h @@ -31,6 +31,7 @@  #include "pipe/p_compiler.h"  #include "pipe/p_state.h" +#include "pipe/p_video_state.h"  #include "id_screen.h" @@ -67,6 +68,14 @@ struct identity_transfer  }; +struct identity_video_surface +{ +   struct pipe_video_surface base; + +   struct pipe_video_surface *video_surface; +}; + +  static INLINE struct identity_buffer *  identity_buffer(struct pipe_buffer *_buffer)  { @@ -103,6 +112,15 @@ identity_transfer(struct pipe_transfer *_transfer)     return (struct identity_transfer *)_transfer;  } +static INLINE struct identity_video_surface * +identity_video_surface(struct pipe_video_surface *_video_surface) +{ +   if (!_video_surface) { +      return NULL; +   } +   (void)identity_screen(_video_surface->screen); +   return (struct identity_video_surface *)_video_surface; +}  static INLINE struct pipe_buffer *  identity_buffer_unwrap(struct pipe_buffer *_buffer) @@ -165,5 +183,12 @@ identity_transfer_create(struct identity_texture *id_texture,  void  identity_transfer_destroy(struct identity_transfer *id_transfer); +struct pipe_video_surface * +identity_video_surface_create(struct identity_screen *id_screen, +                              struct pipe_video_surface *video_surface); + +void +identity_video_surface_destroy(struct identity_video_surface *id_video_surface); +  #endif /* ID_OBJECTS_H */ diff --git a/src/gallium/drivers/identity/id_public.h b/src/gallium/drivers/identity/id_public.h index cac14cfd60..3d2862eaa0 100644 --- a/src/gallium/drivers/identity/id_public.h +++ b/src/gallium/drivers/identity/id_public.h @@ -37,4 +37,4 @@ identity_screen_create(struct pipe_screen *screen);  struct pipe_context *  identity_context_create(struct pipe_screen *screen, struct pipe_context *pipe); -#endif /* PT_PUBLIC_H */ +#endif /* ID_PUBLIC_H */ diff --git a/src/gallium/drivers/identity/id_screen.c b/src/gallium/drivers/identity/id_screen.c index 26439637d0..53eae3ef54 100644 --- a/src/gallium/drivers/identity/id_screen.c +++ b/src/gallium/drivers/identity/id_screen.c @@ -379,6 +379,33 @@ identity_screen_buffer_destroy(struct pipe_buffer *_buffer)     identity_buffer_destroy(identity_buffer(_buffer));  } +static struct pipe_video_surface * +identity_screen_video_surface_create(struct pipe_screen *_screen, +                                     enum pipe_video_chroma_format chroma_format, +                                     unsigned width, +                                     unsigned height) +{ +   struct identity_screen *id_screen = identity_screen(_screen); +   struct pipe_screen *screen = id_screen->screen; +   struct pipe_video_surface *result; + +   result = screen->video_surface_create(screen, +                                         chroma_format, +                                         width, +                                         height); + +   if (result) { +      return identity_video_surface_create(id_screen, result); +   } +   return NULL; +} + +static void +identity_screen_video_surface_destroy(struct pipe_video_surface *_vsfc) +{ +   identity_video_surface_destroy(identity_video_surface(_vsfc)); +} +  static void  identity_screen_flush_frontbuffer(struct pipe_screen *_screen,                                    struct pipe_surface *_surface, @@ -472,6 +499,12 @@ identity_screen_create(struct pipe_screen *screen)     if (screen->buffer_unmap)        id_screen->base.buffer_unmap = identity_screen_buffer_unmap;     id_screen->base.buffer_destroy = identity_screen_buffer_destroy; +   if (screen->video_surface_create) { +      id_screen->base.video_surface_create = identity_screen_video_surface_create; +   } +   if (screen->video_surface_destroy) { +      id_screen->base.video_surface_destroy = identity_screen_video_surface_destroy; +   }     id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer;     id_screen->base.fence_reference = identity_screen_fence_reference;     id_screen->base.fence_signalled = identity_screen_fence_signalled; | 
