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, ...@@ -63,16 +63,16 @@ Context::Context(const egl::Config *config,
rx::Renderer *renderer, rx::Renderer *renderer,
bool notifyResets, bool notifyResets,
bool robustAccess) bool robustAccess)
: mRenderer(renderer), : ValidationContext(clientVersion,
mState,
mCaps,
mTextureCaps,
mExtensions,
nullptr,
mLimitations),
mRenderer(renderer),
mConfig(config), mConfig(config),
mCurrentSurface(nullptr), mCurrentSurface(nullptr)
mData(reinterpret_cast<uintptr_t>(this),
clientVersion,
mState,
mCaps,
mTextureCaps,
mExtensions,
nullptr)
{ {
ASSERT(robustAccess == false); // Unimplemented ASSERT(robustAccess == false); // Unimplemented
...@@ -1465,11 +1465,6 @@ bool Context::isResetNotificationEnabled() ...@@ -1465,11 +1465,6 @@ bool Context::isResetNotificationEnabled()
return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT); return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
} }
int Context::getClientVersion() const
{
return mClientVersion;
}
const egl::Config *Context::getConfig() const const egl::Config *Context::getConfig() const
{ {
return mConfig; return mConfig;
...@@ -1497,26 +1492,6 @@ EGLenum Context::getRenderBuffer() const ...@@ -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) void Context::detachTexture(GLuint texture)
{ {
// Simple pass-through to State's detachTexture method, as textures do not require // Simple pass-through to State's detachTexture method, as textures do not require
......
...@@ -55,7 +55,7 @@ class VertexArray; ...@@ -55,7 +55,7 @@ class VertexArray;
class Sampler; class Sampler;
class TransformFeedback; class TransformFeedback;
class Context final : angle::NonCopyable class Context final : public ValidationContext
{ {
public: public:
Context(const egl::Config *config, int clientVersion, const Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess); 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 ...@@ -193,23 +193,16 @@ class Context final : angle::NonCopyable
void pushGroupMarker(GLsizei length, const char *marker); void pushGroupMarker(GLsizei length, const char *marker);
void popGroupMarker(); void popGroupMarker();
void recordError(const Error &error); void recordError(const Error &error) override;
GLenum getError(); GLenum getError();
GLenum getResetStatus(); GLenum getResetStatus();
virtual bool isResetNotificationEnabled(); virtual bool isResetNotificationEnabled();
virtual int getClientVersion() const;
const egl::Config *getConfig() const; const egl::Config *getConfig() const;
EGLenum getClientType() const; EGLenum getClientType() const;
EGLenum getRenderBuffer() 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 &getRendererString() const;
const std::string &getExtensionString() const; const std::string &getExtensionString() const;
...@@ -219,9 +212,7 @@ class Context final : angle::NonCopyable ...@@ -219,9 +212,7 @@ class Context final : angle::NonCopyable
rx::Renderer *getRenderer() { return mRenderer; } rx::Renderer *getRenderer() { return mRenderer; }
State &getState() { return mState; } State &getState() { return mState; }
const State &getState() const { return mState; }
const Data &getData() const { return mData; }
void syncRendererState(); void syncRendererState();
void syncRendererState(const State::DirtyBits &bitMask); void syncRendererState(const State::DirtyBits &bitMask);
...@@ -296,9 +287,6 @@ class Context final : angle::NonCopyable ...@@ -296,9 +287,6 @@ class Context final : angle::NonCopyable
egl::Surface *mCurrentSurface; egl::Surface *mCurrentSurface;
ResourceManager *mResourceManager; ResourceManager *mResourceManager;
// Cache the Data object to avoid re-calling the constructor
Data mData;
}; };
} }
......
...@@ -18,18 +18,37 @@ Data::Data(uintptr_t contextIn, ...@@ -18,18 +18,37 @@ Data::Data(uintptr_t contextIn,
const Caps &capsIn, const Caps &capsIn,
const TextureCapsMap &textureCapsIn, const TextureCapsMap &textureCapsIn,
const Extensions &extensionsIn, const Extensions &extensionsIn,
const ResourceManager *resourceManagerIn) const ResourceManager *resourceManagerIn,
const Limitations &limitationsIn)
: context(contextIn), : context(contextIn),
clientVersion(clientVersionIn), clientVersion(clientVersionIn),
state(&stateIn), state(&stateIn),
caps(&capsIn), caps(&capsIn),
textureCaps(&textureCapsIn), textureCaps(&textureCapsIn),
extensions(&extensionsIn), extensions(&extensionsIn),
resourceManager(resourceManagerIn) resourceManager(resourceManagerIn),
limitations(&limitationsIn)
{} {}
Data::~Data() 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 ...@@ -24,7 +24,8 @@ struct Data final : public angle::NonCopyable
const Caps &caps, const Caps &caps,
const TextureCapsMap &textureCaps, const TextureCapsMap &textureCaps,
const Extensions &extensions, const Extensions &extensions,
const ResourceManager *resourceManager); const ResourceManager *resourceManager,
const Limitations &limitations);
~Data(); ~Data();
uintptr_t context; uintptr_t context;
...@@ -34,6 +35,33 @@ struct Data final : public angle::NonCopyable ...@@ -34,6 +35,33 @@ struct Data final : public angle::NonCopyable
const TextureCapsMap *textureCaps; const TextureCapsMap *textureCaps;
const Extensions *extensions; const Extensions *extensions;
const ResourceManager *resourceManager; 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 ...@@ -29,7 +29,7 @@ namespace gl
{ {
namespace 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::State &state = context->getState();
const gl::Program *program = state.getProgram(); const gl::Program *program = state.getProgram();
...@@ -1466,7 +1466,10 @@ bool ValidateCopyTexImageParametersBase(gl::Context *context, GLenum target, GLi ...@@ -1466,7 +1466,10 @@ bool ValidateCopyTexImageParametersBase(gl::Context *context, GLenum target, GLi
return true; 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) switch (mode)
{ {
...@@ -1657,7 +1660,7 @@ bool ValidateDrawArraysInstancedANGLE(Context *context, GLenum mode, GLint first ...@@ -1657,7 +1660,7 @@ bool ValidateDrawArraysInstancedANGLE(Context *context, GLenum mode, GLint first
return ValidateDrawArraysInstanced(context, mode, first, count, primcount); return ValidateDrawArraysInstanced(context, mode, first, count, primcount);
} }
bool ValidateDrawElements(Context *context, bool ValidateDrawElements(ValidationContext *context,
GLenum mode, GLenum mode,
GLsizei count, GLsizei count,
GLenum type, GLenum type,
......
...@@ -26,6 +26,7 @@ namespace gl ...@@ -26,6 +26,7 @@ namespace gl
class Context; class Context;
class Program; class Program;
class Shader; class Shader;
class ValidationContext;
bool ValidCap(const Context *context, GLenum cap); bool ValidCap(const Context *context, GLenum cap);
bool ValidTextureTarget(const Context *context, GLenum target); bool ValidTextureTarget(const Context *context, GLenum target);
...@@ -93,7 +94,7 @@ bool ValidateDrawArrays(Context *context, GLenum mode, GLint first, GLsizei coun ...@@ -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 ValidateDrawArraysInstanced(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
bool ValidateDrawArraysInstancedANGLE(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, GLenum mode,
GLsizei count, GLsizei count,
GLenum type, 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