Discussion:
[PATCH intel-driver 1/3] test: allow default surface param for create context
(too old to reply)
U. Artie Eoff
2016-10-11 19:21:44 UTC
Permalink
The driver does not require surfaces to create a context.
That is, i965_CreateContext can accept an empty render_targets
list. Thus, make Surfaces an optional parameter to
I965TestFixture::createContext so that simple tests don't
have to bother with Surfaces if they are irrelevant to
the test case.

Signed-off-by: U. Artie Eoff <***@intel.com>
---
test/i965_test_fixture.cpp | 5 +++--
test/i965_test_fixture.h | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/test/i965_test_fixture.cpp b/test/i965_test_fixture.cpp
index 8fd914209467..74403f875a56 100644
--- a/test/i965_test_fixture.cpp
+++ b/test/i965_test_fixture.cpp
@@ -83,12 +83,13 @@ void I965TestFixture::destroyConfig(VAConfigID id)
}

VAContextID I965TestFixture::createContext(
- VAConfigID config, int w, int h, int flags, Surfaces& targets)
+ VAConfigID config, int w, int h, int flags, const Surfaces& targets)
{
VAContextID id = VA_INVALID_ID;
EXPECT_STATUS(
i965_CreateContext(
- *this, config, w, h, flags, targets.data(), targets.size(), &id));
+ *this, config, w, h, flags,
+ const_cast<VASurfaceID*>(targets.data()), targets.size(), &id));
EXPECT_ID(id);

return id;
diff --git a/test/i965_test_fixture.h b/test/i965_test_fixture.h
index 9122d848e129..3fc11c34fa75 100644
--- a/test/i965_test_fixture.h
+++ b/test/i965_test_fixture.h
@@ -88,7 +88,8 @@ public:
* Convenience wrapper for i965_CreateContext. May generate a non-fatal
* test assertion failure.
*/
- VAContextID createContext(VAConfigID, int, int, int, Surfaces&);
+ VAContextID createContext(VAConfigID, int, int, int = 0,
+ const Surfaces& = Surfaces());

/**
* Convenience wrapper for i965_DestroyContext. May generate a non-fatal
--
2.4.11
U. Artie Eoff
2016-10-11 19:21:45 UTC
Permalink
Driver does not require config attributes to create a config.
Thus, allow I965TestFixture::createConfig to be called without
specifying ConfigAttribs.

Signed-off-by: U. Artie Eoff <***@intel.com>
---
test/i965_test_fixture.cpp | 5 +++--
test/i965_test_fixture.h | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/test/i965_test_fixture.cpp b/test/i965_test_fixture.cpp
index 74403f875a56..ac44ddfd5f02 100644
--- a/test/i965_test_fixture.cpp
+++ b/test/i965_test_fixture.cpp
@@ -66,12 +66,13 @@ void I965TestFixture::destroySurfaces(Surfaces& surfaces)
}

VAConfigID I965TestFixture::createConfig(
- VAProfile profile, VAEntrypoint entrypoint, ConfigAttribs& attribs)
+ VAProfile profile, VAEntrypoint entrypoint, const ConfigAttribs& attribs)
{
VAConfigID id = VA_INVALID_ID;
EXPECT_STATUS(
i965_CreateConfig(
- *this, profile, entrypoint, attribs.data(), attribs.size(), &id));
+ *this, profile, entrypoint,
+ const_cast<VAConfigAttrib*>(attribs.data()), attribs.size(), &id));
EXPECT_ID(id);

return id;
diff --git a/test/i965_test_fixture.h b/test/i965_test_fixture.h
index 3fc11c34fa75..02c1dbb2b8e8 100644
--- a/test/i965_test_fixture.h
+++ b/test/i965_test_fixture.h
@@ -76,7 +76,8 @@ public:
* Convenience wrapper for i965_CreateConfig. May generate a non-fatal
* test assertion failure.
*/
- VAConfigID createConfig(VAProfile, VAEntrypoint, ConfigAttribs&);
+ VAConfigID createConfig(VAProfile, VAEntrypoint,
+ const ConfigAttribs& = ConfigAttribs());

/**
* Convenience wrapper for i965_DestroyConfig. May generate a non-fatal
--
2.4.11
U. Artie Eoff
2016-10-11 19:21:46 UTC
Permalink
Add some simple avce context tests to verify various
encode context fields are appropriately configured.

Signed-off-by: U. Artie Eoff <***@intel.com>
---
test/Makefile.am | 3 +
test/i965_avce_context_test.cpp | 258 ++++++++++++++++++++++++++++++++++++++++
test/i965_avce_test_common.cpp | 85 +++++++++++++
test/i965_avce_test_common.h | 39 ++++++
test/i965_internal_decl.h | 1 +
5 files changed, 386 insertions(+)
create mode 100644 test/i965_avce_context_test.cpp
create mode 100644 test/i965_avce_test_common.cpp
create mode 100644 test/i965_avce_test_common.h

diff --git a/test/Makefile.am b/test/Makefile.am
index 08df3395a383..7a5437e71450 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST = \
# test_i965_drv_video
noinst_PROGRAMS = test_i965_drv_video
noinst_HEADERS = \
+ i965_avce_test_common.h \
i965_config_test.h \
i965_internal_decl.h \
i965_jpeg_test_data.h \
@@ -56,6 +57,8 @@ noinst_HEADERS = \
test_i965_drv_video_SOURCES = \
i965_avcd_config_test.cpp \
i965_avce_config_test.cpp \
+ i965_avce_context_test.cpp \
+ i965_avce_test_common.cpp \
i965_chipset_test.cpp \
i965_config_test.cpp \
i965_initialize_test.cpp \
diff --git a/test/i965_avce_context_test.cpp b/test/i965_avce_context_test.cpp
new file mode 100644
index 000000000000..4777c9e6a13f
--- /dev/null
+++ b/test/i965_avce_context_test.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_streamable.h"
+#include "i965_test_fixture.h"
+
+#include <map>
+#include <tuple>
+#include <vector>
+
+namespace AVC {
+namespace Encode {
+
+class AVCEContextTest
+ : public I965TestFixture
+ , public ::testing::WithParamInterface<
+ std::tuple<VAProfile, VAEntrypoint> >
+{
+protected:
+ void SetUp()
+ {
+ I965TestFixture::SetUp();
+ std::tie(profile, entrypoint) = GetParam();
+ }
+
+ void TearDown()
+ {
+ if (context != VA_INVALID_ID)
+ destroyContext(context);
+ if (config != VA_INVALID_ID)
+ destroyConfig(config);
+ I965TestFixture::TearDown();
+ }
+
+ operator struct intel_encoder_context const *()
+ {
+ if (config == VA_INVALID_ID) return NULL;
+
+ struct i965_driver_data *i965(*this);
+ if (not i965) return NULL;
+
+ struct object_context const *obj_context = CONTEXT(context);
+ if (not obj_context) return NULL;
+
+ return reinterpret_cast<struct intel_encoder_context const *>(
+ obj_context->hw_context);
+ }
+
+ VAProfile profile;
+ VAEntrypoint entrypoint;
+ VAConfigID config = VA_INVALID_ID;
+ VAContextID context = VA_INVALID_ID;
+};
+
+TEST_P(AVCEContextTest, RateControl)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ static const std::vector<unsigned> rateControls = {
+ VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP,
+ VA_RC_VBR_CONSTRAINED, VA_RC_MB,
+ };
+
+ for (auto rc : rateControls) {
+ ConfigAttribs attribs(1, {type:VAConfigAttribRateControl, value:rc});
+ config = createConfig(profile, entrypoint, attribs);
+ context = createContext(config, 1, 1);
+ if (HasFailure()) continue;
+
+ struct intel_encoder_context const *hw_context(*this);
+ EXPECT_PTR(hw_context);
+ if (HasFailure()) continue;
+
+ EXPECT_EQ(rc, hw_context->rate_control_mode);
+
+ destroyContext(context);
+ destroyConfig(config);
+ context = VA_INVALID_ID;
+ config = VA_INVALID_ID;
+ }
+}
+
+TEST_P(AVCEContextTest, Codec)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ static const std::map<VAProfile, int> codecs = {
+ {VAProfileH264ConstrainedBaseline, CODEC_H264},
+ {VAProfileH264Main, CODEC_H264},
+ {VAProfileH264High, CODEC_H264},
+ {VAProfileH264MultiviewHigh, CODEC_H264_MVC},
+ {VAProfileH264StereoHigh, CODEC_H264_MVC},
+ };
+
+ ASSERT_NO_FAILURE(
+ config = createConfig(profile, entrypoint);
+ context = createContext(config, 1, 1);
+ );
+
+ struct intel_encoder_context const *hw_context(*this);
+ ASSERT_PTR(hw_context);
+
+ EXPECT_EQ(codecs.at(profile), hw_context->codec);
+}
+
+TEST_P(AVCEContextTest, LowPowerMode)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ ASSERT_NO_FAILURE(
+ config = createConfig(profile, entrypoint);
+ context = createContext(config, 1, 1);
+ );
+
+ struct intel_encoder_context const *hw_context(*this);
+ ASSERT_PTR(hw_context);
+
+ EXPECT_EQ(
+ (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u),
+ hw_context->low_power_mode
+ );
+}
+
+TEST_P(AVCEContextTest, ROINotSpecified)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ // The lack of the VAConfigAttribEncROI config attribute
+ // will disable it.
+ ASSERT_NO_FAILURE(
+ config = createConfig(profile, entrypoint);
+ context = createContext(config, 1, 1);
+ );
+
+ struct intel_encoder_context const *hw_context(*this);
+ ASSERT_PTR(hw_context);
+
+ EXPECT_EQ(0u, hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, ROISpecified)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ static const std::map<VAProfile, unsigned> roiSupport = {
+ {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main, 1},
+ {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0},
+ {VAProfileH264StereoHigh, 0},
+ };
+
+ // The presence of the VAConfigAttribEncROI config attribute
+ // will enable it for supported profile
+ ConfigAttribs attribs(1, {type:VAConfigAttribEncROI});
+ ASSERT_NO_FAILURE(
+ config = createConfig(profile, entrypoint, attribs);
+ context = createContext(config, 1, 1);
+ );
+
+ struct intel_encoder_context const *hw_context(*this);
+ ASSERT_PTR(hw_context);
+
+ EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, QualityRange)
+{
+ if (not IsSupported(profile, entrypoint)) {
+ RecordProperty("skipped", true);
+ std::cout << "[ SKIPPED ] " << getFullTestName()
+ << " is unsupported on this hardware" << std::endl;
+ return;
+ }
+
+ const std::map<VAProfile, unsigned> qranges = {
+ {VAProfileH264ConstrainedBaseline, entrypoint == VAEntrypointEncSliceLP
+ ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+ {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP
+ ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+ {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP
+ ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+ {VAProfileH264MultiviewHigh, 1u},
+ {VAProfileH264StereoHigh, 1u},
+ };
+
+ ASSERT_NO_FAILURE(
+ config = createConfig(profile, entrypoint);
+ context = createContext(config, 1, 1);
+ );
+
+ struct intel_encoder_context const *hw_context(*this);
+ ASSERT_PTR(hw_context);
+
+ EXPECT_EQ(qranges.at(profile), hw_context->quality_range);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ AVCEncode, AVCEContextTest, ::testing::Values(
+ std::make_tuple(VAProfileH264ConstrainedBaseline, VAEntrypointEncSlice),
+ std::make_tuple(VAProfileH264ConstrainedBaseline, VAEntrypointEncSliceLP),
+ std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice),
+ std::make_tuple(VAProfileH264Main, VAEntrypointEncSliceLP),
+ std::make_tuple(VAProfileH264High, VAEntrypointEncSlice),
+ std::make_tuple(VAProfileH264High, VAEntrypointEncSliceLP),
+ std::make_tuple(VAProfileH264MultiviewHigh, VAEntrypointEncSlice),
+ std::make_tuple(VAProfileH264StereoHigh, VAEntrypointEncSlice)
+ )
+);
+
+} // namespace Encode
+} // namespace AVC
+
diff --git a/test/i965_avce_test_common.cpp b/test/i965_avce_test_common.cpp
new file mode 100644
index 000000000000..14aa36cf3740
--- /dev/null
+++ b/test/i965_avce_test_common.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_test_environment.h"
+
+namespace AVC {
+namespace Encode {
+
+/**
+ * This is similar to i965_validate_config(...) in i965_drv_video.c
+ * except that there are a few other checks in regards to HW support
+ * expectations.
+ */
+VAStatus CheckSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+ I965TestEnvironment *env(I965TestEnvironment::instance());
+ EXPECT_PTR(env);
+
+ struct i965_driver_data *i965(*env);
+ EXPECT_PTR(i965);
+
+ switch(profile) {
+ case VAProfileH264Baseline:
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+ case VAProfileH264ConstrainedBaseline:
+ case VAProfileH264Main:
+ case VAProfileH264High:
+ if (entrypoint == VAEntrypointEncSlice) {
+ if (HAS_H264_ENCODING(i965)) {
+ return VA_STATUS_SUCCESS;
+ }
+ } else if (entrypoint == VAEntrypointEncSliceLP) {
+ if (IS_SKL(i965->intel.device_info)) {
+ return VA_STATUS_SUCCESS;
+ }
+ if (HAS_LP_H264_ENCODING(i965)) {
+ return VA_STATUS_SUCCESS;
+ }
+ }
+ break;
+
+ case VAProfileH264MultiviewHigh:
+ case VAProfileH264StereoHigh:
+ if (entrypoint == VAEntrypointEncSlice) {
+ return VA_STATUS_SUCCESS;
+ }
+ break;
+
+ default:
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+ }
+
+ return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+}
+
+bool IsSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+ return VA_STATUS_SUCCESS == CheckSupported(profile, entrypoint);
+}
+
+} // namespace Encode
+} // namespace AVC
diff --git a/test/i965_avce_test_common.h b/test/i965_avce_test_common.h
new file mode 100644
index 000000000000..46424386b279
--- /dev/null
+++ b/test/i965_avce_test_common.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef I965_AVCE_TEST_COMMON_H
+#define I965_AVCE_TEST_COMMON_H
+
+#include <va/va.h>
+
+namespace AVC {
+namespace Encode {
+
+VAStatus CheckSupported(VAProfile, VAEntrypoint);
+bool IsSupported(VAProfile, VAEntrypoint);
+
+} // namespace Encode
+} // namespace AVC
+
+#endif
diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h
index dbfcbb87ee26..392cd3b3a8b2 100644
--- a/test/i965_internal_decl.h
+++ b/test/i965_internal_decl.h
@@ -28,6 +28,7 @@
extern "C" {
#include "sysdeps.h"
#include "i965_drv_video.h"
+ #include "i965_encoder.h"

extern VAStatus i965_CreateConfig(
VADriverContextP, VAProfile, VAEntrypoint,
--
2.4.11
Xiang, Haihao
2016-10-13 08:39:19 UTC
Permalink
Post by U. Artie Eoff
Add some simple avce context tests to verify various
encode context fields are appropriately configured.
---
 test/Makefile.am                |   3 +
 test/i965_avce_context_test.cpp | 258
++++++++++++++++++++++++++++++++++++++++
 test/i965_avce_test_common.cpp  |  85 +++++++++++++
 test/i965_avce_test_common.h    |  39 ++++++
 test/i965_internal_decl.h       |   1 +
 5 files changed, 386 insertions(+)
 create mode 100644 test/i965_avce_context_test.cpp
 create mode 100644 test/i965_avce_test_common.cpp
 create mode 100644 test/i965_avce_test_common.h
diff --git a/test/Makefile.am b/test/Makefile.am
index 08df3395a383..7a5437e71450 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST =
\
 # test_i965_drv_video
 noinst_PROGRAMS = test_i965_drv_video
 noinst_HEADERS =
\
+ i965_avce_test_common.h
\
  i965_config_test.h
\
  i965_internal_decl.h
\
  i965_jpeg_test_data.h
\
@@ -56,6 +57,8 @@ noinst_HEADERS =
\
 test_i965_drv_video_SOURCES =
\
  i965_avcd_config_test.cpp
\
  i965_avce_config_test.cpp
\
+ i965_avce_context_test.cpp
\
+ i965_avce_test_common.cpp
\
  i965_chipset_test.cpp
\
  i965_config_test.cpp
\
  i965_initialize_test.cpp
\
diff --git a/test/i965_avce_context_test.cpp
b/test/i965_avce_context_test.cpp
new file mode 100644
index 000000000000..4777c9e6a13f
--- /dev/null
+++ b/test/i965_avce_context_test.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_streamable.h"
+#include "i965_test_fixture.h"
+
+#include <map>
+#include <tuple>
+#include <vector>
+
+namespace AVC {
+namespace Encode {
+
+class AVCEContextTest
+    : public I965TestFixture
+    , public ::testing::WithParamInterface<
+        std::tuple<VAProfile, VAEntrypoint> >
+{
+    void SetUp()
+    {
+        I965TestFixture::SetUp();
+        std::tie(profile, entrypoint) = GetParam();
+    }
+
+    void TearDown()
+    {
+        if (context != VA_INVALID_ID)
+            destroyContext(context);
+        if (config != VA_INVALID_ID)
+            destroyConfig(config);
+        I965TestFixture::TearDown();
+    }
+
+    operator struct intel_encoder_context const *()
+    {
+        if (config == VA_INVALID_ID) return NULL;
+
+        struct i965_driver_data *i965(*this);
+        if (not i965) return NULL;
+
+        struct object_context const *obj_context = CONTEXT(context);
+        if (not obj_context) return NULL;
+
+        return reinterpret_cast<struct intel_encoder_context const
*>(
+            obj_context->hw_context);
+    }
+
+    VAProfile       profile;
+    VAEntrypoint    entrypoint;
+    VAConfigID      config = VA_INVALID_ID;
+    VAContextID     context = VA_INVALID_ID;
+};
+
+TEST_P(AVCEContextTest, RateControl)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::vector<unsigned> rateControls = {
+        VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP,
+        VA_RC_VBR_CONSTRAINED, VA_RC_MB,
+    };
+
+    for (auto rc : rateControls) {
+        ConfigAttribs attribs(1, {type:VAConfigAttribRateControl,
value:rc});
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+        if (HasFailure()) continue;
+
+        struct intel_encoder_context const *hw_context(*this);
+        EXPECT_PTR(hw_context);
+        if (HasFailure()) continue;
+
+        EXPECT_EQ(rc, hw_context->rate_control_mode);
The internal variable of hw_context->rate_control_mode is used here,
does it mean we will have to change the gtest case if we do any change
to hw_context->rate_control_mode in the driver?

E.g. rename or remove hw_context->rate_control_mode in the future.
Post by U. Artie Eoff
+
+        destroyContext(context);
+        destroyConfig(config);
+        context = VA_INVALID_ID;
+        config = VA_INVALID_ID;
+    }
+}
+
+TEST_P(AVCEContextTest, Codec)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, int> codecs = {
+        {VAProfileH264ConstrainedBaseline, CODEC_H264},
+        {VAProfileH264Main, CODEC_H264},
+        {VAProfileH264High, CODEC_H264},
+        {VAProfileH264MultiviewHigh, CODEC_H264_MVC},
+        {VAProfileH264StereoHigh, CODEC_H264_MVC},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(codecs.at(profile), hw_context->codec);
+}
+
+TEST_P(AVCEContextTest, LowPowerMode)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(
+        (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u),
+        hw_context->low_power_mode
+    );
+}
+
+TEST_P(AVCEContextTest, ROINotSpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    // The lack of the VAConfigAttribEncROI config attribute
+    // will disable it.
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(0u, hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, ROISpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, unsigned> roiSupport = {
+        {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main,
1},
+        {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0},
+        {VAProfileH264StereoHigh, 0},
+    };
+
+    // The presence of the VAConfigAttribEncROI config attribute
+    // will enable it for supported profile
+    ConfigAttribs attribs(1, {type:VAConfigAttribEncROI});
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, QualityRange)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    const std::map<VAProfile, unsigned> qranges = {
+        {VAProfileH264ConstrainedBaseline, entrypoint ==
VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264MultiviewHigh, 1u},
+        {VAProfileH264StereoHigh, 1u},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(qranges.at(profile), hw_context->quality_range);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    AVCEncode, AVCEContextTest, ::testing::Values(
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264MultiviewHigh,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264StereoHigh,
VAEntrypointEncSlice)
+    )
+);
+
+} // namespace Encode
+} // namespace AVC
+
diff --git a/test/i965_avce_test_common.cpp
b/test/i965_avce_test_common.cpp
new file mode 100644
index 000000000000..14aa36cf3740
--- /dev/null
+++ b/test/i965_avce_test_common.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_test_environment.h"
+
+namespace AVC {
+namespace Encode {
+
+/**
+ * This is similar to i965_validate_config(...) in i965_drv_video.c
+ * except that there are a few other checks in regards to HW support
+ * expectations.
+ */
+VAStatus CheckSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    I965TestEnvironment *env(I965TestEnvironment::instance());
+    EXPECT_PTR(env);
+
+    struct i965_driver_data *i965(*env);
+    EXPECT_PTR(i965);
+
+    switch(profile) {
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            if (HAS_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        } else if (entrypoint == VAEntrypointEncSliceLP) {
+            if (IS_SKL(i965->intel.device_info)) {
+                return VA_STATUS_SUCCESS;
+            }
+            if (HAS_LP_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        }
+        break;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            return VA_STATUS_SUCCESS;
+        }
+        break;
+
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+    }
+
+    return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+}
+
+bool IsSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    return VA_STATUS_SUCCESS == CheckSupported(profile, entrypoint);
+}
+
+} // namespace Encode
+} // namespace AVC
diff --git a/test/i965_avce_test_common.h
b/test/i965_avce_test_common.h
new file mode 100644
index 000000000000..46424386b279
--- /dev/null
+++ b/test/i965_avce_test_common.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef I965_AVCE_TEST_COMMON_H
+#define I965_AVCE_TEST_COMMON_H
+
+#include <va/va.h>
+
+namespace AVC {
+namespace Encode {
+
+VAStatus CheckSupported(VAProfile, VAEntrypoint);
+bool IsSupported(VAProfile, VAEntrypoint);
+
+} // namespace Encode
+} // namespace AVC
+
+#endif
diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h
index dbfcbb87ee26..392cd3b3a8b2 100644
--- a/test/i965_internal_decl.h
+++ b/test/i965_internal_decl.h
@@ -28,6 +28,7 @@
 extern "C" {
     #include "sysdeps.h"
     #include "i965_drv_video.h"
+    #include "i965_encoder.h"
 
     extern VAStatus i965_CreateConfig(
         VADriverContextP, VAProfile, VAEntrypoint,
Eoff, Ullysses A
2016-10-13 14:43:04 UTC
Permalink
-----Original Message-----
From: Xiang, Haihao
Sent: Thursday, October 13, 2016 1:39 AM
Subject: Re: [Libva] [PATCH intel-driver 3/3] test: add some avce context tests
Post by U. Artie Eoff
Add some simple avce context tests to verify various
encode context fields are appropriately configured.
---
 test/Makefile.am                |   3 +
 test/i965_avce_context_test.cpp | 258
++++++++++++++++++++++++++++++++++++++++
 test/i965_avce_test_common.cpp  |  85 +++++++++++++
 test/i965_avce_test_common.h    |  39 ++++++
 test/i965_internal_decl.h       |   1 +
 5 files changed, 386 insertions(+)
 create mode 100644 test/i965_avce_context_test.cpp
 create mode 100644 test/i965_avce_test_common.cpp
 create mode 100644 test/i965_avce_test_common.h
diff --git a/test/Makefile.am b/test/Makefile.am
index 08df3395a383..7a5437e71450 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST =
\
 # test_i965_drv_video
 noinst_PROGRAMS = test_i965_drv_video
 noinst_HEADERS =
\
+ i965_avce_test_common.h
\
  i965_config_test.h
\
  i965_internal_decl.h
\
  i965_jpeg_test_data.h
\
@@ -56,6 +57,8 @@ noinst_HEADERS =
\
 test_i965_drv_video_SOURCES =
\
  i965_avcd_config_test.cpp
\
  i965_avce_config_test.cpp
\
+ i965_avce_context_test.cpp
\
+ i965_avce_test_common.cpp
\
  i965_chipset_test.cpp
\
  i965_config_test.cpp
\
  i965_initialize_test.cpp
\
diff --git a/test/i965_avce_context_test.cpp
b/test/i965_avce_context_test.cpp
new file mode 100644
index 000000000000..4777c9e6a13f
--- /dev/null
+++ b/test/i965_avce_context_test.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_streamable.h"
+#include "i965_test_fixture.h"
+
+#include <map>
+#include <tuple>
+#include <vector>
+
+namespace AVC {
+namespace Encode {
+
+class AVCEContextTest
+    : public I965TestFixture
+    , public ::testing::WithParamInterface<
+        std::tuple<VAProfile, VAEntrypoint> >
+{
+    void SetUp()
+    {
+        I965TestFixture::SetUp();
+        std::tie(profile, entrypoint) = GetParam();
+    }
+
+    void TearDown()
+    {
+        if (context != VA_INVALID_ID)
+            destroyContext(context);
+        if (config != VA_INVALID_ID)
+            destroyConfig(config);
+        I965TestFixture::TearDown();
+    }
+
+    operator struct intel_encoder_context const *()
+    {
+        if (config == VA_INVALID_ID) return NULL;
+
+        struct i965_driver_data *i965(*this);
+        if (not i965) return NULL;
+
+        struct object_context const *obj_context = CONTEXT(context);
+        if (not obj_context) return NULL;
+
+        return reinterpret_cast<struct intel_encoder_context const
*>(
+            obj_context->hw_context);
+    }
+
+    VAProfile       profile;
+    VAEntrypoint    entrypoint;
+    VAConfigID      config = VA_INVALID_ID;
+    VAContextID     context = VA_INVALID_ID;
+};
+
+TEST_P(AVCEContextTest, RateControl)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::vector<unsigned> rateControls = {
+        VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP,
+        VA_RC_VBR_CONSTRAINED, VA_RC_MB,
+    };
+
+    for (auto rc : rateControls) {
+        ConfigAttribs attribs(1, {type:VAConfigAttribRateControl,
value:rc});
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+        if (HasFailure()) continue;
+
+        struct intel_encoder_context const *hw_context(*this);
+        EXPECT_PTR(hw_context);
+        if (HasFailure()) continue;
+
+        EXPECT_EQ(rc, hw_context->rate_control_mode);
The internal variable of hw_context->rate_control_mode is used here,
does it mean we will have to change the gtest case if we do any change
to hw_context->rate_control_mode in the driver?
E.g. rename or remove hw_context->rate_control_mode in the future.
Yes. That just comes with the territory of testing... especially unit tests.
It is normal to need to refactor some tests when APIs and data
structures change. It forces you to think about the changes and ensure
they are tested and don't cause regressions to some extent.
Post by U. Artie Eoff
+
+        destroyContext(context);
+        destroyConfig(config);
+        context = VA_INVALID_ID;
+        config = VA_INVALID_ID;
+    }
+}
+
+TEST_P(AVCEContextTest, Codec)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, int> codecs = {
+        {VAProfileH264ConstrainedBaseline, CODEC_H264},
+        {VAProfileH264Main, CODEC_H264},
+        {VAProfileH264High, CODEC_H264},
+        {VAProfileH264MultiviewHigh, CODEC_H264_MVC},
+        {VAProfileH264StereoHigh, CODEC_H264_MVC},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(codecs.at(profile), hw_context->codec);
+}
+
+TEST_P(AVCEContextTest, LowPowerMode)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(
+        (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u),
+        hw_context->low_power_mode
+    );
+}
+
+TEST_P(AVCEContextTest, ROINotSpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    // The lack of the VAConfigAttribEncROI config attribute
+    // will disable it.
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(0u, hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, ROISpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, unsigned> roiSupport = {
+        {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main,
1},
+        {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0},
+        {VAProfileH264StereoHigh, 0},
+    };
+
+    // The presence of the VAConfigAttribEncROI config attribute
+    // will enable it for supported profile
+    ConfigAttribs attribs(1, {type:VAConfigAttribEncROI});
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, QualityRange)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    const std::map<VAProfile, unsigned> qranges = {
+        {VAProfileH264ConstrainedBaseline, entrypoint ==
VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264MultiviewHigh, 1u},
+        {VAProfileH264StereoHigh, 1u},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(qranges.at(profile), hw_context->quality_range);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    AVCEncode, AVCEContextTest, ::testing::Values(
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264MultiviewHigh,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264StereoHigh,
VAEntrypointEncSlice)
+    )
+);
+
+} // namespace Encode
+} // namespace AVC
+
diff --git a/test/i965_avce_test_common.cpp
b/test/i965_avce_test_common.cpp
new file mode 100644
index 000000000000..14aa36cf3740
--- /dev/null
+++ b/test/i965_avce_test_common.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_test_environment.h"
+
+namespace AVC {
+namespace Encode {
+
+/**
+ * This is similar to i965_validate_config(...) in i965_drv_video.c
+ * except that there are a few other checks in regards to HW support
+ * expectations.
+ */
+VAStatus CheckSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    I965TestEnvironment *env(I965TestEnvironment::instance());
+    EXPECT_PTR(env);
+
+    struct i965_driver_data *i965(*env);
+    EXPECT_PTR(i965);
+
+    switch(profile) {
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            if (HAS_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        } else if (entrypoint == VAEntrypointEncSliceLP) {
+            if (IS_SKL(i965->intel.device_info)) {
+                return VA_STATUS_SUCCESS;
+            }
+            if (HAS_LP_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        }
+        break;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            return VA_STATUS_SUCCESS;
+        }
+        break;
+
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+    }
+
+    return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+}
+
+bool IsSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    return VA_STATUS_SUCCESS == CheckSupported(profile, entrypoint);
+}
+
+} // namespace Encode
+} // namespace AVC
diff --git a/test/i965_avce_test_common.h
b/test/i965_avce_test_common.h
new file mode 100644
index 000000000000..46424386b279
--- /dev/null
+++ b/test/i965_avce_test_common.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef I965_AVCE_TEST_COMMON_H
+#define I965_AVCE_TEST_COMMON_H
+
+#include <va/va.h>
+
+namespace AVC {
+namespace Encode {
+
+VAStatus CheckSupported(VAProfile, VAEntrypoint);
+bool IsSupported(VAProfile, VAEntrypoint);
+
+} // namespace Encode
+} // namespace AVC
+
+#endif
diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h
index dbfcbb87ee26..392cd3b3a8b2 100644
--- a/test/i965_internal_decl.h
+++ b/test/i965_internal_decl.h
@@ -28,6 +28,7 @@
 extern "C" {
     #include "sysdeps.h"
     #include "i965_drv_video.h"
+    #include "i965_encoder.h"
     extern VAStatus i965_CreateConfig(
         VADriverContextP, VAProfile, VAEntrypoint,
Sean V Kelley
2016-10-13 19:35:51 UTC
Permalink
Post by Xiang, Haihao
Post by U. Artie Eoff
Add some simple avce context tests to verify various
encode context fields are appropriately configured.
---
 test/Makefile.am                |   3 +
 test/i965_avce_context_test.cpp | 258
++++++++++++++++++++++++++++++++++++++++
 test/i965_avce_test_common.cpp  |  85 +++++++++++++
 test/i965_avce_test_common.h    |  39 ++++++
 test/i965_internal_decl.h       |   1 +
 5 files changed, 386 insertions(+)
 create mode 100644 test/i965_avce_context_test.cpp
 create mode 100644 test/i965_avce_test_common.cpp
 create mode 100644 test/i965_avce_test_common.h
diff --git a/test/Makefile.am b/test/Makefile.am
index 08df3395a383..7a5437e71450 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST =
\
 # test_i965_drv_video
 noinst_PROGRAMS = test_i965_drv_video
 noinst_HEADERS =
\
+ i965_avce_test_common.h
\
  i965_config_test.h
\
  i965_internal_decl.h
\
  i965_jpeg_test_data.h
\
@@ -56,6 +57,8 @@ noinst_HEADERS =
\
 test_i965_drv_video_SOURCES =
\
  i965_avcd_config_test.cpp
\
  i965_avce_config_test.cpp
\
+ i965_avce_context_test.cpp
\
+ i965_avce_test_common.cpp
\
  i965_chipset_test.cpp
\
  i965_config_test.cpp
\
  i965_initialize_test.cpp
\
diff --git a/test/i965_avce_context_test.cpp
b/test/i965_avce_context_test.cpp
new file mode 100644
index 000000000000..4777c9e6a13f
--- /dev/null
+++ b/test/i965_avce_context_test.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software,
and
to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice
(including
the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_streamable.h"
+#include "i965_test_fixture.h"
+
+#include <map>
+#include <tuple>
+#include <vector>
+
+namespace AVC {
+namespace Encode {
+
+class AVCEContextTest
+    : public I965TestFixture
+    , public ::testing::WithParamInterface<
+        std::tuple<VAProfile, VAEntrypoint> >
+{
+    void SetUp()
+    {
+        I965TestFixture::SetUp();
+        std::tie(profile, entrypoint) = GetParam();
+    }
+
+    void TearDown()
+    {
+        if (context != VA_INVALID_ID)
+            destroyContext(context);
+        if (config != VA_INVALID_ID)
+            destroyConfig(config);
+        I965TestFixture::TearDown();
+    }
+
+    operator struct intel_encoder_context const *()
+    {
+        if (config == VA_INVALID_ID) return NULL;
+
+        struct i965_driver_data *i965(*this);
+        if (not i965) return NULL;
+
+        struct object_context const *obj_context =
CONTEXT(context);
+        if (not obj_context) return NULL;
+
+        return reinterpret_cast<struct intel_encoder_context const
*>(
+            obj_context->hw_context);
+    }
+
+    VAProfile       profile;
+    VAEntrypoint    entrypoint;
+    VAConfigID      config = VA_INVALID_ID;
+    VAContextID     context = VA_INVALID_ID;
+};
+
+TEST_P(AVCEContextTest, RateControl)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::vector<unsigned> rateControls = {
+        VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP,
+        VA_RC_VBR_CONSTRAINED, VA_RC_MB,
+    };
+
+    for (auto rc : rateControls) {
+        ConfigAttribs attribs(1, {type:VAConfigAttribRateControl,
value:rc});
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+        if (HasFailure()) continue;
+
+        struct intel_encoder_context const *hw_context(*this);
+        EXPECT_PTR(hw_context);
+        if (HasFailure()) continue;
+
+        EXPECT_EQ(rc, hw_context->rate_control_mode);
The internal variable of hw_context->rate_control_mode is used here,
does it mean we will have to change the gtest case if we do any change
to hw_context->rate_control_mode in the driver?
E.g. rename or remove hw_context->rate_control_mode in the future.
As Artie pointed out, this is expected and part of the "active
participation" in maintaining the unit tests.  I also feel this is a
good thing and we will better be able to explore and create regression
tests for internals.

Thanks,

Sean
Post by Xiang, Haihao
Post by U. Artie Eoff
+
+        destroyContext(context);
+        destroyConfig(config);
+        context = VA_INVALID_ID;
+        config = VA_INVALID_ID;
+    }
+}
+
+TEST_P(AVCEContextTest, Codec)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, int> codecs = {
+        {VAProfileH264ConstrainedBaseline, CODEC_H264},
+        {VAProfileH264Main, CODEC_H264},
+        {VAProfileH264High, CODEC_H264},
+        {VAProfileH264MultiviewHigh, CODEC_H264_MVC},
+        {VAProfileH264StereoHigh, CODEC_H264_MVC},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(codecs.at(profile), hw_context->codec);
+}
+
+TEST_P(AVCEContextTest, LowPowerMode)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(
+        (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u),
+        hw_context->low_power_mode
+    );
+}
+
+TEST_P(AVCEContextTest, ROINotSpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    // The lack of the VAConfigAttribEncROI config attribute
+    // will disable it.
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(0u, hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, ROISpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, unsigned> roiSupport = {
+        {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main,
1},
+        {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0},
+        {VAProfileH264StereoHigh, 0},
+    };
+
+    // The presence of the VAConfigAttribEncROI config attribute
+    // will enable it for supported profile
+    ConfigAttribs attribs(1, {type:VAConfigAttribEncROI});
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, QualityRange)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    const std::map<VAProfile, unsigned> qranges = {
+        {VAProfileH264ConstrainedBaseline, entrypoint ==
VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264MultiviewHigh, 1u},
+        {VAProfileH264StereoHigh, 1u},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(qranges.at(profile), hw_context->quality_range);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    AVCEncode, AVCEContextTest, ::testing::Values(
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264Main,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264High,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264MultiviewHigh,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264StereoHigh,
VAEntrypointEncSlice)
+    )
+);
+
+} // namespace Encode
+} // namespace AVC
+
diff --git a/test/i965_avce_test_common.cpp
b/test/i965_avce_test_common.cpp
new file mode 100644
index 000000000000..14aa36cf3740
--- /dev/null
+++ b/test/i965_avce_test_common.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software,
and
to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice
(including
the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_test_environment.h"
+
+namespace AVC {
+namespace Encode {
+
+/**
+ * This is similar to i965_validate_config(...) in
i965_drv_video.c
+ * except that there are a few other checks in regards to HW support
+ * expectations.
+ */
+VAStatus CheckSupported(VAProfile profile, VAEntrypoint
entrypoint)
+{
+    I965TestEnvironment *env(I965TestEnvironment::instance());
+    EXPECT_PTR(env);
+
+    struct i965_driver_data *i965(*env);
+    EXPECT_PTR(i965);
+
+    switch(profile) {
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            if (HAS_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        } else if (entrypoint == VAEntrypointEncSliceLP) {
+            if (IS_SKL(i965->intel.device_info)) {
+                return VA_STATUS_SUCCESS;
+            }
+            if (HAS_LP_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        }
+        break;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            return VA_STATUS_SUCCESS;
+        }
+        break;
+
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+    }
+
+    return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+}
+
+bool IsSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    return VA_STATUS_SUCCESS == CheckSupported(profile,
entrypoint);
+}
+
+} // namespace Encode
+} // namespace AVC
diff --git a/test/i965_avce_test_common.h
b/test/i965_avce_test_common.h
new file mode 100644
index 000000000000..46424386b279
--- /dev/null
+++ b/test/i965_avce_test_common.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software,
and
to
+ * permit persons to whom the Software is furnished to do so, subject to
+ *
+ * The above copyright notice and this permission notice
(including
the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef I965_AVCE_TEST_COMMON_H
+#define I965_AVCE_TEST_COMMON_H
+
+#include <va/va.h>
+
+namespace AVC {
+namespace Encode {
+
+VAStatus CheckSupported(VAProfile, VAEntrypoint);
+bool IsSupported(VAProfile, VAEntrypoint);
+
+} // namespace Encode
+} // namespace AVC
+
+#endif
diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h
index dbfcbb87ee26..392cd3b3a8b2 100644
--- a/test/i965_internal_decl.h
+++ b/test/i965_internal_decl.h
@@ -28,6 +28,7 @@
 extern "C" {
     #include "sysdeps.h"
     #include "i965_drv_video.h"
+    #include "i965_encoder.h"
 
     extern VAStatus i965_CreateConfig(
         VADriverContextP, VAProfile, VAEntrypoint,
_______________________________________________
Libva mailing list
https://lists.freedesktop.org/mailman/listinfo/libva
Sean V Kelley
2016-10-13 19:33:15 UTC
Permalink
Post by U. Artie Eoff
Add some simple avce context tests to verify various
encode context fields are appropriately configured.
---
 test/Makefile.am                |   3 +
 test/i965_avce_context_test.cpp | 258
++++++++++++++++++++++++++++++++++++++++
 test/i965_avce_test_common.cpp  |  85 +++++++++++++
 test/i965_avce_test_common.h    |  39 ++++++
 test/i965_internal_decl.h       |   1 +
 5 files changed, 386 insertions(+)
 create mode 100644 test/i965_avce_context_test.cpp
 create mode 100644 test/i965_avce_test_common.cpp
 create mode 100644 test/i965_avce_test_common.h
diff --git a/test/Makefile.am b/test/Makefile.am
index 08df3395a383..7a5437e71450 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST =
\
 # test_i965_drv_video
 noinst_PROGRAMS = test_i965_drv_video
 noinst_HEADERS =
\
+ i965_avce_test_common.h
\
  i965_config_test.h
\
  i965_internal_decl.h
\
  i965_jpeg_test_data.h
\
@@ -56,6 +57,8 @@ noinst_HEADERS =
\
 test_i965_drv_video_SOURCES =
\
  i965_avcd_config_test.cpp
\
  i965_avce_config_test.cpp
\
+ i965_avce_context_test.cpp
\
+ i965_avce_test_common.cpp
\
  i965_chipset_test.cpp
\
  i965_config_test.cpp
\
  i965_initialize_test.cpp
\
diff --git a/test/i965_avce_context_test.cpp
b/test/i965_avce_context_test.cpp
new file mode 100644
index 000000000000..4777c9e6a13f
--- /dev/null
+++ b/test/i965_avce_context_test.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_streamable.h"
+#include "i965_test_fixture.h"
+
+#include <map>
+#include <tuple>
+#include <vector>
+
+namespace AVC {
+namespace Encode {
+
+class AVCEContextTest
+    : public I965TestFixture
+    , public ::testing::WithParamInterface<
+        std::tuple<VAProfile, VAEntrypoint> >
+{
+    void SetUp()
+    {
+        I965TestFixture::SetUp();
+        std::tie(profile, entrypoint) = GetParam();
+    }
+
+    void TearDown()
+    {
+        if (context != VA_INVALID_ID)
+            destroyContext(context);
+        if (config != VA_INVALID_ID)
+            destroyConfig(config);
+        I965TestFixture::TearDown();
+    }
+
+    operator struct intel_encoder_context const *()
+    {
+        if (config == VA_INVALID_ID) return NULL;
+
+        struct i965_driver_data *i965(*this);
+        if (not i965) return NULL;
+
+        struct object_context const *obj_context = CONTEXT(context);
+        if (not obj_context) return NULL;
+
+        return reinterpret_cast<struct intel_encoder_context const
*>(
+            obj_context->hw_context);
+    }
+
+    VAProfile       profile;
+    VAEntrypoint    entrypoint;
+    VAConfigID      config = VA_INVALID_ID;
+    VAContextID     context = VA_INVALID_ID;
+};
+
+TEST_P(AVCEContextTest, RateControl)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::vector<unsigned> rateControls = {
+        VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP,
+        VA_RC_VBR_CONSTRAINED, VA_RC_MB,
+    };
+
+    for (auto rc : rateControls) {
+        ConfigAttribs attribs(1, {type:VAConfigAttribRateControl,
value:rc});
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+        if (HasFailure()) continue;
+
+        struct intel_encoder_context const *hw_context(*this);
+        EXPECT_PTR(hw_context);
+        if (HasFailure()) continue;
+
+        EXPECT_EQ(rc, hw_context->rate_control_mode);
+
+        destroyContext(context);
+        destroyConfig(config);
+        context = VA_INVALID_ID;
+        config = VA_INVALID_ID;
+    }
+}
+
+TEST_P(AVCEContextTest, Codec)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, int> codecs = {
+        {VAProfileH264ConstrainedBaseline, CODEC_H264},
+        {VAProfileH264Main, CODEC_H264},
+        {VAProfileH264High, CODEC_H264},
+        {VAProfileH264MultiviewHigh, CODEC_H264_MVC},
+        {VAProfileH264StereoHigh, CODEC_H264_MVC},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(codecs.at(profile), hw_context->codec);
+}
+
+TEST_P(AVCEContextTest, LowPowerMode)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(
+        (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u),
+        hw_context->low_power_mode
+    );
+}
+
+TEST_P(AVCEContextTest, ROINotSpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    // The lack of the VAConfigAttribEncROI config attribute
+    // will disable it.
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(0u, hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, ROISpecified)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    static const std::map<VAProfile, unsigned> roiSupport = {
+        {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main,
1},
+        {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0},
+        {VAProfileH264StereoHigh, 0},
+    };
+
+    // The presence of the VAConfigAttribEncROI config attribute
+    // will enable it for supported profile
+    ConfigAttribs attribs(1, {type:VAConfigAttribEncROI});
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint, attribs);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi);
+}
+
+TEST_P(AVCEContextTest, QualityRange)
+{
+    if (not IsSupported(profile, entrypoint)) {
+        RecordProperty("skipped", true);
+        std::cout << "[  SKIPPED ] " << getFullTestName()
+            << " is unsupported on this hardware" << std::endl;
+        return;
+    }
+
+    const std::map<VAProfile, unsigned> qranges = {
+        {VAProfileH264ConstrainedBaseline, entrypoint ==
VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP
+            ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE},
+        {VAProfileH264MultiviewHigh, 1u},
+        {VAProfileH264StereoHigh, 1u},
+    };
+
+    ASSERT_NO_FAILURE(
+        config = createConfig(profile, entrypoint);
+        context = createContext(config, 1, 1);
+    );
+
+    struct intel_encoder_context const *hw_context(*this);
+    ASSERT_PTR(hw_context);
+
+    EXPECT_EQ(qranges.at(profile), hw_context->quality_range);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    AVCEncode, AVCEContextTest, ::testing::Values(
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264ConstrainedBaseline,
VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264Main, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264High, VAEntrypointEncSliceLP),
+        std::make_tuple(VAProfileH264MultiviewHigh,
VAEntrypointEncSlice),
+        std::make_tuple(VAProfileH264StereoHigh,
VAEntrypointEncSlice)
+    )
+);
+
+} // namespace Encode
+} // namespace AVC
+
diff --git a/test/i965_avce_test_common.cpp
b/test/i965_avce_test_common.cpp
new file mode 100644
index 000000000000..14aa36cf3740
--- /dev/null
+++ b/test/i965_avce_test_common.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "i965_avce_test_common.h"
+#include "i965_test_environment.h"
+
+namespace AVC {
+namespace Encode {
+
+/**
+ * This is similar to i965_validate_config(...) in i965_drv_video.c
+ * except that there are a few other checks in regards to HW support
+ * expectations.
+ */
I think this is okay and allows customization from the point of view of
the actual tests being run.  Should be little maintenance here.
Post by U. Artie Eoff
+VAStatus CheckSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    I965TestEnvironment *env(I965TestEnvironment::instance());
+    EXPECT_PTR(env);
+
+    struct i965_driver_data *i965(*env);
+    EXPECT_PTR(i965);
+
+    switch(profile) {
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            if (HAS_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        } else if (entrypoint == VAEntrypointEncSliceLP) {
+            if (IS_SKL(i965->intel.device_info)) {
+                return VA_STATUS_SUCCESS;
+            }
+            if (HAS_LP_H264_ENCODING(i965)) {
+                return VA_STATUS_SUCCESS;
+            }
+        }
+        break;
+
+        if (entrypoint == VAEntrypointEncSlice) {
+            return VA_STATUS_SUCCESS;
+        }
+        break;
+
+        return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+    }
+
+    return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+}
+
+bool IsSupported(VAProfile profile, VAEntrypoint entrypoint)
+{
+    return VA_STATUS_SUCCESS == CheckSupported(profile, entrypoint);
+}
+
+} // namespace Encode
+} // namespace AVC
diff --git a/test/i965_avce_test_common.h
b/test/i965_avce_test_common.h
new file mode 100644
index 000000000000..46424386b279
--- /dev/null
+++ b/test/i965_avce_test_common.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction,
including
+ * without limitation the rights to use, copy, modify, merge,
publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so,
subject to
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef I965_AVCE_TEST_COMMON_H
+#define I965_AVCE_TEST_COMMON_H
+
+#include <va/va.h>
+
+namespace AVC {
+namespace Encode {
+
+VAStatus CheckSupported(VAProfile, VAEntrypoint);
+bool IsSupported(VAProfile, VAEntrypoint);
+
+} // namespace Encode
+} // namespace AVC
+
+#endif
diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h
index dbfcbb87ee26..392cd3b3a8b2 100644
--- a/test/i965_internal_decl.h
+++ b/test/i965_internal_decl.h
@@ -28,6 +28,7 @@
 extern "C" {
     #include "sysdeps.h"
     #include "i965_drv_video.h"
+    #include "i965_encoder.h"
 
     extern VAStatus i965_CreateConfig(
         VADriverContextP, VAProfile, VAEntrypoint,
Sean V Kelley
2016-10-13 19:36:47 UTC
Permalink
Post by U. Artie Eoff
The driver does not require surfaces to create a context.
That is, i965_CreateContext can accept an empty render_targets
list.  Thus, make Surfaces an optional parameter to
I965TestFixture::createContext so that simple tests don't
have to bother with Surfaces if they are irrelevant to
the test case.
lgtm, applied.

Thanks,

Sean
Post by U. Artie Eoff
---
 test/i965_test_fixture.cpp | 5 +++--
 test/i965_test_fixture.h   | 3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/test/i965_test_fixture.cpp b/test/i965_test_fixture.cpp
index 8fd914209467..74403f875a56 100644
--- a/test/i965_test_fixture.cpp
+++ b/test/i965_test_fixture.cpp
@@ -83,12 +83,13 @@ void I965TestFixture::destroyConfig(VAConfigID id)
 }
 
 VAContextID I965TestFixture::createContext(
-    VAConfigID config, int w, int h, int flags, Surfaces& targets)
+    VAConfigID config, int w, int h, int flags, const Surfaces&
targets)
 {
     VAContextID id = VA_INVALID_ID;
     EXPECT_STATUS(
         i965_CreateContext(
-            *this, config, w, h, flags, targets.data(),
targets.size(), &id));
+            *this, config, w, h, flags,
+            const_cast<VASurfaceID*>(targets.data()),
targets.size(), &id));
     EXPECT_ID(id);
 
     return id;
diff --git a/test/i965_test_fixture.h b/test/i965_test_fixture.h
index 9122d848e129..3fc11c34fa75 100644
--- a/test/i965_test_fixture.h
+++ b/test/i965_test_fixture.h
      * Convenience wrapper for i965_CreateContext.  May generate a
non-fatal
      * test assertion failure.
      */
-    VAContextID createContext(VAConfigID, int, int, int, Surfaces&);
+    VAContextID createContext(VAConfigID, int, int, int = 0,
+        const Surfaces& = Surfaces());
 
     /**
      * Convenience wrapper for i965_DestroyContext.  May generate a
non-fatal
Loading...