Commit 219fbd9c authored by Hirokazu Honda's avatar Hirokazu Honda Committed by Commit Bot

media/gpu/vaapi: Specify the surface usage hint in vaCreateSurface()

This specifies a surface usage hint in vaCreateSurfaces(). i965 driver
doesn't change a behavior by this change. The alignment of a height of
a created surface is changed to 64 to 1 with iHD driver. Thanks to this,
the drivers' alignment rule is or equal to weaker than the minigbm
alignment rule on encoding.

Bug: 1006151
Test: VEA unittest, VDA unittest, JDA unittest
Change-Id: I4b0d0bd58c7c7f39151bc91b164b1f5aaf7c63bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1816479
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: default avatarMiguel Casas <mcasas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#700108}
parent d687326d
...@@ -156,7 +156,8 @@ void VaapiJpegEncodeAccelerator::Encoder::EncodeWithDmaBufTask( ...@@ -156,7 +156,8 @@ void VaapiJpegEncodeAccelerator::Encoder::EncodeWithDmaBufTask(
input_size_ = gfx::Size(); input_size_ = gfx::Size();
std::vector<VASurfaceID> va_surfaces; std::vector<VASurfaceID> va_surfaces;
if (!vaapi_wrapper_->CreateContextAndSurfaces(va_format, input_size, 1, if (!vaapi_wrapper_->CreateContextAndSurfaces(
va_format, input_size, VaapiWrapper::SurfaceUsageHint::kGeneric, 1,
&va_surfaces)) { &va_surfaces)) {
VLOGF(1) << "Failed to create VA surface"; VLOGF(1) << "Failed to create VA surface";
notify_error_cb_.Run(task_id, PLATFORM_FAILURE); notify_error_cb_.Run(task_id, PLATFORM_FAILURE);
...@@ -308,7 +309,8 @@ void VaapiJpegEncodeAccelerator::Encoder::EncodeTask( ...@@ -308,7 +309,8 @@ void VaapiJpegEncodeAccelerator::Encoder::EncodeTask(
std::vector<VASurfaceID> va_surfaces; std::vector<VASurfaceID> va_surfaces;
if (!vaapi_wrapper_->CreateContextAndSurfaces( if (!vaapi_wrapper_->CreateContextAndSurfaces(
VA_RT_FORMAT_YUV420, input_size, 1, &va_surfaces)) { VA_RT_FORMAT_YUV420, input_size,
VaapiWrapper::SurfaceUsageHint::kGeneric, 1, &va_surfaces)) {
VLOGF(1) << "Failed to create VA surface"; VLOGF(1) << "Failed to create VA surface";
notify_error_cb_.Run(task_id, PLATFORM_FAILURE); notify_error_cb_.Run(task_id, PLATFORM_FAILURE);
return; return;
......
...@@ -56,7 +56,8 @@ TEST_F(VaapiUtilsTest, ScopedVAImage) { ...@@ -56,7 +56,8 @@ TEST_F(VaapiUtilsTest, ScopedVAImage) {
std::vector<VASurfaceID> va_surfaces; std::vector<VASurfaceID> va_surfaces;
const gfx::Size coded_size(64, 64); const gfx::Size coded_size(64, 64);
ASSERT_TRUE(vaapi_wrapper_->CreateContextAndSurfaces( ASSERT_TRUE(vaapi_wrapper_->CreateContextAndSurfaces(
VA_RT_FORMAT_YUV420, coded_size, 1, &va_surfaces)); VA_RT_FORMAT_YUV420, coded_size, VaapiWrapper::SurfaceUsageHint::kGeneric,
1, &va_surfaces));
ASSERT_EQ(va_surfaces.size(), 1u); ASSERT_EQ(va_surfaces.size(), 1u);
std::unique_ptr<ScopedVAImage> scoped_image; std::unique_ptr<ScopedVAImage> scoped_image;
......
...@@ -700,11 +700,12 @@ void VaapiVideoDecodeAccelerator::AssignPictureBuffers( ...@@ -700,11 +700,12 @@ void VaapiVideoDecodeAccelerator::AssignPictureBuffers(
: pictures_.size(); : pictures_.size();
CHECK_NE(requested_num_surfaces, 0u); CHECK_NE(requested_num_surfaces, 0u);
va_surface_ids.clear(); va_surface_ids.clear();
RETURN_AND_NOTIFY_ON_FAILURE(vaapi_wrapper_->CreateContextAndSurfaces( RETURN_AND_NOTIFY_ON_FAILURE(
vaapi_wrapper_->CreateContextAndSurfaces(
va_surface_format_, requested_pic_size_, va_surface_format_, requested_pic_size_,
VaapiWrapper::SurfaceUsageHint::kVideoDecoder,
requested_num_surfaces, &va_surface_ids), requested_num_surfaces, &va_surface_ids),
"Failed creating VA Surfaces", "Failed creating VA Surfaces", PLATFORM_FAILURE, );
PLATFORM_FAILURE, );
} }
available_va_surfaces_.assign(va_surface_ids.begin(), va_surface_ids.end()); available_va_surfaces_.assign(va_surface_ids.begin(), va_surface_ids.end());
......
...@@ -68,9 +68,12 @@ class MockAcceleratedVideoDecoder : public AcceleratedVideoDecoder { ...@@ -68,9 +68,12 @@ class MockAcceleratedVideoDecoder : public AcceleratedVideoDecoder {
class MockVaapiWrapper : public VaapiWrapper { class MockVaapiWrapper : public VaapiWrapper {
public: public:
MockVaapiWrapper() = default; MockVaapiWrapper() = default;
MOCK_METHOD4( MOCK_METHOD5(CreateContextAndSurfaces,
CreateContextAndSurfaces, bool(unsigned int,
bool(unsigned int, const gfx::Size&, size_t, std::vector<VASurfaceID>*)); const gfx::Size&,
SurfaceUsageHint,
size_t,
std::vector<VASurfaceID>*));
MOCK_METHOD1(CreateContext, bool(const gfx::Size&)); MOCK_METHOD1(CreateContext, bool(const gfx::Size&));
MOCK_METHOD1(DestroyContextAndSurfaces, void(std::vector<VASurfaceID>)); MOCK_METHOD1(DestroyContextAndSurfaces, void(std::vector<VASurfaceID>));
...@@ -294,9 +297,11 @@ class VaapiVideoDecodeAcceleratorTest : public TestWithParam<TestParams>, ...@@ -294,9 +297,11 @@ class VaapiVideoDecodeAcceleratorTest : public TestWithParam<TestParams>,
const size_t kNumReferenceFrames = 1 + num_pictures / 2; const size_t kNumReferenceFrames = 1 + num_pictures / 2;
EXPECT_CALL( EXPECT_CALL(
*mock_vaapi_wrapper_, *mock_vaapi_wrapper_,
CreateContextAndSurfaces(_, picture_size, kNumReferenceFrames, _)) CreateContextAndSurfaces(
_, picture_size, VaapiWrapper::SurfaceUsageHint::kVideoDecoder,
kNumReferenceFrames, _))
.WillOnce(DoAll( .WillOnce(DoAll(
WithArg<3>(Invoke([kNumReferenceFrames]( WithArg<4>(Invoke([kNumReferenceFrames](
std::vector<VASurfaceID>* va_surface_ids) { std::vector<VASurfaceID>* va_surface_ids) {
va_surface_ids->resize(kNumReferenceFrames); va_surface_ids->resize(kNumReferenceFrames);
})), })),
......
...@@ -369,6 +369,7 @@ void VaapiVideoEncodeAccelerator::InitializeTask(const Config& config) { ...@@ -369,6 +369,7 @@ void VaapiVideoEncodeAccelerator::InitializeTask(const Config& config) {
if (!vaapi_wrapper_->CreateContextAndSurfaces( if (!vaapi_wrapper_->CreateContextAndSurfaces(
kVaSurfaceFormat, coded_size_, kVaSurfaceFormat, coded_size_,
VaapiWrapper::SurfaceUsageHint::kVideoEncoder,
(num_frames_in_flight + 1) * va_surfaces_per_video_frame_, (num_frames_in_flight + 1) * va_surfaces_per_video_frame_,
&available_va_surface_ids_)) { &available_va_surface_ids_)) {
NOTIFY_ERROR(kPlatformFailureError, "Failed creating VASurfaces"); NOTIFY_ERROR(kPlatformFailureError, "Failed creating VASurfaces");
......
...@@ -1331,6 +1331,7 @@ uint32_t VaapiWrapper::BufferFormatToVARTFormat(gfx::BufferFormat fmt) { ...@@ -1331,6 +1331,7 @@ uint32_t VaapiWrapper::BufferFormatToVARTFormat(gfx::BufferFormat fmt) {
bool VaapiWrapper::CreateContextAndSurfaces( bool VaapiWrapper::CreateContextAndSurfaces(
unsigned int va_format, unsigned int va_format,
const gfx::Size& size, const gfx::Size& size,
SurfaceUsageHint surface_usage_hint,
size_t num_surfaces, size_t num_surfaces,
std::vector<VASurfaceID>* va_surfaces) { std::vector<VASurfaceID>* va_surfaces) {
DVLOG(2) << "Creating " << num_surfaces << " surfaces"; DVLOG(2) << "Creating " << num_surfaces << " surfaces";
...@@ -1342,8 +1343,10 @@ bool VaapiWrapper::CreateContextAndSurfaces( ...@@ -1342,8 +1343,10 @@ bool VaapiWrapper::CreateContextAndSurfaces(
return false; return false;
} }
if (!CreateSurfaces(va_format, size, num_surfaces, va_surfaces)) if (!CreateSurfaces(va_format, size, surface_usage_hint, num_surfaces,
va_surfaces)) {
return false; return false;
}
const bool success = CreateContext(size); const bool success = CreateContext(size);
if (!success) if (!success)
...@@ -2076,6 +2079,7 @@ void VaapiWrapper::DestroyContext() { ...@@ -2076,6 +2079,7 @@ void VaapiWrapper::DestroyContext() {
bool VaapiWrapper::CreateSurfaces(unsigned int va_format, bool VaapiWrapper::CreateSurfaces(unsigned int va_format,
const gfx::Size& size, const gfx::Size& size,
SurfaceUsageHint usage_hint,
size_t num_surfaces, size_t num_surfaces,
std::vector<VASurfaceID>* va_surfaces) { std::vector<VASurfaceID>* va_surfaces) {
DVLOG(2) << "Creating " << num_surfaces << " " << size.ToString() DVLOG(2) << "Creating " << num_surfaces << " " << size.ToString()
...@@ -2084,13 +2088,29 @@ bool VaapiWrapper::CreateSurfaces(unsigned int va_format, ...@@ -2084,13 +2088,29 @@ bool VaapiWrapper::CreateSurfaces(unsigned int va_format,
DCHECK(va_surfaces->empty()); DCHECK(va_surfaces->empty());
va_surfaces->resize(num_surfaces); va_surfaces->resize(num_surfaces);
VASurfaceAttrib attribute{};
attribute.type = VASurfaceAttribUsageHint;
attribute.flags = VA_SURFACE_ATTRIB_SETTABLE;
attribute.value.type = VAGenericValueTypeInteger;
switch (usage_hint) {
case SurfaceUsageHint::kVideoDecoder:
attribute.value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_DECODER;
break;
case SurfaceUsageHint::kVideoEncoder:
attribute.value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER;
break;
case SurfaceUsageHint::kGeneric:
attribute.value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC;
break;
}
VAStatus va_res; VAStatus va_res;
{ {
base::AutoLock auto_lock(*va_lock_); base::AutoLock auto_lock(*va_lock_);
va_res = vaCreateSurfaces(va_display_, va_format, va_res = vaCreateSurfaces(
base::checked_cast<unsigned int>(size.width()), va_display_, va_format, base::checked_cast<unsigned int>(size.width()),
base::checked_cast<unsigned int>(size.height()), base::checked_cast<unsigned int>(size.height()), va_surfaces->data(),
va_surfaces->data(), num_surfaces, NULL, 0); num_surfaces, &attribute, 1u);
} }
VA_LOG_ON_ERROR(va_res, "vaCreateSurfaces failed"); VA_LOG_ON_ERROR(va_res, "vaCreateSurfaces failed");
return va_res == VA_STATUS_SUCCESS; return va_res == VA_STATUS_SUCCESS;
......
...@@ -94,6 +94,13 @@ class MEDIA_GPU_EXPORT VaapiWrapper ...@@ -94,6 +94,13 @@ class MEDIA_GPU_EXPORT VaapiWrapper
kCodecModeMax, kCodecModeMax,
}; };
// This is enum associated with VASurfaceAttribUsageHint.
enum class SurfaceUsageHint : uint8_t {
kVideoDecoder,
kVideoEncoder,
kGeneric,
};
using InternalFormats = struct { using InternalFormats = struct {
bool yuv420 : 1; bool yuv420 : 1;
bool yuv422 : 1; bool yuv422 : 1;
...@@ -189,13 +196,15 @@ class MEDIA_GPU_EXPORT VaapiWrapper ...@@ -189,13 +196,15 @@ class MEDIA_GPU_EXPORT VaapiWrapper
static uint32_t BufferFormatToVARTFormat(gfx::BufferFormat fmt); static uint32_t BufferFormatToVARTFormat(gfx::BufferFormat fmt);
// Creates |num_surfaces| VASurfaceIDs of |va_format| and |size| and, if // Creates |num_surfaces| VASurfaceIDs of |va_format|, |size| and
// successful, creates a |va_context_id_| of the same size. Returns true if // |surface_usage_hint| and, if successful, creates a |va_context_id_| of the
// successful, with the created IDs in |va_surfaces|. The client is // same size. |surface_usage_hint| may affect an alignment and tiling of the
// responsible for destroying |va_surfaces| via DestroyContextAndSurfaces() to // created surface. Returns true if successful, with the created IDs in
// free the allocated surfaces. // |va_surfaces|. The client is responsible for destroying |va_surfaces| via
// DestroyContextAndSurfaces() to free the allocated surfaces.
virtual bool CreateContextAndSurfaces(unsigned int va_format, virtual bool CreateContextAndSurfaces(unsigned int va_format,
const gfx::Size& size, const gfx::Size& size,
SurfaceUsageHint surface_usage_hint,
size_t num_surfaces, size_t num_surfaces,
std::vector<VASurfaceID>* va_surfaces); std::vector<VASurfaceID>* va_surfaces);
...@@ -393,6 +402,7 @@ class MEDIA_GPU_EXPORT VaapiWrapper ...@@ -393,6 +402,7 @@ class MEDIA_GPU_EXPORT VaapiWrapper
// Fills |va_surfaces| and returns true if successful, or returns false. // Fills |va_surfaces| and returns true if successful, or returns false.
bool CreateSurfaces(unsigned int va_format, bool CreateSurfaces(unsigned int va_format,
const gfx::Size& size, const gfx::Size& size,
SurfaceUsageHint usage_hint,
size_t num_surfaces, size_t num_surfaces,
std::vector<VASurfaceID>* va_surfaces); std::vector<VASurfaceID>* va_surfaces);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment