15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains unit tests for gles2 commmands 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include <limits> 84ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 94ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "base/bind.h" 104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "base/synchronization/waitable_event.h" 114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "base/threading/thread.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2FormatTest : public testing::Test { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const unsigned char kInitialValue = 0xBD; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer_, kInitialValue, sizeof(buffer_)); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* GetBufferAs() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<T*>(static_cast<void*>(&buffer_)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckBytesWritten( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* end, size_t expected_size, size_t written_size) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t actual_size = static_cast<const unsigned char*>(end) - 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBufferAs<const unsigned char>(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(actual_size, sizeof(buffer_)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(actual_size, 0u); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_size, actual_size); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kInitialValue, buffer_[written_size]); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(kInitialValue, buffer_[written_size - 1]); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckBytesWrittenMatchesExpectedSize( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* end, size_t expected_size) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckBytesWritten(end, expected_size, expected_size); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char buffer_[1024]; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid SignalCompletion(uint32* assigned_async_token_ptr, 554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch uint32 async_token, 564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch AsyncUploadSync* sync) { 574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch EXPECT_EQ(async_token, *assigned_async_token_ptr); 584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch sync->SetAsyncUploadToken(async_token); 594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 614ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochTEST(GLES2FormatAsyncUploadSyncTest, AsyncUploadSync) { 624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch const size_t kSize = 10; 634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch const size_t kCount = 1000; 644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::Thread thread("GLES2FormatUploadSyncTest - Fake Upload Thread"); 664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch thread.Start(); 674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Run the same test 50 times so we retest the wrap as well. 694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (size_t test_run = 0; test_run < 50; ++test_run) { 704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch AsyncUploadSync sync; 714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch sync.Reset(); 724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch uint32 buffer_tokens[kSize]; 744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch memset(buffer_tokens, 0, sizeof(buffer_tokens)); 754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Start with a token large enough so that we'll wrap. 774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch uint32 async_token = std::numeric_limits<uint32>::max() - kCount / 2; 784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Set initial async token. 804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch sync.SetAsyncUploadToken(async_token); 814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch for (size_t i = 0; i < kCount; ++i) { 834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch size_t buffer = i % kSize; 844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Loop until previous async token has passed if any was set. 864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch while (buffer_tokens[buffer] && 874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch !sync.HasAsyncUploadTokenPassed(buffer_tokens[buffer])) 884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::PlatformThread::YieldCurrentThread(); 894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Next token, skip 0. 914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch async_token++; 924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (async_token == 0) 934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch async_token++; 944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Set the buffer's associated token. 964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch buffer_tokens[buffer] = async_token; 974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Set the async upload token on the fake upload thread and assert that 994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // the associated buffer still has the given token. 1004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch thread.message_loop()->PostTask(FROM_HERE, 1014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::Bind(&SignalCompletion, 1024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch &buffer_tokens[buffer], 1034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch async_token, 1044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch &sync)); 1054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 1064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 1074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Flush the thread message loop before starting again. 1084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::WaitableEvent waitable(false, false); 1094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch thread.message_loop()->PostTask(FROM_HERE, 1104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::Bind(&base::WaitableEvent::Signal, 1114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch base::Unretained(&waitable))); 1124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch waitable.Wait(); 1134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 1144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch} 1154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MSC_VER 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char GLES2FormatTest::kInitialValue; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format_test_autogen.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126