bool WebGLContext::ValidateIndexedBufferBinding(const char* funcName, GLenum target, GLuint index, WebGLRefPtr<WebGLBuffer>** const out_genericBinding, IndexedBufferBinding** const out_indexedBinding) { *out_genericBinding = ValidateBufferSlot(funcName, target); if (!*out_genericBinding) return false; *out_indexedBinding = ValidateIndexedBufferSlot(funcName, target, index); if (!*out_indexedBinding) return false; if (target == LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER && mBoundTransformFeedback->mIsActive) { ErrorInvalidOperation("%s: Cannot update indexed buffer bindings on active" " transform feedback objects.", funcName); return false; } return true; }
WebGLBuffer* WebGLContext::ValidateBufferSelection(GLenum target) { const auto& slot = ValidateBufferSlot(target); if (!slot) return nullptr; const auto& buffer = *slot; if (!buffer) { ErrorInvalidOperation("Buffer for `target` is null."); return nullptr; } if (target == LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER) { if (mBoundTransformFeedback->IsActiveAndNotPaused()) { ErrorInvalidOperation( "Cannot select TRANSFORM_FEEDBACK_BUFFER when" " transform feedback is active and unpaused."); return nullptr; } if (buffer->IsBoundForNonTF()) { ErrorInvalidOperation( "Specified WebGLBuffer is currently bound for" " non-transform-feedback."); return nullptr; } } else { if (buffer->IsBoundForTF()) { ErrorInvalidOperation( "Specified WebGLBuffer is currently bound for" " transform feedback."); return nullptr; } } return buffer.get(); }
void WebGLContext::BindBuffer(GLenum target, WebGLBuffer* buffer) { const char funcName[] = "bindBuffer"; if (IsContextLost()) return; if (!ValidateObjectAllowDeletedOrNull(funcName, buffer)) return; if (buffer && buffer->IsDeleted()) return ErrorInvalidOperation("%s: Cannot bind a deleted object.", funcName); const auto& slot = ValidateBufferSlot(funcName, target); if (!slot) return; if (buffer && !buffer->ValidateCanBindToTarget(funcName, target)) return; gl->MakeCurrent(); gl->fBindBuffer(target, buffer ? buffer->mGLName : 0); *slot = buffer; if (buffer) { buffer->SetContentAfterBind(target); } switch (target) { case LOCAL_GL_PIXEL_PACK_BUFFER: case LOCAL_GL_PIXEL_UNPACK_BUFFER: gl->fBindBuffer(target, 0); break; } }
void WebGLContext::BindBuffer(GLenum target, WebGLBuffer* buffer) { const FuncScope funcScope(*this, "bindBuffer"); if (IsContextLost()) return; if (buffer && !ValidateObject("buffer", *buffer)) return; const auto& slot = ValidateBufferSlot(target); if (!slot) return; if (buffer && !buffer->ValidateCanBindToTarget(target)) return; gl->fBindBuffer(target, buffer ? buffer->mGLName : 0); WebGLBuffer::SetSlot(target, buffer, slot); if (buffer) { buffer->SetContentAfterBind(target); } switch (target) { case LOCAL_GL_PIXEL_PACK_BUFFER: case LOCAL_GL_PIXEL_UNPACK_BUFFER: gl->fBindBuffer(target, 0); break; } }
WebGLBuffer* WebGLContext::ValidateBufferSelection(const char* funcName, GLenum target) { const auto& slot = ValidateBufferSlot(funcName, target); if (!slot) return nullptr; const auto& buffer = *slot; if (!buffer) { ErrorInvalidOperation("%s: Buffer for `target` is null.", funcName); return nullptr; } if (!ValidateForNonTransformFeedback(funcName, buffer.get())) return nullptr; return buffer.get(); }