Commit 76cdbd51 by Geoff Lang Committed by Commit Bot

Add basic initialization code for ContextNULL so it can run some tests.

BUG=angleproject:1468 Change-Id: I8dfc9a3c71e5638de22bc9d9a5dadfb495ef23a7 Reviewed-on: https://chromium-review.googlesource.com/388846 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent e85587ac
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "angle_gl.h" #include "angle_gl.h"
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "libANGLE/Version.h"
#include <map> #include <map>
#include <set> #include <set>
...@@ -19,6 +20,8 @@ ...@@ -19,6 +20,8 @@
namespace gl namespace gl
{ {
struct Extensions;
typedef std::set<GLuint> SupportedSampleSet; typedef std::set<GLuint> SupportedSampleSet;
struct TextureCaps struct TextureCaps
...@@ -45,6 +48,10 @@ struct TextureCaps ...@@ -45,6 +48,10 @@ struct TextureCaps
GLuint getNearestSamples(GLuint requestedSamples) const; GLuint getNearestSamples(GLuint requestedSamples) const;
}; };
TextureCaps GenerateMinimumTextureCaps(GLenum internalFormat,
const Version &clientVersion,
const Extensions &extensions);
class TextureCapsMap class TextureCapsMap
{ {
public: public:
...@@ -66,6 +73,9 @@ class TextureCapsMap ...@@ -66,6 +73,9 @@ class TextureCapsMap
InternalFormatToCapsMap mCapsMap; InternalFormatToCapsMap mCapsMap;
}; };
TextureCapsMap GenerateMinimumTextureCapsMap(const Version &clientVersion,
const Extensions &extensions);
struct Extensions struct Extensions
{ {
Extensions(); Extensions();
...@@ -374,11 +384,12 @@ struct TypePrecision ...@@ -374,11 +384,12 @@ struct TypePrecision
void setIEEEFloat(); void setIEEEFloat();
void setTwosComplementInt(unsigned int bits); void setTwosComplementInt(unsigned int bits);
void setSimulatedFloat(unsigned int range, unsigned int precision);
void setSimulatedInt(unsigned int range); void setSimulatedInt(unsigned int range);
void get(GLint *returnRange, GLint *returnPrecision) const; void get(GLint *returnRange, GLint *returnPrecision) const;
GLint range[2]; std::array<GLint, 2> range;
GLint precision; GLint precision;
}; };
...@@ -510,6 +521,7 @@ struct Caps ...@@ -510,6 +521,7 @@ struct Caps
GLuint maxSamples; GLuint maxSamples;
}; };
Caps GenerateMinimumCaps(const Version &clientVersion);
} }
namespace egl namespace egl
......
...@@ -110,6 +110,11 @@ class Error final ...@@ -110,6 +110,11 @@ class Error final
mutable std::unique_ptr<std::string> mMessage; mutable std::unique_ptr<std::string> mMessage;
}; };
inline Error NoError()
{
return Error(EGL_SUCCESS);
}
} // namespace egl } // namespace egl
#define ANGLE_CONCAT1(x, y) x##y #define ANGLE_CONCAT1(x, y) x##y
......
...@@ -162,7 +162,8 @@ static GLfloat QueryGLFloatRange(const FunctionsGL *functions, GLenum name, size ...@@ -162,7 +162,8 @@ static GLfloat QueryGLFloatRange(const FunctionsGL *functions, GLenum name, size
static gl::TypePrecision QueryTypePrecision(const FunctionsGL *functions, GLenum shaderType, GLenum precisionType) static gl::TypePrecision QueryTypePrecision(const FunctionsGL *functions, GLenum shaderType, GLenum precisionType)
{ {
gl::TypePrecision precision; gl::TypePrecision precision;
functions->getShaderPrecisionFormat(shaderType, precisionType, precision.range, &precision.precision); functions->getShaderPrecisionFormat(shaderType, precisionType, precision.range.data(),
&precision.precision);
return precision; return precision;
} }
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "libANGLE/renderer/null/BufferNULL.h" #include "libANGLE/renderer/null/BufferNULL.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/utilities.h"
#include "libANGLE/angletypes.h"
namespace rx namespace rx
{ {
...@@ -24,14 +26,21 @@ BufferNULL::~BufferNULL() ...@@ -24,14 +26,21 @@ BufferNULL::~BufferNULL()
gl::Error BufferNULL::setData(GLenum target, const void *data, size_t size, GLenum usage) gl::Error BufferNULL::setData(GLenum target, const void *data, size_t size, GLenum usage)
{ {
UNIMPLEMENTED(); mData.resize(size, 0);
return gl::Error(GL_INVALID_OPERATION); if (size > 0 && data != nullptr)
{
memcpy(mData.data(), data, size);
}
return gl::NoError();
} }
gl::Error BufferNULL::setSubData(GLenum target, const void *data, size_t size, size_t offset) gl::Error BufferNULL::setSubData(GLenum target, const void *data, size_t size, size_t offset)
{ {
UNIMPLEMENTED(); if (size > 0)
return gl::Error(GL_INVALID_OPERATION); {
memcpy(mData.data() + offset, data, size);
}
return gl::NoError();
} }
gl::Error BufferNULL::copySubData(BufferImpl *source, gl::Error BufferNULL::copySubData(BufferImpl *source,
...@@ -39,26 +48,30 @@ gl::Error BufferNULL::copySubData(BufferImpl *source, ...@@ -39,26 +48,30 @@ gl::Error BufferNULL::copySubData(BufferImpl *source,
GLintptr destOffset, GLintptr destOffset,
GLsizeiptr size) GLsizeiptr size)
{ {
UNIMPLEMENTED(); BufferNULL *sourceNULL = GetAs<BufferNULL>(source);
return gl::Error(GL_INVALID_OPERATION); if (size > 0)
{
memcpy(mData.data() + destOffset, sourceNULL->mData.data() + sourceOffset, size);
}
return gl::NoError();
} }
gl::Error BufferNULL::map(GLenum access, GLvoid **mapPtr) gl::Error BufferNULL::map(GLenum access, GLvoid **mapPtr)
{ {
UNIMPLEMENTED(); *mapPtr = mData.data();
return gl::Error(GL_INVALID_OPERATION); return gl::NoError();
} }
gl::Error BufferNULL::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) gl::Error BufferNULL::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
{ {
UNIMPLEMENTED(); *mapPtr = mData.data() + offset;
return gl::Error(GL_INVALID_OPERATION); return gl::NoError();
} }
gl::Error BufferNULL::unmap(GLboolean *result) gl::Error BufferNULL::unmap(GLboolean *result)
{ {
UNIMPLEMENTED(); *result = GL_TRUE;
return gl::Error(GL_INVALID_OPERATION); return gl::NoError();
} }
gl::Error BufferNULL::getIndexRange(GLenum type, gl::Error BufferNULL::getIndexRange(GLenum type,
...@@ -67,8 +80,8 @@ gl::Error BufferNULL::getIndexRange(GLenum type, ...@@ -67,8 +80,8 @@ gl::Error BufferNULL::getIndexRange(GLenum type,
bool primitiveRestartEnabled, bool primitiveRestartEnabled,
gl::IndexRange *outRange) gl::IndexRange *outRange)
{ {
UNIMPLEMENTED(); *outRange = gl::ComputeIndexRange(type, mData.data() + offset, count, primitiveRestartEnabled);
return gl::Error(GL_INVALID_OPERATION); return gl::NoError();
} }
} // namespace rx } // namespace rx
...@@ -36,6 +36,9 @@ class BufferNULL : public BufferImpl ...@@ -36,6 +36,9 @@ class BufferNULL : public BufferImpl
size_t count, size_t count,
bool primitiveRestartEnabled, bool primitiveRestartEnabled,
gl::IndexRange *outRange) override; gl::IndexRange *outRange) override;
private:
std::vector<uint8_t> mData;
}; };
} // namespace rx } // namespace rx
......
...@@ -24,14 +24,12 @@ CompilerNULL::~CompilerNULL() ...@@ -24,14 +24,12 @@ CompilerNULL::~CompilerNULL()
gl::Error CompilerNULL::release() gl::Error CompilerNULL::release()
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
ShShaderOutput CompilerNULL::getTranslatorOutputType() const ShShaderOutput CompilerNULL::getTranslatorOutputType() const
{ {
UNIMPLEMENTED(); return SH_ESSL_OUTPUT;
return ShShaderOutput();
} }
} // namespace rx } // namespace rx
...@@ -11,11 +11,32 @@ ...@@ -11,11 +11,32 @@
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/renderer/null/BufferNULL.h"
#include "libANGLE/renderer/null/CompilerNULL.h"
#include "libANGLE/renderer/null/DisplayNULL.h"
#include "libANGLE/renderer/null/FenceNVNULL.h"
#include "libANGLE/renderer/null/FenceSyncNULL.h"
#include "libANGLE/renderer/null/FramebufferNULL.h"
#include "libANGLE/renderer/null/ImageNULL.h"
#include "libANGLE/renderer/null/PathNULL.h"
#include "libANGLE/renderer/null/ProgramNULL.h"
#include "libANGLE/renderer/null/QueryNULL.h"
#include "libANGLE/renderer/null/RenderbufferNULL.h"
#include "libANGLE/renderer/null/SamplerNULL.h"
#include "libANGLE/renderer/null/ShaderNULL.h"
#include "libANGLE/renderer/null/TextureNULL.h"
#include "libANGLE/renderer/null/TransformFeedbackNULL.h"
#include "libANGLE/renderer/null/VertexArrayNULL.h"
namespace rx namespace rx
{ {
ContextNULL::ContextNULL(const gl::ContextState &state) : ContextImpl(state) ContextNULL::ContextNULL(const gl::ContextState &state) : ContextImpl(state)
{ {
const gl::Version maxClientVersion(3, 1);
mCaps = GenerateMinimumCaps(maxClientVersion);
mExtensions = gl::Extensions();
mTextureCaps = GenerateMinimumTextureCapsMap(maxClientVersion, mExtensions);
} }
ContextNULL::~ContextNULL() ContextNULL::~ContextNULL()
...@@ -24,26 +45,22 @@ ContextNULL::~ContextNULL() ...@@ -24,26 +45,22 @@ ContextNULL::~ContextNULL()
gl::Error ContextNULL::initialize() gl::Error ContextNULL::initialize()
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::flush() gl::Error ContextNULL::flush()
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::finish() gl::Error ContextNULL::finish()
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::drawArrays(GLenum mode, GLint first, GLsizei count) gl::Error ContextNULL::drawArrays(GLenum mode, GLint first, GLsizei count)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::drawArraysInstanced(GLenum mode, gl::Error ContextNULL::drawArraysInstanced(GLenum mode,
...@@ -51,8 +68,7 @@ gl::Error ContextNULL::drawArraysInstanced(GLenum mode, ...@@ -51,8 +68,7 @@ gl::Error ContextNULL::drawArraysInstanced(GLenum mode,
GLsizei count, GLsizei count,
GLsizei instanceCount) GLsizei instanceCount)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::drawElements(GLenum mode, gl::Error ContextNULL::drawElements(GLenum mode,
...@@ -61,8 +77,7 @@ gl::Error ContextNULL::drawElements(GLenum mode, ...@@ -61,8 +77,7 @@ gl::Error ContextNULL::drawElements(GLenum mode,
const GLvoid *indices, const GLvoid *indices,
const gl::IndexRange &indexRange) const gl::IndexRange &indexRange)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::drawElementsInstanced(GLenum mode, gl::Error ContextNULL::drawElementsInstanced(GLenum mode,
...@@ -72,8 +87,7 @@ gl::Error ContextNULL::drawElementsInstanced(GLenum mode, ...@@ -72,8 +87,7 @@ gl::Error ContextNULL::drawElementsInstanced(GLenum mode,
GLsizei instances, GLsizei instances,
const gl::IndexRange &indexRange) const gl::IndexRange &indexRange)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ContextNULL::drawRangeElements(GLenum mode, gl::Error ContextNULL::drawRangeElements(GLenum mode,
...@@ -84,92 +98,225 @@ gl::Error ContextNULL::drawRangeElements(GLenum mode, ...@@ -84,92 +98,225 @@ gl::Error ContextNULL::drawRangeElements(GLenum mode,
const GLvoid *indices, const GLvoid *indices,
const gl::IndexRange &indexRange) const gl::IndexRange &indexRange)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION); }
void ContextNULL::stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask)
{
}
void ContextNULL::stencilStrokePath(const gl::Path *path, GLint reference, GLuint mask)
{
}
void ContextNULL::coverFillPath(const gl::Path *path, GLenum coverMode)
{
}
void ContextNULL::coverStrokePath(const gl::Path *path, GLenum coverMode)
{
}
void ContextNULL::stencilThenCoverFillPath(const gl::Path *path,
GLenum fillMode,
GLuint mask,
GLenum coverMode)
{
}
void ContextNULL::stencilThenCoverStrokePath(const gl::Path *path,
GLint reference,
GLuint mask,
GLenum coverMode)
{
}
void ContextNULL::coverFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues)
{
}
void ContextNULL::coverStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues)
{
}
void ContextNULL::stencilFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues)
{
}
void ContextNULL::stencilStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues)
{
}
void ContextNULL::stencilThenCoverFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues)
{
}
void ContextNULL::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues)
{
}
GLenum ContextNULL::getResetStatus()
{
return GL_NO_ERROR;
}
std::string ContextNULL::getVendorString() const
{
return "NULL";
}
std::string ContextNULL::getRendererDescription() const
{
return "NULL";
}
void ContextNULL::insertEventMarker(GLsizei length, const char *marker)
{
}
void ContextNULL::pushGroupMarker(GLsizei length, const char *marker)
{
}
void ContextNULL::popGroupMarker()
{
}
void ContextNULL::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits)
{
}
GLint ContextNULL::getGPUDisjoint()
{
return 0;
}
GLint64 ContextNULL::getTimestamp()
{
return 0;
}
void ContextNULL::onMakeCurrent(const gl::ContextState &data)
{
}
const gl::Caps &ContextNULL::getNativeCaps() const
{
return mCaps;
}
const gl::TextureCapsMap &ContextNULL::getNativeTextureCaps() const
{
return mTextureCaps;
}
const gl::Extensions &ContextNULL::getNativeExtensions() const
{
return mExtensions;
}
const gl::Limitations &ContextNULL::getNativeLimitations() const
{
return mLimitations;
} }
CompilerImpl *ContextNULL::createCompiler() CompilerImpl *ContextNULL::createCompiler()
{ {
UNIMPLEMENTED(); return new CompilerNULL();
return static_cast<CompilerImpl *>(0);
} }
ShaderImpl *ContextNULL::createShader(const gl::ShaderState &data) ShaderImpl *ContextNULL::createShader(const gl::ShaderState &data)
{ {
UNIMPLEMENTED(); return new ShaderNULL(data);
return static_cast<ShaderImpl *>(0);
} }
ProgramImpl *ContextNULL::createProgram(const gl::ProgramState &data) ProgramImpl *ContextNULL::createProgram(const gl::ProgramState &data)
{ {
UNIMPLEMENTED(); return new ProgramNULL(data);
return static_cast<ProgramImpl *>(0);
} }
FramebufferImpl *ContextNULL::createFramebuffer(const gl::FramebufferState &data) FramebufferImpl *ContextNULL::createFramebuffer(const gl::FramebufferState &data)
{ {
UNIMPLEMENTED(); return new FramebufferNULL(data);
return static_cast<FramebufferImpl *>(0);
} }
TextureImpl *ContextNULL::createTexture(const gl::TextureState &state) TextureImpl *ContextNULL::createTexture(const gl::TextureState &state)
{ {
UNIMPLEMENTED(); return new TextureNULL(state);
return static_cast<TextureImpl *>(0);
} }
RenderbufferImpl *ContextNULL::createRenderbuffer() RenderbufferImpl *ContextNULL::createRenderbuffer()
{ {
UNIMPLEMENTED(); return new RenderbufferNULL();
return static_cast<RenderbufferImpl *>(0);
} }
BufferImpl *ContextNULL::createBuffer(const gl::BufferState &state) BufferImpl *ContextNULL::createBuffer(const gl::BufferState &state)
{ {
UNIMPLEMENTED(); return new BufferNULL(state);
return static_cast<BufferImpl *>(0);
} }
VertexArrayImpl *ContextNULL::createVertexArray(const gl::VertexArrayState &data) VertexArrayImpl *ContextNULL::createVertexArray(const gl::VertexArrayState &data)
{ {
UNIMPLEMENTED(); return new VertexArrayNULL(data);
return static_cast<VertexArrayImpl *>(0);
} }
QueryImpl *ContextNULL::createQuery(GLenum type) QueryImpl *ContextNULL::createQuery(GLenum type)
{ {
UNIMPLEMENTED(); return new QueryNULL(type);
return static_cast<QueryImpl *>(0);
} }
FenceNVImpl *ContextNULL::createFenceNV() FenceNVImpl *ContextNULL::createFenceNV()
{ {
UNIMPLEMENTED(); return new FenceNVNULL();
return static_cast<FenceNVImpl *>(0);
} }
FenceSyncImpl *ContextNULL::createFenceSync() FenceSyncImpl *ContextNULL::createFenceSync()
{ {
UNIMPLEMENTED(); return new FenceSyncNULL();
return static_cast<FenceSyncImpl *>(0);
} }
TransformFeedbackImpl *ContextNULL::createTransformFeedback(const gl::TransformFeedbackState &state) TransformFeedbackImpl *ContextNULL::createTransformFeedback(const gl::TransformFeedbackState &state)
{ {
UNIMPLEMENTED(); return new TransformFeedbackNULL(state);
return static_cast<TransformFeedbackImpl *>(0);
} }
SamplerImpl *ContextNULL::createSampler() SamplerImpl *ContextNULL::createSampler()
{ {
UNIMPLEMENTED(); return new SamplerNULL();
return static_cast<SamplerImpl *>(0);
} }
std::vector<PathImpl *> ContextNULL::createPaths(GLsizei range) std::vector<PathImpl *> ContextNULL::createPaths(GLsizei range)
{ {
UNIMPLEMENTED(); std::vector<PathImpl *> result(range);
return std::vector<PathImpl *>(); for (GLsizei idx = 0; idx < range; idx++)
{
result[idx] = new PathNULL();
}
return result;
} }
} // namespace rx } // namespace rx
...@@ -54,6 +54,78 @@ class ContextNULL : public ContextImpl ...@@ -54,6 +54,78 @@ class ContextNULL : public ContextImpl
const gl::IndexRange &indexRange) override; const gl::IndexRange &indexRange) override;
// CHROMIUM_path_rendering path drawing methods. // CHROMIUM_path_rendering path drawing methods.
void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
void stencilStrokePath(const gl::Path *path, GLint reference, GLuint mask) override;
void coverFillPath(const gl::Path *path, GLenum coverMode) override;
void coverStrokePath(const gl::Path *path, GLenum coverMode) override;
void stencilThenCoverFillPath(const gl::Path *path,
GLenum fillMode,
GLuint mask,
GLenum coverMode) override;
void stencilThenCoverStrokePath(const gl::Path *path,
GLint reference,
GLuint mask,
GLenum coverMode) override;
void coverFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues) override;
void coverStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues) override;
void stencilFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues) override;
void stencilStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues) override;
void stencilThenCoverFillPathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues) override;
void stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues) override;
// Device loss
GLenum getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
std::string getRendererDescription() const override;
// Debug markers.
void insertEventMarker(GLsizei length, const char *marker) override;
void pushGroupMarker(GLsizei length, const char *marker) override;
void popGroupMarker() override;
// State sync with dirty bits.
void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits) override;
// Disjoint timer queries
GLint getGPUDisjoint() override;
GLint64 getTimestamp() override;
// Context switching
void onMakeCurrent(const gl::ContextState &data) override;
// Native capabilities, unmodified by gl::Context.
const gl::Caps &getNativeCaps() const override;
const gl::TextureCapsMap &getNativeTextureCaps() const override;
const gl::Extensions &getNativeExtensions() const override;
const gl::Limitations &getNativeLimitations() const override;
// Shader creation // Shader creation
CompilerImpl *createCompiler() override; CompilerImpl *createCompiler() override;
...@@ -88,6 +160,12 @@ class ContextNULL : public ContextImpl ...@@ -88,6 +160,12 @@ class ContextNULL : public ContextImpl
SamplerImpl *createSampler() override; SamplerImpl *createSampler() override;
std::vector<PathImpl *> createPaths(GLsizei range) override; std::vector<PathImpl *> createPaths(GLsizei range) override;
private:
gl::Caps mCaps;
gl::TextureCapsMap mTextureCaps;
gl::Extensions mExtensions;
gl::Limitations mLimitations;
}; };
} // namespace rx } // namespace rx
......
...@@ -30,19 +30,16 @@ egl::Error DeviceNULL::getDevice(void **outValue) ...@@ -30,19 +30,16 @@ egl::Error DeviceNULL::getDevice(void **outValue)
EGLint DeviceNULL::getType() EGLint DeviceNULL::getType()
{ {
UNIMPLEMENTED(); return 0;
return EGLint();
} }
void DeviceNULL::generateExtensions(egl::DeviceExtensions *outExtensions) const void DeviceNULL::generateExtensions(egl::DeviceExtensions *outExtensions) const
{ {
UNIMPLEMENTED();
} }
bool DeviceNULL::deviceExternallySourced() bool DeviceNULL::deviceExternallySourced()
{ {
UNIMPLEMENTED(); return false;
return bool();
} }
} // namespace rx } // namespace rx
...@@ -11,10 +11,15 @@ ...@@ -11,10 +11,15 @@
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/renderer/null/ContextNULL.h"
#include "libANGLE/renderer/null/DeviceNULL.h"
#include "libANGLE/renderer/null/ImageNULL.h"
#include "libANGLE/renderer/null/SurfaceNULL.h"
namespace rx namespace rx
{ {
DisplayNULL::DisplayNULL() : DisplayImpl() DisplayNULL::DisplayNULL() : DisplayImpl(), mDevice(nullptr)
{ {
} }
...@@ -24,77 +29,106 @@ DisplayNULL::~DisplayNULL() ...@@ -24,77 +29,106 @@ DisplayNULL::~DisplayNULL()
egl::Error DisplayNULL::initialize(egl::Display *display) egl::Error DisplayNULL::initialize(egl::Display *display)
{ {
UNIMPLEMENTED(); mDevice = new DeviceNULL();
return egl::Error(EGL_BAD_ACCESS); return egl::NoError();
} }
void DisplayNULL::terminate() void DisplayNULL::terminate()
{ {
UNIMPLEMENTED(); SafeDelete(mDevice);
} }
egl::Error DisplayNULL::makeCurrent(egl::Surface *drawSurface, egl::Error DisplayNULL::makeCurrent(egl::Surface *drawSurface,
egl::Surface *readSurface, egl::Surface *readSurface,
gl::Context *context) gl::Context *context)
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
egl::ConfigSet DisplayNULL::generateConfigs() egl::ConfigSet DisplayNULL::generateConfigs()
{ {
UNIMPLEMENTED(); egl::Config config;
return egl::ConfigSet(); config.renderTargetFormat = GL_RGBA8;
config.depthStencilFormat = GL_DEPTH24_STENCIL8;
config.bufferSize = 32;
config.redSize = 8;
config.greenSize = 8;
config.blueSize = 8;
config.alphaSize = 8;
config.alphaMaskSize = 0;
config.bindToTextureRGB = EGL_TRUE;
config.bindToTextureRGBA = EGL_TRUE;
config.colorBufferType = EGL_RGB_BUFFER;
config.configCaveat = EGL_NONE;
config.conformant = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
config.depthSize = 24;
config.level = 0;
config.matchNativePixmap = EGL_NONE;
config.maxPBufferWidth = 0;
config.maxPBufferHeight = 0;
config.maxPBufferPixels = 0;
config.maxSwapInterval = 1;
config.minSwapInterval = 1;
config.nativeRenderable = EGL_TRUE;
config.nativeVisualID = 0;
config.nativeVisualType = EGL_NONE;
config.renderableType = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
config.sampleBuffers = 0;
config.samples = 0;
config.stencilSize = 8;
config.surfaceType = EGL_WINDOW_BIT | EGL_PBUFFER_BIT;
config.optimalOrientation = 0;
config.transparentType = EGL_NONE;
config.transparentRedValue = 0;
config.transparentGreenValue = 0;
config.transparentBlueValue = 0;
egl::ConfigSet configSet;
configSet.add(config);
return configSet;
} }
bool DisplayNULL::testDeviceLost() bool DisplayNULL::testDeviceLost()
{ {
UNIMPLEMENTED(); return false;
return bool();
} }
egl::Error DisplayNULL::restoreLostDevice() egl::Error DisplayNULL::restoreLostDevice()
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
bool DisplayNULL::isValidNativeWindow(EGLNativeWindowType window) const bool DisplayNULL::isValidNativeWindow(EGLNativeWindowType window) const
{ {
UNIMPLEMENTED(); return true;
return bool();
} }
std::string DisplayNULL::getVendorString() const std::string DisplayNULL::getVendorString() const
{ {
UNIMPLEMENTED(); return "NULL";
return std::string();
} }
egl::Error DisplayNULL::getDevice(DeviceImpl **device) egl::Error DisplayNULL::getDevice(DeviceImpl **device)
{ {
UNIMPLEMENTED(); *device = mDevice;
return egl::Error(EGL_BAD_ACCESS); return egl::NoError();
} }
egl::Error DisplayNULL::waitClient() const egl::Error DisplayNULL::waitClient() const
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
egl::Error DisplayNULL::waitNative(EGLint engine, egl::Error DisplayNULL::waitNative(EGLint engine,
egl::Surface *drawSurface, egl::Surface *drawSurface,
egl::Surface *readSurface) const egl::Surface *readSurface) const
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
gl::Version DisplayNULL::getMaxSupportedESVersion() const gl::Version DisplayNULL::getMaxSupportedESVersion() const
{ {
UNIMPLEMENTED(); return gl::Version(3, 2);
return gl::Version();
} }
SurfaceImpl *DisplayNULL::createWindowSurface(const egl::SurfaceState &state, SurfaceImpl *DisplayNULL::createWindowSurface(const egl::SurfaceState &state,
...@@ -102,16 +136,14 @@ SurfaceImpl *DisplayNULL::createWindowSurface(const egl::SurfaceState &state, ...@@ -102,16 +136,14 @@ SurfaceImpl *DisplayNULL::createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window, EGLNativeWindowType window,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); return new SurfaceNULL(state);
return static_cast<SurfaceImpl *>(0);
} }
SurfaceImpl *DisplayNULL::createPbufferSurface(const egl::SurfaceState &state, SurfaceImpl *DisplayNULL::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration, const egl::Config *configuration,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); return new SurfaceNULL(state);
return static_cast<SurfaceImpl *>(0);
} }
SurfaceImpl *DisplayNULL::createPbufferFromClientBuffer(const egl::SurfaceState &state, SurfaceImpl *DisplayNULL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
...@@ -120,8 +152,7 @@ SurfaceImpl *DisplayNULL::createPbufferFromClientBuffer(const egl::SurfaceState ...@@ -120,8 +152,7 @@ SurfaceImpl *DisplayNULL::createPbufferFromClientBuffer(const egl::SurfaceState
EGLClientBuffer buffer, EGLClientBuffer buffer,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); return new SurfaceNULL(state);
return static_cast<SurfaceImpl *>(0);
} }
SurfaceImpl *DisplayNULL::createPixmapSurface(const egl::SurfaceState &state, SurfaceImpl *DisplayNULL::createPixmapSurface(const egl::SurfaceState &state,
...@@ -129,22 +160,19 @@ SurfaceImpl *DisplayNULL::createPixmapSurface(const egl::SurfaceState &state, ...@@ -129,22 +160,19 @@ SurfaceImpl *DisplayNULL::createPixmapSurface(const egl::SurfaceState &state,
NativePixmapType nativePixmap, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); return new SurfaceNULL(state);
return static_cast<SurfaceImpl *>(0);
} }
ImageImpl *DisplayNULL::createImage(EGLenum target, ImageImpl *DisplayNULL::createImage(EGLenum target,
egl::ImageSibling *buffer, egl::ImageSibling *buffer,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); return new ImageNULL();
return static_cast<ImageImpl *>(0);
} }
ContextImpl *DisplayNULL::createContext(const gl::ContextState &state) ContextImpl *DisplayNULL::createContext(const gl::ContextState &state)
{ {
UNIMPLEMENTED(); return new ContextNULL(state);
return static_cast<ContextImpl *>(0);
} }
StreamProducerImpl *DisplayNULL::createStreamProducerD3DTextureNV12( StreamProducerImpl *DisplayNULL::createStreamProducerD3DTextureNV12(
...@@ -152,17 +180,33 @@ StreamProducerImpl *DisplayNULL::createStreamProducerD3DTextureNV12( ...@@ -152,17 +180,33 @@ StreamProducerImpl *DisplayNULL::createStreamProducerD3DTextureNV12(
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return static_cast<StreamProducerImpl *>(0); return nullptr;
} }
void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) const void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) const
{ {
UNIMPLEMENTED(); outExtensions->createContextRobustness = true;
outExtensions->postSubBuffer = true;
outExtensions->createContext = true;
outExtensions->deviceQuery = true;
outExtensions->image = true;
outExtensions->imageBase = true;
outExtensions->glTexture2DImage = true;
outExtensions->glTextureCubemapImage = true;
outExtensions->glTexture3DImage = true;
outExtensions->glRenderbufferImage = true;
outExtensions->getAllProcAddresses = true;
outExtensions->flexibleSurfaceCompatibility = true;
outExtensions->directComposition = true;
outExtensions->createContextNoError = true;
outExtensions->createContextWebGLCompatibility = true;
outExtensions->createContextBindGeneratesResource = true;
outExtensions->swapBuffersWithDamage = true;
} }
void DisplayNULL::generateCaps(egl::Caps *outCaps) const void DisplayNULL::generateCaps(egl::Caps *outCaps) const
{ {
UNIMPLEMENTED(); outCaps->textureNPOT = true;
} }
} // namespace rx } // namespace rx
...@@ -75,6 +75,8 @@ class DisplayNULL : public DisplayImpl ...@@ -75,6 +75,8 @@ class DisplayNULL : public DisplayImpl
private: private:
void generateExtensions(egl::DisplayExtensions *outExtensions) const override; void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override; void generateCaps(egl::Caps *outCaps) const override;
DeviceImpl *mDevice;
}; };
} // namespace rx } // namespace rx
......
...@@ -26,28 +26,24 @@ FramebufferNULL::~FramebufferNULL() ...@@ -26,28 +26,24 @@ FramebufferNULL::~FramebufferNULL()
gl::Error FramebufferNULL::discard(size_t count, const GLenum *attachments) gl::Error FramebufferNULL::discard(size_t count, const GLenum *attachments)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::invalidate(size_t count, const GLenum *attachments) gl::Error FramebufferNULL::invalidate(size_t count, const GLenum *attachments)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::invalidateSub(size_t count, gl::Error FramebufferNULL::invalidateSub(size_t count,
const GLenum *attachments, const GLenum *attachments,
const gl::Rectangle &area) const gl::Rectangle &area)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::clear(ContextImpl *context, GLbitfield mask) gl::Error FramebufferNULL::clear(ContextImpl *context, GLbitfield mask)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context, gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context,
...@@ -55,8 +51,7 @@ gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context, ...@@ -55,8 +51,7 @@ gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context,
GLint drawbuffer, GLint drawbuffer,
const GLfloat *values) const GLfloat *values)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context, gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context,
...@@ -64,8 +59,7 @@ gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context, ...@@ -64,8 +59,7 @@ gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context,
GLint drawbuffer, GLint drawbuffer,
const GLuint *values) const GLuint *values)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context, gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context,
...@@ -73,8 +67,7 @@ gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context, ...@@ -73,8 +67,7 @@ gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context,
GLint drawbuffer, GLint drawbuffer,
const GLint *values) const GLint *values)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context, gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context,
...@@ -83,8 +76,7 @@ gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context, ...@@ -83,8 +76,7 @@ gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context,
GLfloat depth, GLfloat depth,
GLint stencil) GLint stencil)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
GLenum FramebufferNULL::getImplementationColorReadFormat() const GLenum FramebufferNULL::getImplementationColorReadFormat() const
...@@ -119,8 +111,7 @@ gl::Error FramebufferNULL::readPixels(ContextImpl *context, ...@@ -119,8 +111,7 @@ gl::Error FramebufferNULL::readPixels(ContextImpl *context,
GLenum type, GLenum type,
GLvoid *pixels) const GLvoid *pixels) const
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error FramebufferNULL::blit(ContextImpl *context, gl::Error FramebufferNULL::blit(ContextImpl *context,
...@@ -129,19 +120,16 @@ gl::Error FramebufferNULL::blit(ContextImpl *context, ...@@ -129,19 +120,16 @@ gl::Error FramebufferNULL::blit(ContextImpl *context,
GLbitfield mask, GLbitfield mask,
GLenum filter) GLenum filter)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
bool FramebufferNULL::checkStatus() const bool FramebufferNULL::checkStatus() const
{ {
UNIMPLEMENTED(); return true;
return bool();
} }
void FramebufferNULL::syncState(const gl::Framebuffer::DirtyBits &dirtyBits) void FramebufferNULL::syncState(const gl::Framebuffer::DirtyBits &dirtyBits)
{ {
UNIMPLEMENTED();
} }
} // namespace rx } // namespace rx
...@@ -24,91 +24,74 @@ ProgramNULL::~ProgramNULL() ...@@ -24,91 +24,74 @@ ProgramNULL::~ProgramNULL()
LinkResult ProgramNULL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) LinkResult ProgramNULL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
{ {
UNIMPLEMENTED(); return true;
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ProgramNULL::save(gl::BinaryOutputStream *stream) gl::Error ProgramNULL::save(gl::BinaryOutputStream *stream)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
void ProgramNULL::setBinaryRetrievableHint(bool retrievable) void ProgramNULL::setBinaryRetrievableHint(bool retrievable)
{ {
UNIMPLEMENTED();
} }
LinkResult ProgramNULL::link(const gl::ContextState &data, gl::InfoLog &infoLog) LinkResult ProgramNULL::link(const gl::ContextState &data, gl::InfoLog &infoLog)
{ {
UNIMPLEMENTED(); return true;
return gl::Error(GL_INVALID_OPERATION);
} }
GLboolean ProgramNULL::validate(const gl::Caps &caps, gl::InfoLog *infoLog) GLboolean ProgramNULL::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
{ {
UNIMPLEMENTED(); return GL_TRUE;
return GLboolean();
} }
void ProgramNULL::setUniform1fv(GLint location, GLsizei count, const GLfloat *v) void ProgramNULL::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform2fv(GLint location, GLsizei count, const GLfloat *v) void ProgramNULL::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform3fv(GLint location, GLsizei count, const GLfloat *v) void ProgramNULL::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform4fv(GLint location, GLsizei count, const GLfloat *v) void ProgramNULL::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform1iv(GLint location, GLsizei count, const GLint *v) void ProgramNULL::setUniform1iv(GLint location, GLsizei count, const GLint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform2iv(GLint location, GLsizei count, const GLint *v) void ProgramNULL::setUniform2iv(GLint location, GLsizei count, const GLint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform3iv(GLint location, GLsizei count, const GLint *v) void ProgramNULL::setUniform3iv(GLint location, GLsizei count, const GLint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform4iv(GLint location, GLsizei count, const GLint *v) void ProgramNULL::setUniform4iv(GLint location, GLsizei count, const GLint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform1uiv(GLint location, GLsizei count, const GLuint *v) void ProgramNULL::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform2uiv(GLint location, GLsizei count, const GLuint *v) void ProgramNULL::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform3uiv(GLint location, GLsizei count, const GLuint *v) void ProgramNULL::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v) void ProgramNULL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix2fv(GLint location, void ProgramNULL::setUniformMatrix2fv(GLint location,
...@@ -116,7 +99,6 @@ void ProgramNULL::setUniformMatrix2fv(GLint location, ...@@ -116,7 +99,6 @@ void ProgramNULL::setUniformMatrix2fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix3fv(GLint location, void ProgramNULL::setUniformMatrix3fv(GLint location,
...@@ -124,7 +106,6 @@ void ProgramNULL::setUniformMatrix3fv(GLint location, ...@@ -124,7 +106,6 @@ void ProgramNULL::setUniformMatrix3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix4fv(GLint location, void ProgramNULL::setUniformMatrix4fv(GLint location,
...@@ -132,7 +113,6 @@ void ProgramNULL::setUniformMatrix4fv(GLint location, ...@@ -132,7 +113,6 @@ void ProgramNULL::setUniformMatrix4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix2x3fv(GLint location, void ProgramNULL::setUniformMatrix2x3fv(GLint location,
...@@ -140,7 +120,6 @@ void ProgramNULL::setUniformMatrix2x3fv(GLint location, ...@@ -140,7 +120,6 @@ void ProgramNULL::setUniformMatrix2x3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix3x2fv(GLint location, void ProgramNULL::setUniformMatrix3x2fv(GLint location,
...@@ -148,7 +127,6 @@ void ProgramNULL::setUniformMatrix3x2fv(GLint location, ...@@ -148,7 +127,6 @@ void ProgramNULL::setUniformMatrix3x2fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix2x4fv(GLint location, void ProgramNULL::setUniformMatrix2x4fv(GLint location,
...@@ -156,7 +134,6 @@ void ProgramNULL::setUniformMatrix2x4fv(GLint location, ...@@ -156,7 +134,6 @@ void ProgramNULL::setUniformMatrix2x4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix4x2fv(GLint location, void ProgramNULL::setUniformMatrix4x2fv(GLint location,
...@@ -164,7 +141,6 @@ void ProgramNULL::setUniformMatrix4x2fv(GLint location, ...@@ -164,7 +141,6 @@ void ProgramNULL::setUniformMatrix4x2fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix3x4fv(GLint location, void ProgramNULL::setUniformMatrix3x4fv(GLint location,
...@@ -172,7 +148,6 @@ void ProgramNULL::setUniformMatrix3x4fv(GLint location, ...@@ -172,7 +148,6 @@ void ProgramNULL::setUniformMatrix3x4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformMatrix4x3fv(GLint location, void ProgramNULL::setUniformMatrix4x3fv(GLint location,
...@@ -180,12 +155,10 @@ void ProgramNULL::setUniformMatrix4x3fv(GLint location, ...@@ -180,12 +155,10 @@ void ProgramNULL::setUniformMatrix4x3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED();
} }
void ProgramNULL::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) void ProgramNULL::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{ {
UNIMPLEMENTED();
} }
bool ProgramNULL::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const bool ProgramNULL::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
...@@ -206,7 +179,6 @@ void ProgramNULL::setPathFragmentInputGen(const std::string &inputName, ...@@ -206,7 +179,6 @@ void ProgramNULL::setPathFragmentInputGen(const std::string &inputName,
GLint components, GLint components,
const GLfloat *coeffs) const GLfloat *coeffs)
{ {
UNIMPLEMENTED();
} }
} // namespace rx } // namespace rx
...@@ -25,20 +25,18 @@ ShaderNULL::~ShaderNULL() ...@@ -25,20 +25,18 @@ ShaderNULL::~ShaderNULL()
ShCompileOptions ShaderNULL::prepareSourceAndReturnOptions(std::stringstream *sourceStream, ShCompileOptions ShaderNULL::prepareSourceAndReturnOptions(std::stringstream *sourceStream,
std::string *sourcePath) std::string *sourcePath)
{ {
UNIMPLEMENTED(); *sourceStream << mData.getSource();
return ShCompileOptions(); return 0;
} }
bool ShaderNULL::postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) bool ShaderNULL::postTranslateCompile(gl::Compiler *compiler, std::string *infoLog)
{ {
UNIMPLEMENTED(); return true;
return bool();
} }
std::string ShaderNULL::getDebugInfo() const std::string ShaderNULL::getDebugInfo() const
{ {
UNIMPLEMENTED(); return "";
return std::string();
} }
} // namespace rx } // namespace rx
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/renderer/null/FramebufferNULL.h"
namespace rx namespace rx
{ {
...@@ -24,80 +26,64 @@ SurfaceNULL::~SurfaceNULL() ...@@ -24,80 +26,64 @@ SurfaceNULL::~SurfaceNULL()
egl::Error SurfaceNULL::initialize() egl::Error SurfaceNULL::initialize()
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
FramebufferImpl *SurfaceNULL::createDefaultFramebuffer(const gl::FramebufferState &state) FramebufferImpl *SurfaceNULL::createDefaultFramebuffer(const gl::FramebufferState &state)
{ {
UNIMPLEMENTED(); return new FramebufferNULL(state);
return static_cast<FramebufferImpl *>(0);
} }
egl::Error SurfaceNULL::swap() egl::Error SurfaceNULL::swap()
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
egl::Error SurfaceNULL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) egl::Error SurfaceNULL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
egl::Error SurfaceNULL::querySurfacePointerANGLE(EGLint attribute, void **value) egl::Error SurfaceNULL::querySurfacePointerANGLE(EGLint attribute, void **value)
{ {
UNIMPLEMENTED(); UNREACHABLE();
return egl::Error(EGL_BAD_ACCESS); return egl::NoError();
} }
egl::Error SurfaceNULL::bindTexImage(gl::Texture *texture, EGLint buffer) egl::Error SurfaceNULL::bindTexImage(gl::Texture *texture, EGLint buffer)
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
egl::Error SurfaceNULL::releaseTexImage(EGLint buffer) egl::Error SurfaceNULL::releaseTexImage(EGLint buffer)
{ {
UNIMPLEMENTED(); return egl::NoError();
return egl::Error(EGL_BAD_ACCESS);
} }
void SurfaceNULL::setSwapInterval(EGLint interval) void SurfaceNULL::setSwapInterval(EGLint interval)
{ {
UNIMPLEMENTED();
} }
EGLint SurfaceNULL::getWidth() const EGLint SurfaceNULL::getWidth() const
{ {
UNIMPLEMENTED(); // TODO(geofflang): Read from an actual window?
return EGLint(); return 100;
} }
EGLint SurfaceNULL::getHeight() const EGLint SurfaceNULL::getHeight() const
{ {
UNIMPLEMENTED(); // TODO(geofflang): Read from an actual window?
return EGLint(); return 100;
} }
EGLint SurfaceNULL::isPostSubBufferSupported() const EGLint SurfaceNULL::isPostSubBufferSupported() const
{ {
UNIMPLEMENTED(); return EGL_TRUE;
return EGLint();
} }
EGLint SurfaceNULL::getSwapBehavior() const EGLint SurfaceNULL::getSwapBehavior() const
{ {
UNIMPLEMENTED(); return EGL_BUFFER_PRESERVED;
return EGLint();
}
gl::Error SurfaceNULL::getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &target,
FramebufferAttachmentRenderTarget **rtOut)
{
UNIMPLEMENTED();
return gl::Error(GL_INVALID_OPERATION);
} }
} // namespace rx } // namespace rx
...@@ -36,9 +36,6 @@ class SurfaceNULL : public SurfaceImpl ...@@ -36,9 +36,6 @@ class SurfaceNULL : public SurfaceImpl
EGLint isPostSubBufferSupported() const override; EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override; EGLint getSwapBehavior() const override;
gl::Error getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &target,
FramebufferAttachmentRenderTarget **rtOut) override;
}; };
} // namespace rx } // namespace rx
......
...@@ -31,8 +31,9 @@ gl::Error TextureNULL::setImage(GLenum target, ...@@ -31,8 +31,9 @@ gl::Error TextureNULL::setImage(GLenum target,
const gl::PixelUnpackState &unpack, const gl::PixelUnpackState &unpack,
const uint8_t *pixels) const uint8_t *pixels)
{ {
UNIMPLEMENTED(); // TODO(geofflang): Read all incoming pixel data (maybe hash it?) to make sure we don't read out
return gl::Error(GL_INVALID_OPERATION); // of bounds due to validation bugs.
return gl::NoError();
} }
gl::Error TextureNULL::setSubImage(GLenum target, gl::Error TextureNULL::setSubImage(GLenum target,
...@@ -43,8 +44,7 @@ gl::Error TextureNULL::setSubImage(GLenum target, ...@@ -43,8 +44,7 @@ gl::Error TextureNULL::setSubImage(GLenum target,
const gl::PixelUnpackState &unpack, const gl::PixelUnpackState &unpack,
const uint8_t *pixels) const uint8_t *pixels)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::setCompressedImage(GLenum target, gl::Error TextureNULL::setCompressedImage(GLenum target,
...@@ -55,8 +55,7 @@ gl::Error TextureNULL::setCompressedImage(GLenum target, ...@@ -55,8 +55,7 @@ gl::Error TextureNULL::setCompressedImage(GLenum target,
size_t imageSize, size_t imageSize,
const uint8_t *pixels) const uint8_t *pixels)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::setCompressedSubImage(GLenum target, gl::Error TextureNULL::setCompressedSubImage(GLenum target,
...@@ -67,8 +66,7 @@ gl::Error TextureNULL::setCompressedSubImage(GLenum target, ...@@ -67,8 +66,7 @@ gl::Error TextureNULL::setCompressedSubImage(GLenum target,
size_t imageSize, size_t imageSize,
const uint8_t *pixels) const uint8_t *pixels)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::copyImage(GLenum target, gl::Error TextureNULL::copyImage(GLenum target,
...@@ -77,8 +75,7 @@ gl::Error TextureNULL::copyImage(GLenum target, ...@@ -77,8 +75,7 @@ gl::Error TextureNULL::copyImage(GLenum target,
GLenum internalFormat, GLenum internalFormat,
const gl::Framebuffer *source) const gl::Framebuffer *source)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::copySubImage(GLenum target, gl::Error TextureNULL::copySubImage(GLenum target,
...@@ -87,8 +84,7 @@ gl::Error TextureNULL::copySubImage(GLenum target, ...@@ -87,8 +84,7 @@ gl::Error TextureNULL::copySubImage(GLenum target,
const gl::Rectangle &sourceArea, const gl::Rectangle &sourceArea,
const gl::Framebuffer *source) const gl::Framebuffer *source)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::setStorage(GLenum target, gl::Error TextureNULL::setStorage(GLenum target,
...@@ -96,48 +92,40 @@ gl::Error TextureNULL::setStorage(GLenum target, ...@@ -96,48 +92,40 @@ gl::Error TextureNULL::setStorage(GLenum target,
GLenum internalFormat, GLenum internalFormat,
const gl::Extents &size) const gl::Extents &size)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::setEGLImageTarget(GLenum target, egl::Image *image) gl::Error TextureNULL::setEGLImageTarget(GLenum target, egl::Image *image)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::setImageExternal(GLenum target, gl::Error TextureNULL::setImageExternal(GLenum target,
egl::Stream *stream, egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) const egl::Stream::GLTextureDescription &desc)
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error TextureNULL::generateMipmap() gl::Error TextureNULL::generateMipmap()
{ {
UNIMPLEMENTED(); return gl::NoError();
return gl::Error(GL_INVALID_OPERATION);
} }
void TextureNULL::setBaseLevel(GLuint baseLevel) void TextureNULL::setBaseLevel(GLuint baseLevel)
{ {
UNIMPLEMENTED();
} }
void TextureNULL::bindTexImage(egl::Surface *surface) void TextureNULL::bindTexImage(egl::Surface *surface)
{ {
UNIMPLEMENTED();
} }
void TextureNULL::releaseTexImage() void TextureNULL::releaseTexImage()
{ {
UNIMPLEMENTED();
} }
void TextureNULL::syncState(const gl::Texture::DirtyBits &dirtyBits) void TextureNULL::syncState(const gl::Texture::DirtyBits &dirtyBits)
{ {
UNIMPLEMENTED();
} }
} // namespace rx } // namespace rx
...@@ -805,6 +805,13 @@ ...@@ -805,6 +805,13 @@
'ANGLE_ENABLE_VULKAN', 'ANGLE_ENABLE_VULKAN',
], ],
}], }],
['angle_enable_null==1',
{
'defines':
[
'ANGLE_ENABLE_NULL',
],
}],
], ],
}, },
'conditions': 'conditions':
......
...@@ -101,6 +101,11 @@ TEST_P(RendererTest, RequestedRendererCreated) ...@@ -101,6 +101,11 @@ TEST_P(RendererTest, RequestedRendererCreated)
ASSERT_TRUE(found); ASSERT_TRUE(found);
} }
if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE)
{
ASSERT_TRUE(IsNULL());
}
EGLint glesMajorVersion = GetParam().majorVersion; EGLint glesMajorVersion = GetParam().majorVersion;
// Ensure that the renderer string contains GL ES 3.0, if we requested a GL ES 3.0 // Ensure that the renderer string contains GL ES 3.0, if we requested a GL ES 3.0
...@@ -119,6 +124,12 @@ TEST_P(RendererTest, RequestedRendererCreated) ...@@ -119,6 +124,12 @@ TEST_P(RendererTest, RequestedRendererCreated)
// Perform a simple operation (clear and read pixels) to verify the device is working // Perform a simple operation (clear and read pixels) to verify the device is working
TEST_P(RendererTest, SimpleOperation) TEST_P(RendererTest, SimpleOperation)
{ {
if (IsNULL())
{
std::cout << "ANGLE NULL backend clears are not functional" << std::endl;
return;
}
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
...@@ -206,5 +217,10 @@ ANGLE_INSTANTIATE_TEST(RendererTest, ...@@ -206,5 +217,10 @@ ANGLE_INSTANTIATE_TEST(RendererTest,
ES3_OPENGLES(), ES3_OPENGLES(),
ES3_OPENGLES(3, 0), ES3_OPENGLES(3, 0),
ES3_OPENGLES(3, 1), ES3_OPENGLES(3, 1),
ES3_OPENGLES(3, 2)); ES3_OPENGLES(3, 2),
// All ES version on top of the NULL backend
ES2_NULL(),
ES3_NULL(),
ES31_NULL());
} }
...@@ -758,6 +758,12 @@ bool IsOpenGL() ...@@ -758,6 +758,12 @@ bool IsOpenGL()
return (rendererString.find("OpenGL") != std::string::npos); return (rendererString.find("OpenGL") != std::string::npos);
} }
bool IsNULL()
{
std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
return (rendererString.find("NULL") != std::string::npos);
}
bool IsAndroid() bool IsAndroid()
{ {
#if defined(ANGLE_PLATFORM_ANDROID) #if defined(ANGLE_PLATFORM_ANDROID)
......
...@@ -246,6 +246,7 @@ bool IsD3DSM3(); ...@@ -246,6 +246,7 @@ bool IsD3DSM3();
bool IsDesktopOpenGL(); bool IsDesktopOpenGL();
bool IsOpenGLES(); bool IsOpenGLES();
bool IsOpenGL(); bool IsOpenGL();
bool IsNULL();
// Operating systems // Operating systems
bool IsAndroid(); bool IsAndroid();
......
...@@ -70,7 +70,10 @@ std::ostream &operator<<(std::ostream& stream, const PlatformParameters &pp) ...@@ -70,7 +70,10 @@ std::ostream &operator<<(std::ostream& stream, const PlatformParameters &pp)
break; break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE: case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
stream << "OPENGLES"; stream << "OPENGLES";
break; break;
case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
stream << "NULL";
break;
case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE: case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
stream << "DEFAULT"; stream << "DEFAULT";
break; break;
...@@ -595,4 +598,19 @@ PlatformParameters ES31_OPENGL(EGLint major, EGLint minor) ...@@ -595,4 +598,19 @@ PlatformParameters ES31_OPENGL(EGLint major, EGLint minor)
return PlatformParameters(3, 1, egl_platform::OPENGL(major, minor)); return PlatformParameters(3, 1, egl_platform::OPENGL(major, minor));
} }
PlatformParameters ES2_NULL()
{
return PlatformParameters(2, 0, EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE));
}
PlatformParameters ES3_NULL()
{
return PlatformParameters(3, 0, EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE));
}
PlatformParameters ES31_NULL()
{
return PlatformParameters(3, 1, EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE));
}
} // namespace angle } // namespace angle
...@@ -139,6 +139,10 @@ PlatformParameters ES3_OPENGLES(EGLint major, EGLint minor); ...@@ -139,6 +139,10 @@ PlatformParameters ES3_OPENGLES(EGLint major, EGLint minor);
PlatformParameters ES31_OPENGLES(); PlatformParameters ES31_OPENGLES();
PlatformParameters ES31_OPENGLES(EGLint major, EGLint minor); PlatformParameters ES31_OPENGLES(EGLint major, EGLint minor);
PlatformParameters ES2_NULL();
PlatformParameters ES3_NULL();
PlatformParameters ES31_NULL();
} // namespace angle } // namespace angle
#endif // ANGLE_TEST_CONFIGS_H_ #endif // ANGLE_TEST_CONFIGS_H_
...@@ -45,6 +45,12 @@ bool IsPlatformAvailable(const PlatformParameters &param) ...@@ -45,6 +45,12 @@ bool IsPlatformAvailable(const PlatformParameters &param)
#endif #endif
break; break;
case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
#ifndef ANGLE_ENABLE_NULL
return false;
#endif
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
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