tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TransformFeedback11.cpp (3944B)


      1 //
      2 // Copyright 2014 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 // TransformFeedbackD3D.cpp is a no-op implementation for both the D3D9 and D3D11 renderers.
      8 
      9 #include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h"
     10 
     11 #include "libANGLE/Buffer.h"
     12 #include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
     13 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
     14 
     15 namespace rx
     16 {
     17 
     18 TransformFeedback11::TransformFeedback11(const gl::TransformFeedbackState &state,
     19                                         Renderer11 *renderer)
     20    : TransformFeedbackImpl(state),
     21      mRenderer(renderer),
     22      mIsDirty(true),
     23      mBuffers(state.getIndexedBuffers().size(), nullptr),
     24      mBufferOffsets(state.getIndexedBuffers().size(), 0),
     25      mSerial(mRenderer->generateSerial())
     26 {}
     27 
     28 TransformFeedback11::~TransformFeedback11() {}
     29 
     30 angle::Result TransformFeedback11::begin(const gl::Context *context,
     31                                         gl::PrimitiveMode primitiveMode)
     32 {
     33    // Reset all the cached offsets to the binding offsets
     34    mIsDirty = true;
     35    for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++)
     36    {
     37        const auto &binding = mState.getIndexedBuffer(bindingIdx);
     38        if (binding.get() != nullptr)
     39        {
     40            mBufferOffsets[bindingIdx] = static_cast<UINT>(binding.getOffset());
     41        }
     42        else
     43        {
     44            mBufferOffsets[bindingIdx] = 0;
     45        }
     46    }
     47    mRenderer->getStateManager()->invalidateTransformFeedback();
     48    return angle::Result::Continue;
     49 }
     50 
     51 angle::Result TransformFeedback11::end(const gl::Context *context)
     52 {
     53    mRenderer->getStateManager()->invalidateTransformFeedback();
     54    if (mRenderer->getFeatures().flushAfterEndingTransformFeedback.enabled)
     55    {
     56        mRenderer->getDeviceContext()->Flush();
     57    }
     58    return angle::Result::Continue;
     59 }
     60 
     61 angle::Result TransformFeedback11::pause(const gl::Context *context)
     62 {
     63    mRenderer->getStateManager()->invalidateTransformFeedback();
     64    return angle::Result::Continue;
     65 }
     66 
     67 angle::Result TransformFeedback11::resume(const gl::Context *context)
     68 {
     69    mRenderer->getStateManager()->invalidateTransformFeedback();
     70    return angle::Result::Continue;
     71 }
     72 
     73 angle::Result TransformFeedback11::bindIndexedBuffer(
     74    const gl::Context *context,
     75    size_t index,
     76    const gl::OffsetBindingPointer<gl::Buffer> &binding)
     77 {
     78    mIsDirty              = true;
     79    mBufferOffsets[index] = static_cast<UINT>(binding.getOffset());
     80    mRenderer->getStateManager()->invalidateTransformFeedback();
     81    return angle::Result::Continue;
     82 }
     83 
     84 void TransformFeedback11::onApply()
     85 {
     86    mIsDirty = false;
     87 
     88    // Change all buffer offsets to -1 so that if any of them need to be re-applied, the are set to
     89    // append
     90    std::fill(mBufferOffsets.begin(), mBufferOffsets.end(), -1);
     91 }
     92 
     93 bool TransformFeedback11::isDirty() const
     94 {
     95    return mIsDirty;
     96 }
     97 
     98 UINT TransformFeedback11::getNumSOBuffers() const
     99 {
    100    return static_cast<UINT>(mBuffers.size());
    101 }
    102 
    103 angle::Result TransformFeedback11::getSOBuffers(const gl::Context *context,
    104                                                const std::vector<ID3D11Buffer *> **buffersOut)
    105 {
    106    for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++)
    107    {
    108        const auto &binding = mState.getIndexedBuffer(bindingIdx);
    109        if (binding.get() != nullptr)
    110        {
    111            Buffer11 *storage = GetImplAs<Buffer11>(binding.get());
    112            ANGLE_TRY(storage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
    113                                         &mBuffers[bindingIdx]));
    114        }
    115    }
    116 
    117    *buffersOut = &mBuffers;
    118    return angle::Result::Continue;
    119 }
    120 
    121 const std::vector<UINT> &TransformFeedback11::getSOBufferOffsets() const
    122 {
    123    return mBufferOffsets;
    124 }
    125 
    126 Serial TransformFeedback11::getSerial() const
    127 {
    128    return mSerial;
    129 }
    130 
    131 }  // namespace rx