Commit 19a43dbe by Jamie Madill

Add a perf test for draw call overhead.

These perf tests use the D3D NULL renderers to measure pure CPU time, with no GPU limitations. Also fix our D3D9 SwapChain code to skip creating a SwapChain for NULLREF D3D9 devices, and the vertex decl code to reinitialize the formats when finding a mismatch with the previous value. BUG=angleproject:955 Change-Id: I449e63177b48afd1559c36244de0bc252814e813 Reviewed-on: https://chromium-review.googlesource.com/262208Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent b9c0d3b6
...@@ -228,6 +228,8 @@ class Renderer9 : public RendererD3D ...@@ -228,6 +228,8 @@ class Renderer9 : public RendererD3D
RendererClass getRendererClass() const override { return RENDERER_D3D9; } RendererClass getRendererClass() const override { return RENDERER_D3D9; }
D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; }
private: private:
DISALLOW_COPY_AND_ASSIGN(Renderer9); DISALLOW_COPY_AND_ASSIGN(Renderer9);
......
...@@ -154,8 +154,10 @@ EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapI ...@@ -154,8 +154,10 @@ EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapI
const d3d9::TextureFormat &depthBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mDepthBufferFormat); const d3d9::TextureFormat &depthBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mDepthBufferFormat);
// Don't create a swapchain for NULLREF devices
D3DDEVTYPE deviceType = mRenderer->getD3D9DeviceType();
EGLNativeWindowType window = mNativeWindow.getNativeWindow(); EGLNativeWindowType window = mNativeWindow.getNativeWindow();
if (window) if (window && deviceType != D3DDEVTYPE_NULLREF)
{ {
D3DPRESENT_PARAMETERS presentParameters = {0}; D3DPRESENT_PARAMETERS presentParameters = {0};
presentParameters.AutoDepthStencilFormat = depthBufferd3dFormatInfo.renderFormat; presentParameters.AutoDepthStencilFormat = depthBufferd3dFormatInfo.renderFormat;
......
...@@ -560,7 +560,7 @@ const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::Vert ...@@ -560,7 +560,7 @@ const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::Vert
static bool initialized = false; static bool initialized = false;
static DWORD intializedDeclTypes = 0; static DWORD intializedDeclTypes = 0;
static VertexFormat formatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; static VertexFormat formatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4];
if (!initialized) if (intializedDeclTypes != supportedDeclTypes)
{ {
const TranslationDescription translations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4] = // [GL types as enumerated by typeIndex()][normalized][size-1] const TranslationDescription translations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4] = // [GL types as enumerated by typeIndex()][normalized][size-1]
{ {
...@@ -592,8 +592,6 @@ const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::Vert ...@@ -592,8 +592,6 @@ const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::Vert
intializedDeclTypes = supportedDeclTypes; intializedDeclTypes = supportedDeclTypes;
} }
ASSERT(intializedDeclTypes == supportedDeclTypes);
// Pure integer attributes only supported in ES3.0 // Pure integer attributes only supported in ES3.0
ASSERT(!vertexFormat.mPureInteger); ASSERT(!vertexFormat.mPureInteger);
return formatConverters[ComputeTypeIndex(vertexFormat.mType)][vertexFormat.mNormalized][vertexFormat.mComponents - 1]; return formatConverters[ComputeTypeIndex(vertexFormat.mType)][vertexFormat.mNormalized][vertexFormat.mComponents - 1];
......
...@@ -34,11 +34,16 @@ ANGLEPerfTest::ANGLEPerfTest(const std::string &name, const PerfTestParams &test ...@@ -34,11 +34,16 @@ ANGLEPerfTest::ANGLEPerfTest(const std::string &name, const PerfTestParams &test
void ANGLEPerfTest::SetUp() void ANGLEPerfTest::SetUp()
{ {
EGLPlatformParameters platformParams(mTestParams.requestedRenderer,
EGL_DONT_CARE,
EGL_DONT_CARE,
mTestParams.deviceType);
mOSWindow.reset(CreateOSWindow()); mOSWindow.reset(CreateOSWindow());
mEGLWindow.reset(new EGLWindow(mTestParams.widowWidth, mEGLWindow.reset(new EGLWindow(mTestParams.widowWidth,
mTestParams.windowHeight, mTestParams.windowHeight,
mTestParams.glesMajorVersion, mTestParams.glesMajorVersion,
EGLPlatformParameters(mTestParams.requestedRenderer))); platformParams));
mTimer.reset(CreateTimer()); mTimer.reset(CreateTimer());
if (!mOSWindow->initialize(mName, mEGLWindow->getWidth(), mEGLWindow->getHeight())) if (!mOSWindow->initialize(mName, mEGLWindow->getWidth(), mEGLWindow->getHeight()))
......
...@@ -27,6 +27,7 @@ class Event; ...@@ -27,6 +27,7 @@ class Event;
struct PerfTestParams struct PerfTestParams
{ {
EGLint requestedRenderer; EGLint requestedRenderer;
EGLint deviceType;
EGLint glesMajorVersion; EGLint glesMajorVersion;
EGLint widowWidth; EGLint widowWidth;
EGLint windowHeight; EGLint windowHeight;
......
...@@ -332,13 +332,14 @@ void BufferSubDataBenchmark::drawBenchmark() ...@@ -332,13 +332,14 @@ void BufferSubDataBenchmark::drawBenchmark()
} }
} }
BufferSubDataParams D3D11Params() BufferSubDataParams BufferUpdateD3D11Params()
{ {
BufferSubDataParams params; BufferSubDataParams params;
params.glesMajorVersion = 2; params.glesMajorVersion = 2;
params.widowWidth = 1280; params.widowWidth = 1280;
params.windowHeight = 720; params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.vertexType = GL_FLOAT; params.vertexType = GL_FLOAT;
params.vertexComponentCount = 4; params.vertexComponentCount = 4;
params.vertexNormalized = GL_FALSE; params.vertexNormalized = GL_FALSE;
...@@ -349,13 +350,14 @@ BufferSubDataParams D3D11Params() ...@@ -349,13 +350,14 @@ BufferSubDataParams D3D11Params()
return params; return params;
} }
BufferSubDataParams D3D9Params() BufferSubDataParams BufferUpdateD3D9Params()
{ {
BufferSubDataParams params; BufferSubDataParams params;
params.glesMajorVersion = 2; params.glesMajorVersion = 2;
params.widowWidth = 1280; params.widowWidth = 1280;
params.windowHeight = 720; params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.vertexType = GL_FLOAT; params.vertexType = GL_FLOAT;
params.vertexComponentCount = 4; params.vertexComponentCount = 4;
params.vertexNormalized = GL_FALSE; params.vertexNormalized = GL_FALSE;
...@@ -366,13 +368,53 @@ BufferSubDataParams D3D9Params() ...@@ -366,13 +368,53 @@ BufferSubDataParams D3D9Params()
return params; return params;
} }
BufferSubDataParams DrawCallD3D11Params()
{
BufferSubDataParams params;
params.glesMajorVersion = 2;
params.widowWidth = 1280;
params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE;
params.vertexType = GL_FLOAT;
params.vertexComponentCount = 4;
params.vertexNormalized = GL_FALSE;
params.updateSize = 0;
params.bufferSize = 100000;
params.iterations = 50;
params.updateRate = 1;
return params;
}
BufferSubDataParams DrawCallD3D9Params()
{
BufferSubDataParams params;
params.glesMajorVersion = 2;
params.widowWidth = 1280;
params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE;
params.vertexType = GL_FLOAT;
params.vertexComponentCount = 4;
params.vertexNormalized = GL_FALSE;
params.updateSize = 0;
params.bufferSize = 100000;
params.iterations = 50;
params.updateRate = 1;
return params;
}
} // namespace } // namespace
TEST_P(BufferSubDataBenchmark, BufferUpdates) TEST_P(BufferSubDataBenchmark, Run)
{ {
run(); run();
} }
INSTANTIATE_TEST_CASE_P(BufferUpdates, INSTANTIATE_TEST_CASE_P(BufferUpdates,
BufferSubDataBenchmark, BufferSubDataBenchmark,
::testing::Values(D3D11Params(), D3D9Params())); ::testing::Values(BufferUpdateD3D11Params(), BufferUpdateD3D9Params()));
INSTANTIATE_TEST_CASE_P(DrawCallPerf,
BufferSubDataBenchmark,
::testing::Values(DrawCallD3D11Params(), DrawCallD3D9Params()));
...@@ -206,6 +206,7 @@ PointSpritesParams D3D11Params() ...@@ -206,6 +206,7 @@ PointSpritesParams D3D11Params()
params.widowWidth = 1280; params.widowWidth = 1280;
params.windowHeight = 720; params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.iterations = 10; params.iterations = 10;
params.count = 10; params.count = 10;
...@@ -223,6 +224,7 @@ PointSpritesParams D3D9Params() ...@@ -223,6 +224,7 @@ PointSpritesParams D3D9Params()
params.widowWidth = 1280; params.widowWidth = 1280;
params.windowHeight = 720; params.windowHeight = 720;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.iterations = 10; params.iterations = 10;
params.count = 10; params.count = 10;
...@@ -234,7 +236,7 @@ PointSpritesParams D3D9Params() ...@@ -234,7 +236,7 @@ PointSpritesParams D3D9Params()
} // namespace } // namespace
TEST_P(PointSpritesBenchmark, Render) TEST_P(PointSpritesBenchmark, Run)
{ {
run(); run();
} }
......
...@@ -263,6 +263,7 @@ TexSubImageParams D3D11Params() ...@@ -263,6 +263,7 @@ TexSubImageParams D3D11Params()
params.widowWidth = 512; params.widowWidth = 512;
params.windowHeight = 512; params.windowHeight = 512;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.imageWidth = 1024; params.imageWidth = 1024;
params.imageHeight = 1024; params.imageHeight = 1024;
...@@ -281,6 +282,7 @@ TexSubImageParams D3D9Params() ...@@ -281,6 +282,7 @@ TexSubImageParams D3D9Params()
params.widowWidth = 512; params.widowWidth = 512;
params.windowHeight = 512; params.windowHeight = 512;
params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE; params.requestedRenderer = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
params.deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
params.imageWidth = 1024; params.imageWidth = 1024;
params.imageHeight = 1024; params.imageHeight = 1024;
...@@ -293,7 +295,7 @@ TexSubImageParams D3D9Params() ...@@ -293,7 +295,7 @@ TexSubImageParams D3D9Params()
} // namespace } // namespace
TEST_P(TexSubImageBenchmark, TextureUpdates) TEST_P(TexSubImageBenchmark, Run)
{ {
run(); run();
} }
......
...@@ -25,6 +25,12 @@ ...@@ -25,6 +25,12 @@
class OSWindow; class OSWindow;
// A hidden define used in some renderers (currently D3D-only)
// to init a no-op renderer. Useful for performance testing.
#ifndef EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x6AC0
#endif
struct EGLPlatformParameters struct EGLPlatformParameters
{ {
EGLint renderer; EGLint renderer;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment