Hash :
4b654982
Author :
Date :
2019-01-31T17:04:14
GL backend: Transform feedback driver bug workaround In some drivers, if transform feedback is paused and a new program is bound, calling endTransformFeedback does not correctly unpause first, creating an invalid paused but inactive state that causes errors later. Before calling endTransformFeedback we first ensure that the current program is the one associated with this transform feedback object when beginTransformFeedback was called. Bug: 832238 Change-Id: I2373b0c123fd20a7ee3ada76ed878d4968184476 Reviewed-on: https://chromium-review.googlesource.com/c/1448661 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: James Darpinian <jdarpinian@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// TransformFeedbackGL.h: Defines the class interface for TransformFeedbackGL.
#ifndef LIBANGLE_RENDERER_GL_TRANSFORMFEEDBACKGL_H_
#define LIBANGLE_RENDERER_GL_TRANSFORMFEEDBACKGL_H_
#include "libANGLE/renderer/TransformFeedbackImpl.h"
namespace rx
{
class FunctionsGL;
class StateManagerGL;
class TransformFeedbackGL : public TransformFeedbackImpl
{
public:
TransformFeedbackGL(const gl::TransformFeedbackState &state,
const FunctionsGL *functions,
StateManagerGL *stateManager);
~TransformFeedbackGL() override;
angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
angle::Result end(const gl::Context *context) override;
angle::Result pause(const gl::Context *context) override;
angle::Result resume(const gl::Context *context) override;
angle::Result bindGenericBuffer(const gl::Context *context,
const gl::BindingPointer<gl::Buffer> &binding) override;
angle::Result bindIndexedBuffer(const gl::Context *context,
size_t index,
const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
GLuint getTransformFeedbackID() const;
void syncActiveState(const gl::Context *context,
bool active,
gl::PrimitiveMode primitiveMode) const;
void syncPausedState(bool paused) const;
private:
const FunctionsGL *mFunctions;
StateManagerGL *mStateManager;
GLuint mTransformFeedbackID;
mutable bool mIsActive;
mutable bool mIsPaused;
mutable GLuint mActiveProgram;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_TRANSFORMFEEDBACKGL_H_