Re: [Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode

2016-06-15 Thread Julien Isorce
On 15 June 2016 at 14:07, Christian König  wrote:

> Please split that up into multiple parts. E.g. adding the config
> structure, new image format support etc..
>
> Julien, can you take a look as well if you have time and work a bit with
> Boyuan to get this cleaned up?
>

Hi,
I'll be happy to do that, I can find some time next week I think.
Cheers
Julien


>
> Thanks in advance,
> Christian.
>
>
> Am 14.06.2016 um 22:14 schrieb Boyuan Zhang:
>
>> Signed-off-by: Boyuan Zhang 
>> ---
>>   src/gallium/state_trackers/va/buffer.c |   6 ++
>>   src/gallium/state_trackers/va/config.c | 104 +++---
>>   src/gallium/state_trackers/va/context.c|  72 -
>>   src/gallium/state_trackers/va/image.c  | 126 +++---
>>   src/gallium/state_trackers/va/picture.c| 165
>> -
>>   src/gallium/state_trackers/va/surface.c|  16 ++-
>>   src/gallium/state_trackers/va/va_private.h |   9 ++
>>   7 files changed, 441 insertions(+), 57 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/va/buffer.c
>> b/src/gallium/state_trackers/va/buffer.c
>> index 7d3167b..dfcebbe 100644
>> --- a/src/gallium/state_trackers/va/buffer.c
>> +++ b/src/gallium/state_trackers/va/buffer.c
>> @@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID
>> buf_id, void **pbuff)
>> if (!buf->derived_surface.transfer || !*pbuff)
>>return VA_STATUS_ERROR_INVALID_BUFFER;
>>   +  if (buf->type == VAEncCodedBufferType) {
>> + ((VACodedBufferSegment*)buf->data)->buf = *pbuff;
>> + ((VACodedBufferSegment*)buf->data)->size = buf->coded_size;
>> + ((VACodedBufferSegment*)buf->data)->next = NULL;
>> + *pbuff = buf->data;
>> +  }
>>  } else {
>> pipe_mutex_unlock(drv->mutex);
>> *pbuff = buf->data;
>> diff --git a/src/gallium/state_trackers/va/config.c
>> b/src/gallium/state_trackers/va/config.c
>> index 9ca0aa8..04d214d 100644
>> --- a/src/gallium/state_trackers/va/config.c
>> +++ b/src/gallium/state_trackers/va/config.c
>> @@ -34,6 +34,8 @@
>> #include "va_private.h"
>>   +#include "util/u_handle_table.h"
>> +
>>   DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false)
>> VAStatus
>> @@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx,
>> VAProfile profile,
>>   {
>>  struct pipe_screen *pscreen;
>>  enum pipe_video_profile p;
>> +   int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
>>if (!ctx)
>> return VA_STATUS_ERROR_INVALID_CONTEXT;
>> @@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx,
>> VAProfile profile,
>> return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
>>pscreen = VL_VA_PSCREEN(ctx);
>> -   if (!pscreen->get_video_param(pscreen, p,
>> PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED))
>> -  return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
>> -
>> -   entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
>> +   if (pscreen->get_video_param(pscreen, p,
>> PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) {
>> +  entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
>> +  va_status = VA_STATUS_SUCCESS;
>> +   }
>> +   if (pscreen->get_video_param(pscreen, p,
>> PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED) &&
>> +   p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) {
>> +  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice;
>> +  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture;
>> +  va_status = VA_STATUS_SUCCESS;
>> +   }
>>   -   return VA_STATUS_SUCCESS;
>> +   return va_status;
>>   }
>> VAStatus
>> @@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx,
>> VAProfile profile, VAEntrypoint en
>>value = VA_RT_FORMAT_YUV420;
>>break;
>> case VAConfigAttribRateControl:
>> - value = VA_RC_NONE;
>> + value = VA_RC_CQP | VA_RC_CBR;
>>break;
>> default:
>>value = VA_ATTRIB_NOT_SUPPORTED;
>> @@ -128,14 +137,27 @@ VAStatus
>>   vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint
>> entrypoint,
>>VAConfigAttrib *attrib_list, int num_attribs,
>> VAConfigID *config_id)
>>   {
>> +   vlVaDriver *drv;
>> +   vlVaConfig *config;
>>  struct pipe_screen *pscreen;
>>  enum pipe_video_profile p;
>>if (!ctx)
>> return VA_STATUS_ERROR_INVALID_CONTEXT;
>>   +   drv = VL_VA_DRIVER(ctx);
>> +
>> +   if (!drv)
>> +  return VA_STATUS_ERROR_INVALID_CONTEXT;
>> +
>> +   config = CALLOC(1, sizeof(vlVaConfig));
>> +   if (!config)
>> +  return VA_STATUS_ERROR_ALLOCATION_FAILED;
>> +
>>  if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc)
>> {
>> -  *config_id = PIPE_VIDEO_PROFILE_UNKNOWN;
>> +  config->entrypoint = VAEntrypointVideoProc;
>> +  config->profile = PIPE_VIDEO_PROFILE_UNKNOWN;
>> +  *config_id = handle_table_add(drv->htab, config);
>>  

Re: [Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode

2016-06-15 Thread Christian König
Please split that up into multiple parts. E.g. adding the config 
structure, new image format support etc..


Julien, can you take a look as well if you have time and work a bit with 
Boyuan to get this cleaned up?


Thanks in advance,
Christian.

Am 14.06.2016 um 22:14 schrieb Boyuan Zhang:

Signed-off-by: Boyuan Zhang 
---
  src/gallium/state_trackers/va/buffer.c |   6 ++
  src/gallium/state_trackers/va/config.c | 104 +++---
  src/gallium/state_trackers/va/context.c|  72 -
  src/gallium/state_trackers/va/image.c  | 126 +++---
  src/gallium/state_trackers/va/picture.c| 165 -
  src/gallium/state_trackers/va/surface.c|  16 ++-
  src/gallium/state_trackers/va/va_private.h |   9 ++
  7 files changed, 441 insertions(+), 57 deletions(-)

diff --git a/src/gallium/state_trackers/va/buffer.c 
b/src/gallium/state_trackers/va/buffer.c
index 7d3167b..dfcebbe 100644
--- a/src/gallium/state_trackers/va/buffer.c
+++ b/src/gallium/state_trackers/va/buffer.c
@@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, 
void **pbuff)
if (!buf->derived_surface.transfer || !*pbuff)
   return VA_STATUS_ERROR_INVALID_BUFFER;
  
+  if (buf->type == VAEncCodedBufferType) {

+ ((VACodedBufferSegment*)buf->data)->buf = *pbuff;
+ ((VACodedBufferSegment*)buf->data)->size = buf->coded_size;
+ ((VACodedBufferSegment*)buf->data)->next = NULL;
+ *pbuff = buf->data;
+  }
 } else {
pipe_mutex_unlock(drv->mutex);
*pbuff = buf->data;
diff --git a/src/gallium/state_trackers/va/config.c 
b/src/gallium/state_trackers/va/config.c
index 9ca0aa8..04d214d 100644
--- a/src/gallium/state_trackers/va/config.c
+++ b/src/gallium/state_trackers/va/config.c
@@ -34,6 +34,8 @@
  
  #include "va_private.h"
  
+#include "util/u_handle_table.h"

+
  DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false)
  
  VAStatus

@@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile 
profile,
  {
 struct pipe_screen *pscreen;
 enum pipe_video_profile p;
+   int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
  
 if (!ctx)

return VA_STATUS_ERROR_INVALID_CONTEXT;
@@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile 
profile,
return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
  
 pscreen = VL_VA_PSCREEN(ctx);

-   if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED))
-  return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
-
-   entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
+   if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED)) {
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
+  va_status = VA_STATUS_SUCCESS;
+   }
+   if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, 
PIPE_VIDEO_CAP_SUPPORTED) &&
+   p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) {
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice;
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture;
+  va_status = VA_STATUS_SUCCESS;
+   }
  
-   return VA_STATUS_SUCCESS;

+   return va_status;
  }
  
  VAStatus

@@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile 
profile, VAEntrypoint en
   value = VA_RT_FORMAT_YUV420;
   break;
case VAConfigAttribRateControl:
- value = VA_RC_NONE;
+ value = VA_RC_CQP | VA_RC_CBR;
   break;
default:
   value = VA_ATTRIB_NOT_SUPPORTED;
@@ -128,14 +137,27 @@ VAStatus
  vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint 
entrypoint,
   VAConfigAttrib *attrib_list, int num_attribs, VAConfigID 
*config_id)
  {
+   vlVaDriver *drv;
+   vlVaConfig *config;
 struct pipe_screen *pscreen;
 enum pipe_video_profile p;
  
 if (!ctx)

return VA_STATUS_ERROR_INVALID_CONTEXT;
  
+   drv = VL_VA_DRIVER(ctx);

+
+   if (!drv)
+  return VA_STATUS_ERROR_INVALID_CONTEXT;
+
+   config = CALLOC(1, sizeof(vlVaConfig));
+   if (!config)
+  return VA_STATUS_ERROR_ALLOCATION_FAILED;
+
 if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc) {
-  *config_id = PIPE_VIDEO_PROFILE_UNKNOWN;
+  config->entrypoint = VAEntrypointVideoProc;
+  config->profile = PIPE_VIDEO_PROFILE_UNKNOWN;
+  *config_id = handle_table_add(drv->htab, config);
return VA_STATUS_SUCCESS;
 }
  
@@ -144,13 +166,36 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin

return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
  
 pscreen = VL_VA_PSCREEN(ctx);

-   if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED))
-  return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
-
-   if (entrypoint != VAEntrypointVLD)
+   if (entrypoint == VA

[Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode

2016-06-14 Thread Boyuan Zhang
Signed-off-by: Boyuan Zhang 
---
 src/gallium/state_trackers/va/buffer.c |   6 ++
 src/gallium/state_trackers/va/config.c | 104 +++---
 src/gallium/state_trackers/va/context.c|  72 -
 src/gallium/state_trackers/va/image.c  | 126 +++---
 src/gallium/state_trackers/va/picture.c| 165 -
 src/gallium/state_trackers/va/surface.c|  16 ++-
 src/gallium/state_trackers/va/va_private.h |   9 ++
 7 files changed, 441 insertions(+), 57 deletions(-)

diff --git a/src/gallium/state_trackers/va/buffer.c 
b/src/gallium/state_trackers/va/buffer.c
index 7d3167b..dfcebbe 100644
--- a/src/gallium/state_trackers/va/buffer.c
+++ b/src/gallium/state_trackers/va/buffer.c
@@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, 
void **pbuff)
   if (!buf->derived_surface.transfer || !*pbuff)
  return VA_STATUS_ERROR_INVALID_BUFFER;
 
+  if (buf->type == VAEncCodedBufferType) {
+ ((VACodedBufferSegment*)buf->data)->buf = *pbuff;
+ ((VACodedBufferSegment*)buf->data)->size = buf->coded_size;
+ ((VACodedBufferSegment*)buf->data)->next = NULL;
+ *pbuff = buf->data;
+  }
} else {
   pipe_mutex_unlock(drv->mutex);
   *pbuff = buf->data;
diff --git a/src/gallium/state_trackers/va/config.c 
b/src/gallium/state_trackers/va/config.c
index 9ca0aa8..04d214d 100644
--- a/src/gallium/state_trackers/va/config.c
+++ b/src/gallium/state_trackers/va/config.c
@@ -34,6 +34,8 @@
 
 #include "va_private.h"
 
+#include "util/u_handle_table.h"
+
 DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false)
 
 VAStatus
@@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile 
profile,
 {
struct pipe_screen *pscreen;
enum pipe_video_profile p;
+   int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
 
if (!ctx)
   return VA_STATUS_ERROR_INVALID_CONTEXT;
@@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile 
profile,
   return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
 
pscreen = VL_VA_PSCREEN(ctx);
-   if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED))
-  return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
-
-   entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
+   if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED)) {
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
+  va_status = VA_STATUS_SUCCESS;
+   }
+   if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, 
PIPE_VIDEO_CAP_SUPPORTED) &&
+   p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) {
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice;
+  entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture;
+  va_status = VA_STATUS_SUCCESS;
+   }
 
-   return VA_STATUS_SUCCESS;
+   return va_status;
 }
 
 VAStatus
@@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile 
profile, VAEntrypoint en
  value = VA_RT_FORMAT_YUV420;
  break;
   case VAConfigAttribRateControl:
- value = VA_RC_NONE;
+ value = VA_RC_CQP | VA_RC_CBR;
  break;
   default:
  value = VA_ATTRIB_NOT_SUPPORTED;
@@ -128,14 +137,27 @@ VAStatus
 vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint 
entrypoint,
  VAConfigAttrib *attrib_list, int num_attribs, VAConfigID 
*config_id)
 {
+   vlVaDriver *drv;
+   vlVaConfig *config;
struct pipe_screen *pscreen;
enum pipe_video_profile p;
 
if (!ctx)
   return VA_STATUS_ERROR_INVALID_CONTEXT;
 
+   drv = VL_VA_DRIVER(ctx);
+
+   if (!drv)
+  return VA_STATUS_ERROR_INVALID_CONTEXT;
+
+   config = CALLOC(1, sizeof(vlVaConfig));
+   if (!config)
+  return VA_STATUS_ERROR_ALLOCATION_FAILED;
+
if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc) {
-  *config_id = PIPE_VIDEO_PROFILE_UNKNOWN;
+  config->entrypoint = VAEntrypointVideoProc;
+  config->profile = PIPE_VIDEO_PROFILE_UNKNOWN;
+  *config_id = handle_table_add(drv->htab, config);
   return VA_STATUS_SUCCESS;
}
 
@@ -144,13 +166,36 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, 
VAEntrypoint entrypoin
   return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
 
pscreen = VL_VA_PSCREEN(ctx);
-   if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 
PIPE_VIDEO_CAP_SUPPORTED))
-  return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
-
-   if (entrypoint != VAEntrypointVLD)
+   if (entrypoint == VAEntrypointVLD) {
+  if (!pscreen->get_video_param(pscreen, p, 
PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED))
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+   }
+   else if (entrypoint == VAEntrypointEncSlice) {
+  if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, 
PIPE_VIDEO_CAP_SUPPORTED))
+ retu