Skip to content

Commit

Permalink
Fix GPU cmd tests so they pass ASAN
Browse files Browse the repository at this point in the history
TEST=unit tests
BUG=95115

R=apatrick@chromium.org


Review URL: http://codereview.chromium.org/7789021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100116 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
gman@chromium.org committed Sep 8, 2011
1 parent f75c170 commit 06a6210
Show file tree
Hide file tree
Showing 4 changed files with 925 additions and 976 deletions.
128 changes: 40 additions & 88 deletions gpu/command_buffer/build_gles2_cmd_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2037,8 +2037,8 @@ def WriteCmdSizeTest(self, func, file):

def WriteFormatTest(self, func, file):
"""Writes a format test for a command."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" %s cmd = { { 0 } };\n" % func.name)
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" %s& cmd = *GetBufferAs<%s>();\n" % (func.name, func.name))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
Expand All @@ -2051,41 +2051,18 @@ def WriteFormatTest(self, func, file):
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name)
file.Write(" cmd.header.command);\n")
func.type_handler.WriteCmdSizeTest(func, file)
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd));\n");
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
file.Write(" next_cmd, sizeof(cmd));\n")
file.Write("}\n")
file.Write("\n")

def WriteImmediateFormatTest(self, func, file):
"""Writes a format test for an immediate version of a command."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" int8 buf[256] = { 0, };\n")
file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" %
(func.name, func.name))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
value = 11
for arg in args:
file.Write(",\n static_cast<%s>(%d)" % (arg.type, value))
value += 1
file.Write(");\n")
value = 11
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name)
file.Write(" cmd.header.command);\n")
func.type_handler.WriteImmediateCmdSizeTest(func, file)
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd));\n");
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write("}\n")
file.Write("\n")
pass

def WriteBucketFormatTest(self, func, file):
"""Writes a format test for a bucket version of a command."""
Expand Down Expand Up @@ -2963,33 +2940,20 @@ def WriteImmediateCmdHelper(self, func, file):

def WriteImmediateFormatTest(self, func, file):
"""Overrriden from TypeHandler."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
file.Write(" int8 buf[256] = { 0, };\n")
file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" %
(func.name, func.name))
file.Write(" %s& cmd = *GetBufferAs<%s>();\n" % (func.name, func.name))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
value = 11
for arg in args:
file.Write(",\n static_cast<%s>(%d)" % (arg.type, value))
value += 1
file.Write(",\n ids);\n")
args = func.GetCmdArgs()
value = 11
file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name)
file.Write(" cmd.header.command);\n")
file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
file.Write(" cmd.header.size * 4u);\n")
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd) +\n");
file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u));\n");
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
file.Write(" next_cmd, sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
file.Write(" // TODO(gman): Check that ids were inserted;\n")
file.Write("}\n")
file.Write("\n")
Expand Down Expand Up @@ -3287,33 +3251,20 @@ def WriteImmediateCmdHelper(self, func, file):

def WriteImmediateFormatTest(self, func, file):
"""Overrriden from TypeHandler."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" static GLuint ids[] = { 12, 23, 34, };\n")
file.Write(" int8 buf[256] = { 0, };\n")
file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" %
(func.name, func.name))
file.Write(" %s& cmd = *GetBufferAs<%s>();\n" % (func.name, func.name))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
value = 11
for arg in args:
file.Write(",\n static_cast<%s>(%d)" % (arg.type, value))
value += 1
file.Write(",\n ids);\n")
args = func.GetCmdArgs()
value = 11
file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name)
file.Write(" cmd.header.command);\n")
file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
file.Write(" cmd.header.size * 4u);\n")
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd) +\n");
file.Write(" RoundSizeToMultipleOfEntries(cmd.n * 4u));\n");
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write(" EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
file.Write(" next_cmd, sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
file.Write(" // TODO(gman): Check that ids were inserted;\n")
file.Write("}\n")
file.Write("\n")
Expand Down Expand Up @@ -3651,16 +3602,14 @@ def WriteImmediateCmdHelper(self, func, file):

def WriteImmediateFormatTest(self, func, file):
"""Overrriden from TypeHandler."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
file.Write(" static %s data[] = {\n" % func.info.data_type)
for v in range(0, func.info.count):
file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
(func.info.data_type, v))
file.Write(" };\n")
file.Write(" int8 buf[256] = { 0, };\n")
file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" %
(func.name, func.name))
file.Write(" %s& cmd = *GetBufferAs<%s>();\n" % (func.name, func.name))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
Expand All @@ -3676,13 +3625,13 @@ def WriteImmediateFormatTest(self, func, file):
file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)),\n")
file.Write(" cmd.header.size * 4u);\n")
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
file.Write(" next_cmd, sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
file.Write(" // TODO(gman): Check that data was inserted;\n")
file.Write("}\n")
file.Write("\n")
Expand Down Expand Up @@ -3882,16 +3831,18 @@ def WriteImmediateCmdHelper(self, func, file):

def WriteImmediateFormatTest(self, func, file):
"""Overrriden from TypeHandler."""
file.Write("TEST(GLES2FormatTest, %s) {\n" % func.name)
file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
file.Write(" const int kSomeBaseValueToTestWith = 51;\n")
file.Write(" static %s data[] = {\n" % func.info.data_type)
for v in range(0, func.info.count * 2):
file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
(func.info.data_type, v))
file.Write(" };\n")
file.Write(" int8 buf[256] = { 0, };\n")
file.Write(" %s& cmd = *static_cast<%s*>(static_cast<void*>(&buf));\n" %
(func.name, func.name))
file.Write(" %s& cmd = *GetBufferAs<%s>();\n" % (func.name, func.name))
file.Write(" const GLsizei kNumElements = 2;\n")
file.Write(" const size_t kExpectedCmdSize =\n")
file.Write(" sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" %
(func.info.data_type, func.info.count))
file.Write(" void* next_cmd = cmd.Set(\n")
file.Write(" &cmd")
args = func.GetCmdArgs()
Expand All @@ -3904,16 +3855,14 @@ def WriteImmediateFormatTest(self, func, file):
value = 1
file.Write(" EXPECT_EQ(static_cast<uint32>(%s::kCmdId),\n" % func.name)
file.Write(" cmd.header.command);\n")
file.Write(" EXPECT_EQ(sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)),\n")
file.Write(" cmd.header.size * 4u);\n")
file.Write(" EXPECT_EQ(static_cast<char*>(next_cmd),\n")
file.Write(" reinterpret_cast<char*>(&cmd) + sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
file.Write(" EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n")
for arg in args:
file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
(arg.type, value, arg.name))
value += 1
file.Write(" CheckBytesWrittenMatchesExpectedSize(\n")
file.Write(" next_cmd, sizeof(cmd) +\n")
file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n")
file.Write(" // TODO(gman): Check that data was inserted;\n")
file.Write("}\n")
file.Write("\n")
Expand Down Expand Up @@ -4059,9 +4008,8 @@ def WriteImmediateFormatTest(self, func, file):
(arg.type, value, arg.name))
value += 1
code = """
TEST(GLES2FormatTest, %(func_name)s) {
int8 buf[256] = { 0, };
%(func_name)s& cmd = *static_cast<%(func_name)s*>(static_cast<void*>(&buf));
TEST_F(GLES2FormatTest, %(func_name)s) {
%(func_name)s& cmd = *GetBufferAs<%(func_name)s>();
static const char* const test_str = \"test string\";
void* next_cmd = cmd.Set(
&cmd,
Expand All @@ -4079,6 +4027,10 @@ def WriteImmediateFormatTest(self, func, file):
%(check_code)s
EXPECT_EQ(static_cast<uint32>(strlen(test_str)), cmd.data_size);
EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str)));
CheckBytesWritten(
next_cmd,
sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str)),
sizeof(cmd) + strlen(test_str));
}
"""
Expand Down
43 changes: 42 additions & 1 deletion gpu/command_buffer/common/gles2_cmd_format_test.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Expand All @@ -10,6 +10,47 @@
namespace gpu {
namespace gles2 {

class GLES2FormatTest : public testing::Test {
protected:
static const unsigned char kInitialValue = 0xBD;

virtual void SetUp() {
memset(buffer_, kInitialValue, sizeof(buffer_));
}

virtual void TearDown() {
}

template <typename T>
T* GetBufferAs() {
return static_cast<T*>(static_cast<void*>(&buffer_));
}

void CheckBytesWritten(
const void* end, size_t expected_size, size_t written_size) {
size_t actual_size = static_cast<const unsigned char*>(end) -
GetBufferAs<const unsigned char>();
EXPECT_LT(actual_size, sizeof(buffer_));
EXPECT_GT(actual_size, 0u);
EXPECT_EQ(expected_size, actual_size);
EXPECT_EQ(kInitialValue, buffer_[written_size]);
EXPECT_NE(kInitialValue, buffer_[written_size - 1]);
}

void CheckBytesWrittenMatchesExpectedSize(
const void* end, size_t expected_size) {
CheckBytesWritten(end, expected_size, expected_size);
}

private:
unsigned char buffer_[1024];
};

// GCC requires these declarations, but MSVC requires they not be present
#ifndef _MSC_VER
const unsigned char GLES2FormatTest::kInitialValue;
#endif

#include "gpu/command_buffer/common/gles2_cmd_format_test_autogen.h"

} // namespace gles2
Expand Down
Loading

0 comments on commit 06a6210

Please sign in to comment.