Commit f25855c9 by Jamie Madill

Add a ValidationContext class helper.

This class is a wrapper around gl::Data, aka the metadata describing a gl::Context. We can use it for unit-testing validation functions by passing that through the validation methods instead of a Context, and using mocks to expect certain errors. BUG=angleproject:747 BUG=angleproject:597 Change-Id: I7bd85c7662860ba9a3a13406579a088d447e5631 Reviewed-on: https://chromium-review.googlesource.com/309637Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 82c29ed2
......@@ -63,16 +63,16 @@ Context::Context(const egl::Config *config,
rx::Renderer *renderer,
bool notifyResets,
bool robustAccess)
: mRenderer(renderer),
: ValidationContext(clientVersion,
mState,
mCaps,
mTextureCaps,
mExtensions,
nullptr,
mLimitations),
mRenderer(renderer),
mConfig(config),
mCurrentSurface(nullptr),
mData(reinterpret_cast<uintptr_t>(this),
clientVersion,
mState,
mCaps,
mTextureCaps,
mExtensions,
nullptr)
mCurrentSurface(nullptr)
{
ASSERT(robustAccess == false); // Unimplemented
......@@ -1465,11 +1465,6 @@ bool Context::isResetNotificationEnabled()
return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
}
int Context::getClientVersion() const
{
return mClientVersion;
}
const egl::Config *Context::getConfig() const
{
return mConfig;
......@@ -1497,26 +1492,6 @@ EGLenum Context::getRenderBuffer() const
}
}
const Caps &Context::getCaps() const
{
return mCaps;
}
const TextureCapsMap &Context::getTextureCaps() const
{
return mTextureCaps;
}
const Extensions &Context::getExtensions() const
{
return mExtensions;
}
const Limitations &Context::getLimitations() const
{
return mLimitations;
}
void Context::detachTexture(GLuint texture)
{
// Simple pass-through to State's detachTexture method, as textures do not require
......
......@@ -55,7 +55,7 @@ class VertexArray;
class Sampler;
class TransformFeedback;
class Context final : angle::NonCopyable
class Context final : public ValidationContext
{
public:
Context(const egl::Config *config, int clientVersion, const Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess);
......@@ -193,23 +193,16 @@ class Context final : angle::NonCopyable
void pushGroupMarker(GLsizei length, const char *marker);
void popGroupMarker();
void recordError(const Error &error);
void recordError(const Error &error) override;
GLenum getError();
GLenum getResetStatus();
virtual bool isResetNotificationEnabled();
virtual int getClientVersion() const;
const egl::Config *getConfig() const;
EGLenum getClientType() const;
EGLenum getRenderBuffer() const;
const Caps &getCaps() const;
const TextureCapsMap &getTextureCaps() const;
const Extensions &getExtensions() const;
const Limitations &getLimitations() const;
const std::string &getRendererString() const;
const std::string &getExtensionString() const;
......@@ -219,9 +212,7 @@ class Context final : angle::NonCopyable
rx::Renderer *getRenderer() { return mRenderer; }
State &getState() { return mState; }
const State &getState() const { return mState; }
const Data &getData() const { return mData; }
void syncRendererState();
void syncRendererState(const State::DirtyBits &bitMask);
......@@ -296,9 +287,6 @@ class Context final : angle::NonCopyable
egl::Surface *mCurrentSurface;
ResourceManager *mResourceManager;
// Cache the Data object to avoid re-calling the constructor
Data mData;
};
}
......
......@@ -18,18 +18,37 @@ Data::Data(uintptr_t contextIn,
const Caps &capsIn,
const TextureCapsMap &textureCapsIn,
const Extensions &extensionsIn,
const ResourceManager *resourceManagerIn)
const ResourceManager *resourceManagerIn,
const Limitations &limitationsIn)
: context(contextIn),
clientVersion(clientVersionIn),
state(&stateIn),
caps(&capsIn),
textureCaps(&textureCapsIn),
extensions(&extensionsIn),
resourceManager(resourceManagerIn)
resourceManager(resourceManagerIn),
limitations(&limitationsIn)
{}
Data::~Data()
{
}
ValidationContext::ValidationContext(GLint clientVersion,
const State &state,
const Caps &caps,
const TextureCapsMap &textureCaps,
const Extensions &extensions,
const ResourceManager *resourceManager,
const Limitations &limitations)
: mData(reinterpret_cast<uintptr_t>(this),
clientVersion,
state,
caps,
textureCaps,
extensions,
resourceManager,
limitations)
{
}
}
......@@ -24,7 +24,8 @@ struct Data final : public angle::NonCopyable
const Caps &caps,
const TextureCapsMap &textureCaps,
const Extensions &extensions,
const ResourceManager *resourceManager);
const ResourceManager *resourceManager,
const Limitations &limitations);
~Data();
uintptr_t context;
......@@ -34,6 +35,33 @@ struct Data final : public angle::NonCopyable
const TextureCapsMap *textureCaps;
const Extensions *extensions;
const ResourceManager *resourceManager;
const Limitations *limitations;
};
class ValidationContext : angle::NonCopyable
{
public:
ValidationContext(GLint clientVersion,
const State &state,
const Caps &caps,
const TextureCapsMap &textureCaps,
const Extensions &extensions,
const ResourceManager *resourceManager,
const Limitations &limitations);
virtual ~ValidationContext() {}
virtual void recordError(const Error &error) = 0;
const Data &getData() const { return mData; }
int getClientVersion() const { return mData.clientVersion; }
const State &getState() const { return *mData.state; }
const Caps &getCaps() const { return *mData.caps; }
const TextureCapsMap &getTextureCaps() const { return *mData.textureCaps; }
const Extensions &getExtensions() const { return *mData.extensions; }
const Limitations &getLimitations() const { return *mData.limitations; }
protected:
Data mData;
};
}
......
......@@ -29,7 +29,7 @@ namespace gl
{
namespace
{
bool ValidateDrawAttribs(gl::Context *context, GLint primcount, GLint maxVertex)
bool ValidateDrawAttribs(ValidationContext *context, GLint primcount, GLint maxVertex)
{
const gl::State &state = context->getState();
const gl::Program *program = state.getProgram();
......@@ -1466,7 +1466,10 @@ bool ValidateCopyTexImageParametersBase(gl::Context *context, GLenum target, GLi
return true;
}
static bool ValidateDrawBase(Context *context, GLenum mode, GLsizei count, GLsizei primcount)
static bool ValidateDrawBase(ValidationContext *context,
GLenum mode,
GLsizei count,
GLsizei primcount)
{
switch (mode)
{
......@@ -1657,7 +1660,7 @@ bool ValidateDrawArraysInstancedANGLE(Context *context, GLenum mode, GLint first
return ValidateDrawArraysInstanced(context, mode, first, count, primcount);
}
bool ValidateDrawElements(Context *context,
bool ValidateDrawElements(ValidationContext *context,
GLenum mode,
GLsizei count,
GLenum type,
......
......@@ -26,6 +26,7 @@ namespace gl
class Context;
class Program;
class Shader;
class ValidationContext;
bool ValidCap(const Context *context, GLenum cap);
bool ValidTextureTarget(const Context *context, GLenum target);
......@@ -93,7 +94,7 @@ bool ValidateDrawArrays(Context *context, GLenum mode, GLint first, GLsizei coun
bool ValidateDrawArraysInstanced(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
bool ValidateDrawArraysInstancedANGLE(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
bool ValidateDrawElements(Context *context,
bool ValidateDrawElements(ValidationContext *context,
GLenum mode,
GLsizei count,
GLenum type,
......
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