Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display, const Stream *stream, const AttributeMap &attribs) { ANGLE_TRY(ValidateDisplay(display)); const DisplayExtensions &displayExtensions = display->getExtensions(); if (!displayExtensions.streamProducerD3DTextureNV12) { return Error(EGL_BAD_ACCESS, "Stream producer extension not active"); } ANGLE_TRY(ValidateStream(display, stream)); if (!attribs.isEmpty()) { return Error(EGL_BAD_ATTRIBUTE, "Invalid attribute"); } if (stream->getState() != EGL_STREAM_STATE_CONNECTING_KHR) { return Error(EGL_BAD_STATE_KHR, "Stream not in connecting state"); } if (stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV || stream->getPlaneCount() != 2) { return Error(EGL_BAD_MATCH, "Incompatible stream consumer type"); } return Error(EGL_SUCCESS); }
Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display, const Stream *stream, void *texture, const AttributeMap &attribs) { ANGLE_TRY(ValidateDisplay(display)); const DisplayExtensions &displayExtensions = display->getExtensions(); if (!displayExtensions.streamProducerD3DTextureNV12) { return Error(EGL_BAD_ACCESS, "Stream producer extension not active"); } ANGLE_TRY(ValidateStream(display, stream)); for (auto &attributeIter : attribs) { EGLAttrib attribute = attributeIter.first; EGLAttrib value = attributeIter.second; switch (attribute) { case EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE: if (value < 0) { return Error(EGL_BAD_PARAMETER, "Invalid subresource index"); } break; default: return Error(EGL_BAD_ATTRIBUTE, "Invalid attribute"); } } if (stream->getState() != EGL_STREAM_STATE_EMPTY_KHR && stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR && stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR) { return Error(EGL_BAD_STATE_KHR, "Stream not fully configured"); } if (stream->getProducerType() != Stream::ProducerType::D3D11TextureNV12) { return Error(EGL_BAD_MATCH, "Incompatible stream producer"); } if (texture == nullptr) { return egl::Error(EGL_BAD_PARAMETER, "Texture is null"); } return stream->validateD3D11NV12Texture(texture); }
Error ValidateStreamAttribKHR(const Display *display, const Stream *stream, EGLint attribute, EGLint value) { ANGLE_TRY(ValidateStream(display, stream)); if (stream->getState() == EGL_STREAM_STATE_DISCONNECTED_KHR) { return Error(EGL_BAD_STATE_KHR, "Bad stream state"); } return ValidateStreamAttribute(attribute, value, display->getExtensions()); }
BViewState* BViewState::InstantiateFromStream(BMallocIO* stream, bool endianSwap) { // compare stream header in canonical form uint32 key = AttrHashString("BViewState", B_OBJECT_TYPE); int32 version = kViewStateArchiveVersion; if (endianSwap) { key = SwapUInt32(key); version = SwapInt32(version); } if (!ValidateStream(stream, key, version)) return NULL; return _Sanitize(new (std::nothrow) BViewState(stream, endianSwap)); }
Error ValidateQueryStreamu64KHR(const Display *display, const Stream *stream, EGLenum attribute, EGLuint64KHR *value) { ANGLE_TRY(ValidateStream(display, stream)); switch (attribute) { case EGL_CONSUMER_FRAME_KHR: case EGL_PRODUCER_FRAME_KHR: break; default: return Error(EGL_BAD_ATTRIBUTE, "Invalid attribute"); } return Error(EGL_SUCCESS); }
BColumn * BColumn::InstantiateFromStream(BMallocIO *stream, bool endianSwap) { // compare stream header in canonical form uint32 key = AttrHashString("BColumn", B_OBJECT_TYPE); int32 version = kColumnStateArchiveVersion; if (endianSwap) { key = SwapUInt32(key); version = SwapInt32(version); } // PRINT(("validating key %x, version %d\n", key, version)); if (!ValidateStream(stream, key, version)) return 0; // PRINT(("instantiating column, %s\n", endianSwap ? "endian swapping," : "")); BColumn *result = new BColumn(stream, endianSwap); // sanity-check the resulting column if (result->fTitle.Length() > 500 || result->fOffset < 0 || result->fOffset > 10000 || result->fWidth < 0 || result->fWidth > 10000 || (int32)result->fAlignment < B_ALIGN_LEFT || (int32)result->fAlignment > B_ALIGN_CENTER || result->fAttrName.Length() > 500) { PRINT(("column data not valid\n")); delete result; return 0; } #if DEBUG else if (endianSwap) PRINT(("Instantiated foreign column ok\n")); #endif return result; }
BViewState * BViewState::InstantiateFromStream(BMallocIO *stream, bool endianSwap) { // compare stream header in canonical form uint32 key = AttrHashString("BViewState", B_OBJECT_TYPE); int32 version = kViewStateArchiveVersion; if (endianSwap) { key = SwapUInt32(key); version = SwapInt32(version); } if (!ValidateStream(stream, key, version)) return NULL; BViewState *result = new BViewState(stream, endianSwap); // do a sanity check here if ((result->fViewMode != kListMode && result->fViewMode != kIconMode && result->fViewMode != kMiniIconMode && result->fViewMode != 0) || (result->fLastIconMode != kListMode && result->fLastIconMode != kIconMode && result->fLastIconMode != kMiniIconMode && result->fLastIconMode != 0)) { PRINT(("Bad data instantiating ViewState, view mode %x, lastIconMode %x\n", result->fViewMode, result->fLastIconMode)); delete result; return NULL; } #if DEBUG else if (endianSwap) PRINT(("Instantiated foreign view state ok\n")); #endif return result; }
Error ValidateQueryStreamKHR(const Display *display, const Stream *stream, EGLenum attribute, EGLint *value) { ANGLE_TRY(ValidateStream(display, stream)); switch (attribute) { case EGL_STREAM_STATE_KHR: case EGL_CONSUMER_LATENCY_USEC_KHR: break; case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR: if (!display->getExtensions().streamConsumerGLTexture) { return Error(EGL_BAD_ATTRIBUTE, "Consumer GLTexture extension not active"); } break; default: return Error(EGL_BAD_ATTRIBUTE, "Invalid attribute"); } return Error(EGL_SUCCESS); }
Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream) { ANGLE_TRY(ValidateStream(display, stream)); return Error(EGL_SUCCESS); }