Commit 70656a64 by Jamie Madill

Implement queries and enums for buffer mapping.

GetBufferPointerv, GetBufferParameteri64v, and new values for GetBufferParameteriv. BUG=angle:565 Change-Id: I179a3193987b2bff1b0628e47f6a0d627541b0cf Reviewed-on: https://chromium-review.googlesource.com/188203Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent bd0ea9c7
...@@ -65,6 +65,19 @@ inline int clampToInt(unsigned int x) ...@@ -65,6 +65,19 @@ inline int clampToInt(unsigned int x)
return static_cast<int>(std::min(x, static_cast<unsigned int>(std::numeric_limits<int>::max()))); return static_cast<int>(std::min(x, static_cast<unsigned int>(std::numeric_limits<int>::max())));
} }
template <typename DestT, typename SrcT>
inline DestT clampCast(SrcT value)
{
// This assumes SrcT can properly represent DestT::min/max
// Unfortunately we can't use META_ASSERT without C++11 constexpr support
ASSERT(static_cast<DestT>(static_cast<SrcT>(std::numeric_limits<DestT>::min())) == std::numeric_limits<DestT>::min());
ASSERT(static_cast<DestT>(static_cast<SrcT>(std::numeric_limits<DestT>::max())) == std::numeric_limits<DestT>::max());
SrcT lo = static_cast<SrcT>(std::numeric_limits<DestT>::min());
SrcT hi = static_cast<SrcT>(std::numeric_limits<DestT>::max());
return static_cast<DestT>(value > lo ? (value > hi ? hi : value) : lo);
}
template<typename T, typename MIN, typename MAX> template<typename T, typename MIN, typename MAX>
inline T clamp(T x, MIN min, MAX max) inline T clamp(T x, MIN min, MAX max)
{ {
......
...@@ -106,9 +106,9 @@ rx::BufferStorage *Buffer::getStorage() const ...@@ -106,9 +106,9 @@ rx::BufferStorage *Buffer::getStorage() const
return mBufferStorage; return mBufferStorage;
} }
unsigned int Buffer::size() const GLint64 Buffer::size() const
{ {
return mBufferStorage->getSize(); return static_cast<GLint64>(mBufferStorage->getSize());
} }
GLenum Buffer::usage() const GLenum Buffer::usage() const
......
...@@ -47,7 +47,7 @@ class Buffer : public RefCountObject ...@@ -47,7 +47,7 @@ class Buffer : public RefCountObject
GLint64 mapLength() const; GLint64 mapLength() const;
rx::BufferStorage *getStorage() const; rx::BufferStorage *getStorage() const;
unsigned int size() const; GLint64 size() const;
void markTransformFeedbackUsage(); void markTransformFeedbackUsage();
......
...@@ -2487,6 +2487,11 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params ...@@ -2487,6 +2487,11 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
if (!gl::ValidBufferParameter(context, pname))
{
return gl::error(GL_INVALID_ENUM);
}
gl::Buffer *buffer = context->getTargetBuffer(target); gl::Buffer *buffer = context->getTargetBuffer(target);
if (!buffer) if (!buffer)
...@@ -2498,12 +2503,24 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params ...@@ -2498,12 +2503,24 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params
switch (pname) switch (pname)
{ {
case GL_BUFFER_USAGE: case GL_BUFFER_USAGE:
*params = buffer->usage(); *params = static_cast<GLint>(buffer->usage());
break; break;
case GL_BUFFER_SIZE: case GL_BUFFER_SIZE:
*params = buffer->size(); *params = gl::clampCast<GLint>(buffer->size());
break; break;
default: return gl::error(GL_INVALID_ENUM); case GL_BUFFER_ACCESS_FLAGS:
*params = buffer->accessFlags();
break;
case GL_BUFFER_MAPPED:
*params = static_cast<GLint>(buffer->mapped());
break;
case GL_BUFFER_MAP_OFFSET:
*params = gl::clampCast<GLint>(buffer->mapOffset());
break;
case GL_BUFFER_MAP_LENGTH:
*params = gl::clampCast<GLint>(buffer->mapLength());
break;
default: UNREACHABLE(); break;
} }
} }
} }
...@@ -6657,8 +6674,24 @@ void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) ...@@ -6657,8 +6674,24 @@ void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
// glGetBufferPointerv if (!gl::ValidBufferTarget(context, target))
UNIMPLEMENTED(); {
return gl::error(GL_INVALID_ENUM);
}
if (pname != GL_BUFFER_MAP_POINTER)
{
return gl::error(GL_INVALID_ENUM);
}
gl::Buffer *buffer = context->getTargetBuffer(target);
if (!buffer || !buffer->mapped())
{
*params = NULL;
}
*params = buffer->mapPointer();
} }
} }
catch(std::bad_alloc&) catch(std::bad_alloc&)
...@@ -9228,8 +9261,46 @@ void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* pa ...@@ -9228,8 +9261,46 @@ void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* pa
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
// glGetBufferParameteri64v if (!gl::ValidBufferTarget(context, target))
UNIMPLEMENTED(); {
return gl::error(GL_INVALID_ENUM);
}
if (!gl::ValidBufferParameter(context, pname))
{
return gl::error(GL_INVALID_ENUM);
}
gl::Buffer *buffer = context->getTargetBuffer(target);
if (!buffer)
{
// A null buffer means that "0" is bound to the requested buffer target
return gl::error(GL_INVALID_OPERATION);
}
switch (pname)
{
case GL_BUFFER_USAGE:
*params = static_cast<GLint64>(buffer->usage());
break;
case GL_BUFFER_SIZE:
*params = buffer->size();
break;
case GL_BUFFER_ACCESS_FLAGS:
*params = static_cast<GLint64>(buffer->accessFlags());
break;
case GL_BUFFER_MAPPED:
*params = static_cast<GLint64>(buffer->mapped());
break;
case GL_BUFFER_MAP_OFFSET:
*params = buffer->mapOffset();
break;
case GL_BUFFER_MAP_LENGTH:
*params = buffer->mapLength();
break;
default: UNREACHABLE(); break;
}
} }
} }
catch(std::bad_alloc&) catch(std::bad_alloc&)
......
...@@ -94,6 +94,27 @@ bool ValidBufferTarget(const Context *context, GLenum target) ...@@ -94,6 +94,27 @@ bool ValidBufferTarget(const Context *context, GLenum target)
} }
} }
bool ValidBufferParameter(const Context *context, GLenum pname)
{
switch (pname)
{
case GL_BUFFER_USAGE:
case GL_BUFFER_SIZE:
return true;
// GL_BUFFER_MAP_POINTER is a special case, and may only be
// queried with GetBufferPointerv
case GL_BUFFER_ACCESS_FLAGS:
case GL_BUFFER_MAPPED:
case GL_BUFFER_MAP_OFFSET:
case GL_BUFFER_MAP_LENGTH:
return (context->getClientVersion() >= 3);
default:
return false;
}
}
bool ValidMipLevel(const Context *context, GLenum target, GLint level) bool ValidMipLevel(const Context *context, GLenum target, GLint level)
{ {
int maxLevel = 0; int maxLevel = 0;
......
...@@ -18,6 +18,7 @@ bool ValidCap(const Context *context, GLenum cap); ...@@ -18,6 +18,7 @@ bool ValidCap(const Context *context, GLenum cap);
bool ValidTextureTarget(const Context *context, GLenum target); bool ValidTextureTarget(const Context *context, GLenum target);
bool ValidFramebufferTarget(GLenum target); bool ValidFramebufferTarget(GLenum target);
bool ValidBufferTarget(const Context *context, GLenum target); bool ValidBufferTarget(const Context *context, GLenum target);
bool ValidBufferParameter(const Context *context, GLenum pname);
bool ValidMipLevel(const Context *context, GLenum target, GLint level); bool ValidMipLevel(const Context *context, GLenum target, GLint level);
bool ValidImageSize(const gl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth); bool ValidImageSize(const gl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth);
bool ValidCompressedImageSize(const gl::Context *context, GLenum internalFormat, GLsizei width, GLsizei height); bool ValidCompressedImageSize(const gl::Context *context, GLenum internalFormat, GLsizei width, GLsizei height);
......
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