Commit 54f8746e by Ian Ewell Committed by Commit Bot

Add initial support for various stream extensions.

Add entry points and validation for various egl stream extensions including EGL_KHR_stream_consumer_gltexture and EGL_NV_stream_consumer_gltexture_yuv and NV_EGL_stream_consumer_external. The extensions functionality is not yet implemented and the extension strings are thus not exposed yet. BUG=angleproject:1332 Change-Id: I115d872557db38d8dd94cc367038668406719109 Reviewed-on: https://chromium-review.googlesource.com/332026Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Ian Ewell <ewell@google.com>
parent ec2c0c5e
...@@ -147,6 +147,7 @@ Extensions::Extensions() ...@@ -147,6 +147,7 @@ Extensions::Extensions()
eglImage(false), eglImage(false),
eglImageExternal(false), eglImageExternal(false),
eglImageExternalEssl3(false), eglImageExternalEssl3(false),
eglStreamConsumerExternal(false),
unpackSubimage(false), unpackSubimage(false),
packSubimage(false), packSubimage(false),
vertexArrayObject(false), vertexArrayObject(false),
...@@ -219,6 +220,7 @@ std::vector<std::string> Extensions::getStrings() const ...@@ -219,6 +220,7 @@ std::vector<std::string> Extensions::getStrings() const
InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings); InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &extensionStrings); InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external_essl3", eglImageExternalEssl3, &extensionStrings); InsertExtensionString("GL_OES_EGL_image_external_essl3", eglImageExternalEssl3, &extensionStrings);
InsertExtensionString("GL_NV_EGL_stream_consumer_external", eglStreamConsumerExternal, &extensionStrings);
InsertExtensionString("GL_EXT_unpack_subimage", unpackSubimage, &extensionStrings); InsertExtensionString("GL_EXT_unpack_subimage", unpackSubimage, &extensionStrings);
InsertExtensionString("GL_NV_pack_subimage", packSubimage, &extensionStrings); InsertExtensionString("GL_NV_pack_subimage", packSubimage, &extensionStrings);
InsertExtensionString("GL_EXT_color_buffer_float", colorBufferFloat, &extensionStrings); InsertExtensionString("GL_EXT_color_buffer_float", colorBufferFloat, &extensionStrings);
...@@ -636,7 +638,9 @@ DisplayExtensions::DisplayExtensions() ...@@ -636,7 +638,9 @@ DisplayExtensions::DisplayExtensions()
flexibleSurfaceCompatibility(false), flexibleSurfaceCompatibility(false),
directComposition(false), directComposition(false),
createContextNoError(false), createContextNoError(false),
stream(false) stream(false),
streamConsumerGLTexture(false),
streamConsumerGLTextureYUV(false)
{ {
} }
...@@ -666,6 +670,8 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -666,6 +670,8 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings); InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings);
InsertExtensionString("EGL_KHR_get_all_proc_addresses", getAllProcAddresses, &extensionStrings); InsertExtensionString("EGL_KHR_get_all_proc_addresses", getAllProcAddresses, &extensionStrings);
InsertExtensionString("EGL_KHR_stream", stream, &extensionStrings); InsertExtensionString("EGL_KHR_stream", stream, &extensionStrings);
InsertExtensionString("EGL_KHR_stream_consumer_gltexture", streamConsumerGLTexture, &extensionStrings);
InsertExtensionString("EGL_NV_stream_consumer_gltexture_yuv", streamConsumerGLTextureYUV, &extensionStrings);
InsertExtensionString("EGL_ANGLE_flexible_surface_compatibility", flexibleSurfaceCompatibility, &extensionStrings); InsertExtensionString("EGL_ANGLE_flexible_surface_compatibility", flexibleSurfaceCompatibility, &extensionStrings);
// TODO(jmadill): Enable this when complete. // TODO(jmadill): Enable this when complete.
//InsertExtensionString("KHR_create_context_no_error", createContextNoError, &extensionStrings); //InsertExtensionString("KHR_create_context_no_error", createContextNoError, &extensionStrings);
......
...@@ -256,6 +256,9 @@ struct Extensions ...@@ -256,6 +256,9 @@ struct Extensions
// GL_OES_EGL_image_external_essl3 // GL_OES_EGL_image_external_essl3
bool eglImageExternalEssl3; bool eglImageExternalEssl3;
// NV_EGL_stream_consumer_external
bool eglStreamConsumerExternal;
// EXT_unpack_subimage // EXT_unpack_subimage
bool unpackSubimage; bool unpackSubimage;
...@@ -485,6 +488,12 @@ struct DisplayExtensions ...@@ -485,6 +488,12 @@ struct DisplayExtensions
// EGL_KHR_stream // EGL_KHR_stream
bool stream; bool stream;
// EGL_KHR_stream_consumer_gltexture
bool streamConsumerGLTexture;
// EGL_NV_stream_consumer_gltexture_yuv
bool streamConsumerGLTextureYUV;
}; };
struct DeviceExtensions struct DeviceExtensions
......
...@@ -27,9 +27,10 @@ Stream::Stream(rx::StreamImpl *impl, const AttributeMap &attribs) ...@@ -27,9 +27,10 @@ Stream::Stream(rx::StreamImpl *impl, const AttributeMap &attribs)
mState(EGL_STREAM_STATE_CREATED_KHR), mState(EGL_STREAM_STATE_CREATED_KHR),
mProducerFrame(0), mProducerFrame(0),
mConsumerFrame(0), mConsumerFrame(0),
mConsumerLatency(static_cast<EGLint>(attribs.get(EGL_CONSUMER_LATENCY_USEC_KHR, 0))) mConsumerLatency(static_cast<EGLint>(attribs.get(EGL_CONSUMER_LATENCY_USEC_KHR, 0))),
mConsumerAcquireTimeout(
static_cast<EGLint>(attribs.get(EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0)))
{ {
} }
Stream::~Stream() Stream::~Stream()
...@@ -62,4 +63,14 @@ EGLenum Stream::getState() const ...@@ -62,4 +63,14 @@ EGLenum Stream::getState() const
return mState; return mState;
} }
void Stream::setConsumerAcquireTimeout(EGLint timeout)
{
mConsumerAcquireTimeout = timeout;
}
EGLint Stream::getConsumerAcquireTimeout() const
{
return mConsumerAcquireTimeout;
}
} // namespace egl } // namespace egl
...@@ -38,6 +38,9 @@ class Stream final : angle::NonCopyable ...@@ -38,6 +38,9 @@ class Stream final : angle::NonCopyable
EGLuint64KHR getProducerFrame() const; EGLuint64KHR getProducerFrame() const;
EGLuint64KHR getConsumerFrame() const; EGLuint64KHR getConsumerFrame() const;
void setConsumerAcquireTimeout(EGLint timeout);
EGLint getConsumerAcquireTimeout() const;
private: private:
// Implementation // Implementation
rx::StreamImpl *mImplementation; rx::StreamImpl *mImplementation;
...@@ -47,6 +50,9 @@ class Stream final : angle::NonCopyable ...@@ -47,6 +50,9 @@ class Stream final : angle::NonCopyable
EGLuint64KHR mProducerFrame; EGLuint64KHR mProducerFrame;
EGLuint64KHR mConsumerFrame; EGLuint64KHR mConsumerFrame;
EGLint mConsumerLatency; EGLint mConsumerLatency;
// EGL gltexture consumer attributes
EGLint mConsumerAcquireTimeout;
}; };
} // namespace egl } // namespace egl
......
...@@ -1026,7 +1026,7 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions ...@@ -1026,7 +1026,7 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions
outExtensions->glTextureCubemapImage = true; outExtensions->glTextureCubemapImage = true;
outExtensions->glRenderbufferImage = true; outExtensions->glRenderbufferImage = true;
outExtensions->stream = true; outExtensions->stream = true;
outExtensions->flexibleSurfaceCompatibility = true; outExtensions->flexibleSurfaceCompatibility = true;
outExtensions->directComposition = !!mDCompModule; outExtensions->directComposition = !!mDCompModule;
......
...@@ -74,6 +74,19 @@ Error ValidateQueryStreamu64KHR(const Display *display, ...@@ -74,6 +74,19 @@ Error ValidateQueryStreamu64KHR(const Display *display,
const Stream *stream, const Stream *stream,
EGLenum attribute, EGLenum attribute,
EGLuint64KHR *value); EGLuint64KHR *value);
Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
gl::Context *context,
const Stream *stream);
Error ValidateStreamConsumerAcquireKHR(const Display *display,
gl::Context *context,
const Stream *stream);
Error ValidateStreamConsumerReleaseKHR(const Display *display,
gl::Context *context,
const Stream *stream);
Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
gl::Context *context,
const Stream *stream,
const AttributeMap &attribs);
// Other validation // Other validation
Error ValidateCompatibleConfigs(const Display *display, Error ValidateCompatibleConfigs(const Display *display,
......
...@@ -1502,12 +1502,15 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType, ...@@ -1502,12 +1502,15 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType,
case GL_TEXTURE_BINDING_CUBE_MAP: case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_TEXTURE_BINDING_3D: case GL_TEXTURE_BINDING_3D:
case GL_TEXTURE_BINDING_2D_ARRAY: case GL_TEXTURE_BINDING_2D_ARRAY:
if (context->getState().getActiveSampler() >= caps.maxCombinedTextureImageUnits)
{
context->recordError(Error(GL_INVALID_OPERATION));
return false;
}
break; break;
case GL_TEXTURE_BINDING_EXTERNAL_OES:
if (!context->getExtensions().eglStreamConsumerExternal)
{
context->recordError(
Error(GL_INVALID_ENUM, "NV_EGL_stream_consumer_external extension not enabled"));
return false;
}
break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE: case GL_IMPLEMENTATION_COLOR_READ_TYPE:
case GL_IMPLEMENTATION_COLOR_READ_FORMAT: case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
......
...@@ -1972,4 +1972,43 @@ bool ValidateFlushMappedBufferRangeEXT(Context *context, ...@@ -1972,4 +1972,43 @@ bool ValidateFlushMappedBufferRangeEXT(Context *context,
return ValidateFlushMappedBufferRangeBase(context, target, offset, length); return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
} }
bool ValidateBindTexture(Context *context, GLenum target, GLuint texture)
{
Texture *textureObject = context->getTexture(texture);
if (textureObject && textureObject->getTarget() != target && texture != 0)
{
context->recordError(Error(GL_INVALID_OPERATION, "Invalid texture"));
return false;
}
switch (target)
{
case GL_TEXTURE_2D:
case GL_TEXTURE_CUBE_MAP:
break;
case GL_TEXTURE_3D:
case GL_TEXTURE_2D_ARRAY:
if (context->getClientVersion() < 3)
{
context->recordError(Error(GL_INVALID_ENUM, "GLES 3.0 disabled"));
return false;
}
break;
case GL_TEXTURE_EXTERNAL_OES:
if (!context->getExtensions().eglStreamConsumerExternal)
{
context->recordError(
Error(GL_INVALID_ENUM, "External texture extension not enabled"));
return false;
}
break;
default:
context->recordError(Error(GL_INVALID_ENUM, "Invalid target"));
return false;
}
return true;
}
} // namespace gl } // namespace gl
...@@ -16,6 +16,7 @@ namespace gl ...@@ -16,6 +16,7 @@ namespace gl
{ {
class Context; class Context;
class ValidationContext; class ValidationContext;
class Texture;
bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage, bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage,
GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
...@@ -167,6 +168,7 @@ bool ValidateCompressedTexSubImage2D(Context *context, ...@@ -167,6 +168,7 @@ bool ValidateCompressedTexSubImage2D(Context *context,
GLenum format, GLenum format,
GLsizei imageSize, GLsizei imageSize,
const GLvoid *data); const GLvoid *data);
bool ValidateBindTexture(Context *context, GLenum target, GLuint texture);
bool ValidateGetBufferPointervOES(Context *context, GLenum target, GLenum pname, void **params); bool ValidateGetBufferPointervOES(Context *context, GLenum target, GLenum pname, void **params);
bool ValidateMapBufferOES(Context *context, GLenum target, GLenum access); bool ValidateMapBufferOES(Context *context, GLenum target, GLenum access);
......
...@@ -321,4 +321,26 @@ EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy, ...@@ -321,4 +321,26 @@ EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy,
{ {
return egl::QueryStreamu64KHR(dpy, stream, attribute, value); return egl::QueryStreamu64KHR(dpy, stream, attribute, value);
} }
EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
return egl::StreamConsumerGLTextureExternalKHR(dpy, stream);
}
EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
return egl::StreamConsumerAcquireKHR(dpy, stream);
}
EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
return egl::StreamConsumerReleaseKHR(dpy, stream);
}
EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
EGLStreamKHR stream,
EGLAttrib *attrib_list)
{
return egl::StreamConsumerGLTextureExternalAttribsNV(dpy, stream, attrib_list);
}
} }
LIBRARY libEGL LIBRARY libEGL
EXPORTS EXPORTS
eglBindAPI @14 eglBindAPI @14
eglBindTexImage @20 eglBindTexImage @20
eglChooseConfig @7 eglChooseConfig @7
eglCopyBuffers @33 eglCopyBuffers @33
eglCreateContext @23 eglCreateContext @23
eglCreatePbufferFromClientBuffer @18 eglCreatePbufferFromClientBuffer @18
eglCreatePbufferSurface @10 eglCreatePbufferSurface @10
eglCreatePixmapSurface @11 eglCreatePixmapSurface @11
eglCreateWindowSurface @9 eglCreateWindowSurface @9
eglDestroyContext @24 eglDestroyContext @24
eglDestroySurface @12 eglDestroySurface @12
eglGetConfigAttrib @8 eglGetConfigAttrib @8
eglGetConfigs @6 eglGetConfigs @6
eglGetCurrentContext @26 eglGetCurrentContext @26
eglGetCurrentDisplay @28 eglGetCurrentDisplay @28
eglGetCurrentSurface @27 eglGetCurrentSurface @27
eglGetDisplay @2 eglGetDisplay @2
eglGetError @1 eglGetError @1
eglGetProcAddress @34 eglGetProcAddress @34
eglInitialize @3 eglInitialize @3
eglMakeCurrent @25 eglMakeCurrent @25
eglQueryAPI @15 eglQueryAPI @15
eglQueryContext @29 eglQueryContext @29
eglQueryString @5 eglQueryString @5
eglQuerySurface @13 eglQuerySurface @13
eglReleaseTexImage @21 eglReleaseTexImage @21
eglReleaseThread @17 eglReleaseThread @17
eglSurfaceAttrib @19 eglSurfaceAttrib @19
eglSwapBuffers @32 eglSwapBuffers @32
eglSwapInterval @22 eglSwapInterval @22
eglTerminate @4 eglTerminate @4
eglWaitClient @16 eglWaitClient @16
eglWaitGL @30 eglWaitGL @30
eglWaitNative @31 eglWaitNative @31
; Extensions ; Extensions
eglGetPlatformDisplayEXT @35 eglGetPlatformDisplayEXT @35
eglQuerySurfacePointerANGLE @36 eglQuerySurfacePointerANGLE @36
eglPostSubBufferNV @37 eglPostSubBufferNV @37
eglQueryDisplayAttribEXT @48 eglQueryDisplayAttribEXT @48
eglQueryDeviceAttribEXT @49 eglQueryDeviceAttribEXT @49
eglQueryDeviceStringEXT @50 eglQueryDeviceStringEXT @50
eglCreateImageKHR @51 eglCreateImageKHR @51
eglDestroyImageKHR @52 eglDestroyImageKHR @52
eglCreateDeviceANGLE @53 eglCreateDeviceANGLE @53
eglReleaseDeviceANGLE @54 eglReleaseDeviceANGLE @54
eglCreateStreamKHR @55 eglCreateStreamKHR @55
eglDestroyStreamKHR @56 eglDestroyStreamKHR @56
eglStreamAttribKHR @57 eglStreamAttribKHR @57
eglQueryStreamKHR @58 eglQueryStreamKHR @58
eglQueryStreamu64KHR @59 eglQueryStreamu64KHR @59
eglStreamConsumerGLTextureExternalKHR @60
eglStreamConsumerAcquireKHR @61
eglStreamConsumerReleaseKHR @62
eglStreamConsumerGLTextureExternalAttribsNV @63
; 1.5 entry points ; 1.5 entry points
eglCreateSync @38 eglCreateSync @38
eglDestroySync @39 eglDestroySync @39
eglClientWaitSync @40 eglClientWaitSync @40
eglGetSyncAttrib @41 eglGetSyncAttrib @41
eglCreateImage @42 eglCreateImage @42
eglDestroyImage @43 eglDestroyImage @43
eglGetPlatformDisplay @44 eglGetPlatformDisplay @44
eglCreatePlatformWindowSurface @45 eglCreatePlatformWindowSurface @45
eglCreatePlatformPixmapSurface @46 eglCreatePlatformPixmapSurface @46
eglWaitSync @47 eglWaitSync @47
...@@ -1650,6 +1650,14 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char * ...@@ -1650,6 +1650,14 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *
INSERT_PROC_ADDRESS(egl, QueryStreamKHR); INSERT_PROC_ADDRESS(egl, QueryStreamKHR);
INSERT_PROC_ADDRESS(egl, QueryStreamu64KHR); INSERT_PROC_ADDRESS(egl, QueryStreamu64KHR);
// EGL_KHR_stream_consumer_gltexture
INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalKHR);
INSERT_PROC_ADDRESS(egl, StreamConsumerAcquireKHR);
INSERT_PROC_ADDRESS(egl, StreamConsumerReleaseKHR);
// EGL_NV_stream_consumer_gltexture_yuv
INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalAttribsNV);
#undef INSERT_PROC_ADDRESS #undef INSERT_PROC_ADDRESS
return map; return map;
}; };
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "libGLESv2/entry_points_egl_ext.h" #include "libGLESv2/entry_points_egl_ext.h"
#include "libGLESv2/global_state.h" #include "libGLESv2/global_state.h"
#include "libANGLE/Context.h"
#include "libANGLE/Display.h" #include "libANGLE/Display.h"
#include "libANGLE/Device.h" #include "libANGLE/Device.h"
#include "libANGLE/Surface.h" #include "libANGLE/Surface.h"
...@@ -577,6 +578,7 @@ EGLStreamKHR EGLAPIENTRY CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_li ...@@ -577,6 +578,7 @@ EGLStreamKHR EGLAPIENTRY CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_li
return EGL_NO_STREAM_KHR; return EGL_NO_STREAM_KHR;
} }
SetGlobalError(error);
return static_cast<EGLStreamKHR>(stream); return static_cast<EGLStreamKHR>(stream);
} }
...@@ -595,6 +597,7 @@ EGLBoolean EGLAPIENTRY DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream) ...@@ -595,6 +597,7 @@ EGLBoolean EGLAPIENTRY DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
} }
display->destroyStream(streamObject); display->destroyStream(streamObject);
SetGlobalError(error);
return EGL_TRUE; return EGL_TRUE;
} }
...@@ -623,10 +626,14 @@ EGLBoolean EGLAPIENTRY StreamAttribKHR(EGLDisplay dpy, ...@@ -623,10 +626,14 @@ EGLBoolean EGLAPIENTRY StreamAttribKHR(EGLDisplay dpy,
case EGL_CONSUMER_LATENCY_USEC_KHR: case EGL_CONSUMER_LATENCY_USEC_KHR:
streamObject->setConsumerLatency(value); streamObject->setConsumerLatency(value);
break; break;
case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
streamObject->setConsumerAcquireTimeout(value);
break;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
SetGlobalError(error);
return EGL_TRUE; return EGL_TRUE;
} }
...@@ -658,10 +665,14 @@ EGLBoolean EGLAPIENTRY QueryStreamKHR(EGLDisplay dpy, ...@@ -658,10 +665,14 @@ EGLBoolean EGLAPIENTRY QueryStreamKHR(EGLDisplay dpy,
case EGL_CONSUMER_LATENCY_USEC_KHR: case EGL_CONSUMER_LATENCY_USEC_KHR:
*value = streamObject->getConsumerLatency(); *value = streamObject->getConsumerLatency();
break; break;
case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
*value = streamObject->getConsumerAcquireTimeout();
break;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
SetGlobalError(error);
return EGL_TRUE; return EGL_TRUE;
} }
...@@ -697,6 +708,81 @@ EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy, ...@@ -697,6 +708,81 @@ EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy,
UNREACHABLE(); UNREACHABLE();
} }
SetGlobalError(error);
return EGL_TRUE; return EGL_TRUE;
} }
EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)", dpy, stream);
Display *display = static_cast<Display *>(dpy);
Stream *streamObject = static_cast<Stream *>(stream);
gl::Context *context = gl::GetValidGlobalContext();
Error error = ValidateStreamConsumerGLTextureExternalKHR(display, context, streamObject);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
SetGlobalError(error);
return EGL_FALSE;
}
EGLBoolean EGLAPIENTRY StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)", dpy, stream);
Display *display = static_cast<Display *>(dpy);
Stream *streamObject = static_cast<Stream *>(stream);
gl::Context *context = gl::GetValidGlobalContext();
Error error = ValidateStreamConsumerAcquireKHR(display, context, streamObject);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
SetGlobalError(error);
return EGL_FALSE;
}
EGLBoolean EGLAPIENTRY StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
{
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)", dpy, stream);
Display *display = static_cast<Display *>(dpy);
Stream *streamObject = static_cast<Stream *>(stream);
gl::Context *context = gl::GetValidGlobalContext();
Error error = ValidateStreamConsumerReleaseKHR(display, context, streamObject);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
SetGlobalError(error);
return EGL_FALSE;
}
EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
EGLStreamKHR stream,
const EGLAttrib *attrib_list)
{
EVENT(
"(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLAttrib attrib_list = 0x%0.8p",
dpy, stream, attrib_list);
Display *display = static_cast<Display *>(dpy);
Stream *streamObject = static_cast<Stream *>(stream);
gl::Context *context = gl::GetValidGlobalContext();
AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
Error error = ValidateStreamConsumerGLTextureExternalAttribsNV(display, context, streamObject,
attributes);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
SetGlobalError(error);
return EGL_FALSE;
}
} }
...@@ -59,6 +59,16 @@ ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy, ...@@ -59,6 +59,16 @@ ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy,
EGLStreamKHR stream, EGLStreamKHR stream,
EGLenum attribute, EGLenum attribute,
EGLuint64KHR *value); EGLuint64KHR *value);
// EGL_KHR_stream_consumer_gltexture
ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalKHR(EGLDisplay dpy,
EGLStreamKHR stream);
ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream);
ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream);
ANGLE_EXPORT EGLBoolean EGLAPIENTRY
StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
EGLStreamKHR stream,
const EGLAttrib *attrib_list);
} }
#endif // LIBGLESV2_ENTRYPOINTSEGLEXT_H_ #endif // LIBGLESV2_ENTRYPOINTSEGLEXT_H_
...@@ -205,31 +205,8 @@ void GL_APIENTRY BindTexture(GLenum target, GLuint texture) ...@@ -205,31 +205,8 @@ void GL_APIENTRY BindTexture(GLenum target, GLuint texture)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
Texture *textureObject = context->getTexture(texture); if (!ValidateBindTexture(context, target, texture))
if (textureObject && textureObject->getTarget() != target && texture != 0)
{
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
switch (target)
{ {
case GL_TEXTURE_2D:
case GL_TEXTURE_CUBE_MAP:
break;
case GL_TEXTURE_3D:
case GL_TEXTURE_2D_ARRAY:
if (context->getClientVersion() < 3)
{
context->recordError(Error(GL_INVALID_ENUM));
return;
}
break;
default:
context->recordError(Error(GL_INVALID_ENUM));
return; return;
} }
......
...@@ -38,15 +38,15 @@ class EGLStreamTest : public ANGLETest ...@@ -38,15 +38,15 @@ class EGLStreamTest : public ANGLETest
TEST_P(EGLStreamTest, StreamValidationTest) TEST_P(EGLStreamTest, StreamValidationTest)
{ {
EGLWindow *window = getEGLWindow(); EGLWindow *window = getEGLWindow();
const char *extensionsString = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); EGLDisplay display = window->getDisplay();
const char *extensionsString = eglQueryString(display, EGL_EXTENSIONS);
if (strstr(extensionsString, "EGL_KHR_stream") == nullptr) if (strstr(extensionsString, "EGL_KHR_stream") == nullptr)
{ {
std::cout << "Stream extension not supported" << std::endl; std::cout << "Stream extension not supported" << std::endl;
return; return;
} }
EGLDisplay display = window->getDisplay();
const EGLint streamAttributesBad[] = { const EGLint streamAttributesBad[] = {
EGL_STREAM_STATE_KHR, EGL_STREAM_STATE_KHR,
0, 0,
...@@ -97,7 +97,7 @@ TEST_P(EGLStreamTest, StreamValidationTest) ...@@ -97,7 +97,7 @@ TEST_P(EGLStreamTest, StreamValidationTest)
// Create an actual stream // Create an actual stream
stream = eglCreateStreamKHR(display, streamAttributes); stream = eglCreateStreamKHR(display, streamAttributes);
ASSERT_EGL_SUCCESS(); ASSERT_EGL_SUCCESS();
ASSERT_EQ(EGL_NO_STREAM_KHR, stream); ASSERT_NE(EGL_NO_STREAM_KHR, stream);
// Assert it is in the created state // Assert it is in the created state
EGLint state; EGLint state;
......
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