diff options
-rw-r--r-- | test/decode_test_driver.cc | 6 | ||||
-rw-r--r-- | test/encode_test_driver.cc | 8 | ||||
-rw-r--r-- | test/idctllm_test.cc | 9 | ||||
-rw-r--r-- | test/intrapred_test.cc | 7 | ||||
-rw-r--r-- | test/pp_filter_test.cc | 5 | ||||
-rw-r--r-- | test/register_state_check.h | 95 | ||||
-rw-r--r-- | test/sad_test.cc | 9 | ||||
-rw-r--r-- | test/sixtap_predict_test.cc | 10 | ||||
-rw-r--r-- | test/subtract_test.cc | 3 | ||||
-rw-r--r-- | test/test.mk | 1 |
10 files changed, 132 insertions, 21 deletions
diff --git a/test/decode_test_driver.cc b/test/decode_test_driver.cc index 3610f025d..84afe7f84 100644 --- a/test/decode_test_driver.cc +++ b/test/decode_test_driver.cc @@ -9,6 +9,7 @@ */ #include "test/decode_test_driver.h" #include "third_party/googletest/src/include/gtest/gtest.h" +#include "test/register_state_check.h" #include "test/video_source.h" namespace libvpx_test { @@ -21,8 +22,9 @@ void Decoder::DecodeFrame(const uint8_t *cxdata, int size) { ASSERT_EQ(VPX_CODEC_OK, res_init) << DecodeError(); } - const vpx_codec_err_t res_dec = vpx_codec_decode(&decoder_, - cxdata, size, NULL, 0); + vpx_codec_err_t res_dec; + REGISTER_STATE_CHECK(res_dec = vpx_codec_decode(&decoder_, + cxdata, size, NULL, 0)); ASSERT_EQ(VPX_CODEC_OK, res_dec) << DecodeError(); } diff --git a/test/encode_test_driver.cc b/test/encode_test_driver.cc index ebb3959ed..56339cae0 100644 --- a/test/encode_test_driver.cc +++ b/test/encode_test_driver.cc @@ -12,6 +12,7 @@ #if CONFIG_VP8_DECODER #include "test/decode_test_driver.h" #endif +#include "test/register_state_check.h" #include "test/video_source.h" #include "third_party/googletest/src/include/gtest/gtest.h" @@ -58,9 +59,10 @@ void Encoder::EncodeFrameInternal(const VideoSource &video, } // Encode the frame - res = vpx_codec_encode(&encoder_, - video.img(), video.pts(), video.duration(), - frame_flags, deadline_); + REGISTER_STATE_CHECK( + res = vpx_codec_encode(&encoder_, + video.img(), video.pts(), video.duration(), + frame_flags, deadline_)); ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); } diff --git a/test/idctllm_test.cc b/test/idctllm_test.cc index dd42e2299..1be5fa0c4 100644 --- a/test/idctllm_test.cc +++ b/test/idctllm_test.cc @@ -13,6 +13,7 @@ extern "C" { #include "vpx_config.h" #include "vpx_rtcd.h" } +#include "test/register_state_check.h" #include "third_party/googletest/src/include/gtest/gtest.h" typedef void (*idct_fn_t)(short *input, unsigned char *pred_ptr, @@ -54,7 +55,7 @@ TEST_P(IDCTTest, TestAllZeros) { int i; - UUT(input, output, 16, output, 16); + REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for(i=0; i<256; i++) if((i&0xF) < 4 && i<64) @@ -68,7 +69,7 @@ TEST_P(IDCTTest, TestAllOnes) int i; input[0] = 4; - UUT(input, output, 16, output, 16); + REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for(i=0; i<256; i++) if((i&0xF) < 4 && i<64) @@ -85,7 +86,7 @@ TEST_P(IDCTTest, TestAddOne) predict[i] = i; input[0] = 4; - UUT(input, predict, 16, output, 16); + REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); for(i=0; i<256; i++) if((i&0xF) < 4 && i<64) @@ -101,7 +102,7 @@ TEST_P(IDCTTest, TestWithData) for(i=0; i<16; i++) input[i] = i; - UUT(input, output, 16, output, 16); + REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for(i=0; i<256; i++) if((i&0xF) > 3 || i>63) diff --git a/test/intrapred_test.cc b/test/intrapred_test.cc index d2e0d61a1..4c16c3f2b 100644 --- a/test/intrapred_test.cc +++ b/test/intrapred_test.cc @@ -11,6 +11,7 @@ #include <string.h> #include "test/acm_random.h" +#include "test/register_state_check.h" #include "third_party/googletest/src/include/gtest/gtest.h" extern "C" { #include "vpx_config.h" @@ -246,8 +247,10 @@ class IntraPredYTest : public ::testing::TestWithParam<intra_pred_y_fn_t>, virtual void Predict(MB_PREDICTION_MODE mode) { mb_.mode_info_context->mbmi.mode = mode; - pred_fn_(&mb_, data_ptr_[0] - kStride, data_ptr_[0] - 1, kStride, - data_ptr_[0], kStride); + REGISTER_STATE_CHECK(pred_fn_(&mb_, + data_ptr_[0] - kStride, + data_ptr_[0] - 1, kStride, + data_ptr_[0], kStride)); } intra_pred_y_fn_t pred_fn_; diff --git a/test/pp_filter_test.cc b/test/pp_filter_test.cc index af2f3bda9..9227449ef 100644 --- a/test/pp_filter_test.cc +++ b/test/pp_filter_test.cc @@ -7,6 +7,7 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ +#include "test/register_state_check.h" #include "third_party/googletest/src/include/gtest/gtest.h" extern "C" { #include "vpx_config.h" @@ -74,8 +75,8 @@ TEST_P(Vp8PostProcessingFilterTest, FilterOutputCheck) { // Initialize pixels in the output to 99. (void)vpx_memset(dst_image, 99, output_size); - GetParam()(src_image_ptr, dst_image_ptr, input_stride, - output_stride, block_width, flimits, 16); + REGISTER_STATE_CHECK(GetParam()(src_image_ptr, dst_image_ptr, input_stride, + output_stride, block_width, flimits, 16)); static const uint8_t expected_data[block_height] = { 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4 diff --git a/test/register_state_check.h b/test/register_state_check.h new file mode 100644 index 000000000..fb3f53b13 --- /dev/null +++ b/test/register_state_check.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2012 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef LIBVPX_TEST_REGISTER_STATE_CHECK_H_ +#define LIBVPX_TEST_REGISTER_STATE_CHECK_H_ + +#ifdef _WIN64 + +#define _WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <winnt.h> + +#include "third_party/googletest/src/include/gtest/gtest.h" + +namespace testing { +namespace internal { + +inline bool operator==(const M128A& lhs, const M128A& rhs) { + return (lhs.Low == rhs.Low && lhs.High == rhs.High); +} + +} // namespace internal +} // namespace testing + +namespace libvpx_test { + +// Compares the state of xmm[6-15] at construction with their state at +// destruction. These registers should be preserved by the callee on +// Windows x64. +// Usage: +// { +// RegisterStateCheck reg_check; +// FunctionToVerify(); +// } +class RegisterStateCheck { + public: + RegisterStateCheck() { initialized_ = StoreRegisters(&pre_context_); } + ~RegisterStateCheck() { EXPECT_TRUE(Check()); } + + private: + static bool StoreRegisters(CONTEXT* const context) { + const HANDLE this_thread = GetCurrentThread(); + EXPECT_TRUE(this_thread != NULL); + context->ContextFlags = CONTEXT_FLOATING_POINT; + const bool context_saved = GetThreadContext(this_thread, context) == TRUE; + EXPECT_TRUE(context_saved) << "GetLastError: " << GetLastError(); + return context_saved; + } + + // Compares the register state. Returns true if the states match. + bool Check() const { + if (!initialized_) return false; + CONTEXT post_context; + if (!StoreRegisters(&post_context)) return false; + + const M128A* xmm_pre = &pre_context_.Xmm6; + const M128A* xmm_post = &post_context.Xmm6; + for (int i = 6; i <= 15; ++i) { + EXPECT_EQ(*xmm_pre, *xmm_post) << "xmm" << i << " has been modified!"; + ++xmm_pre; + ++xmm_post; + } + return !testing::Test::HasNonfatalFailure(); + } + + bool initialized_; + CONTEXT pre_context_; +}; + +#define REGISTER_STATE_CHECK(statement) do { \ + libvpx_test::RegisterStateCheck reg_check; \ + statement; \ +} while (false) + +} // namespace libvpx_test + +#else // !_WIN64 + +namespace libvpx_test { + +class RegisterStateCheck {}; +#define REGISTER_STATE_CHECK(statement) statement + +} // namespace libvpx_test + +#endif // _WIN64 + +#endif // LIBVPX_TEST_REGISTER_STATE_CHECK_H_ diff --git a/test/sad_test.cc b/test/sad_test.cc index 2b562e6dd..5a0653b65 100644 --- a/test/sad_test.cc +++ b/test/sad_test.cc @@ -21,6 +21,7 @@ extern "C" { } #include "test/acm_random.h" +#include "test/register_state_check.h" #include "test/util.h" #include "third_party/googletest/src/include/gtest/gtest.h" @@ -65,9 +66,11 @@ class SADTest : public PARAMS(int, int, sad_m_by_n_fn_t) { sad_m_by_n_fn_t sad_fn_; virtual unsigned int SAD(unsigned int max_sad) { - return sad_fn_(source_data_, source_stride_, - reference_data_, reference_stride_, - max_sad); + unsigned int ret; + REGISTER_STATE_CHECK(ret = sad_fn_(source_data_, source_stride_, + reference_data_, reference_stride_, + max_sad)); + return ret; } // Sum of Absolute Differences. Given two blocks, calculate the absolute diff --git a/test/sixtap_predict_test.cc b/test/sixtap_predict_test.cc index 06f14a1c7..c9dccebcf 100644 --- a/test/sixtap_predict_test.cc +++ b/test/sixtap_predict_test.cc @@ -12,6 +12,7 @@ #include <stdlib.h> #include <string.h> #include "test/acm_random.h" +#include "test/register_state_check.h" #include "test/util.h" #include "third_party/googletest/src/include/gtest/gtest.h" extern "C" { @@ -136,8 +137,8 @@ TEST_P(SixtapPredictTest, TestWithPresetData) { uint8_t *src = const_cast<uint8_t*>(test_data); - sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride, - 2, 2, dst_, kDstStride); + REGISTER_STATE_CHECK(sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride, + 2, 2, dst_, kDstStride)); for (int i = 0; i < height_; ++i) for (int j = 0; j < width_; ++j) @@ -162,8 +163,9 @@ TEST_P(SixtapPredictTest, TestWithRandomData) { xoffset, yoffset, dst_c_, kDstStride); // Run test. - sixtap_predict_(&src_[kSrcStride * 2 + 2 + 1], kSrcStride, - xoffset, yoffset, dst_, kDstStride); + REGISTER_STATE_CHECK( + sixtap_predict_(&src_[kSrcStride * 2 + 2 + 1], kSrcStride, + xoffset, yoffset, dst_, kDstStride)); for (int i = 0; i < height_; ++i) for (int j = 0; j < width_; ++j) diff --git a/test/subtract_test.cc b/test/subtract_test.cc index 99363de64..60acf818e 100644 --- a/test/subtract_test.cc +++ b/test/subtract_test.cc @@ -10,6 +10,7 @@ #include "third_party/googletest/src/include/gtest/gtest.h" #include "test/acm_random.h" +#include "test/register_state_check.h" extern "C" { #include "vpx_config.h" #include "vpx_rtcd.h" @@ -77,7 +78,7 @@ TEST_P(SubtractBlockTest, SimpleSubtract) { predictor += kDiffPredStride; } - GetParam()(&be, &bd, kDiffPredStride); + REGISTER_STATE_CHECK(GetParam()(&be, &bd, kDiffPredStride)); base_src = *be.base_src; src_diff = be.src_diff; diff --git a/test/test.mk b/test/test.mk index 7a11a2793..982be5b37 100644 --- a/test/test.mk +++ b/test/test.mk @@ -1,4 +1,5 @@ LIBVPX_TEST_SRCS-yes += acm_random.h +LIBVPX_TEST_SRCS-yes += register_state_check.h LIBVPX_TEST_SRCS-yes += test.mk LIBVPX_TEST_SRCS-yes += test_libvpx.cc LIBVPX_TEST_SRCS-yes += util.h |