// Copyright 2018 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef DAWNNATIVE_PROGRAMMABLEENCODER_H_
#define DAWNNATIVE_PROGRAMMABLEENCODER_H_

#include "dawn_native/CommandEncoder.h"
#include "dawn_native/Error.h"
#include "dawn_native/Forward.h"
#include "dawn_native/IntegerTypes.h"
#include "dawn_native/ObjectBase.h"

#include "dawn_native/dawn_platform.h"

namespace dawn_native {

    class DeviceBase;

    // Base class for shared functionality between programmable encoders.
    class ProgrammableEncoder : public ApiObjectBase {
      public:
        ProgrammableEncoder(DeviceBase* device,
                            const char* label,
                            EncodingContext* encodingContext);

        void APIInsertDebugMarker(const char* groupLabel);
        void APIPopDebugGroup();
        void APIPushDebugGroup(const char* groupLabel);

      protected:
        bool IsValidationEnabled() const;
        MaybeError ValidateProgrammableEncoderEnd() const;

        // Compute and render passes do different things on SetBindGroup. These are helper functions
        // for the logic they have in common.
        MaybeError ValidateSetBindGroup(BindGroupIndex index,
                                        BindGroupBase* group,
                                        uint32_t dynamicOffsetCountIn,
                                        const uint32_t* dynamicOffsetsIn) const;
        void RecordSetBindGroup(CommandAllocator* allocator,
                                BindGroupIndex index,
                                BindGroupBase* group,
                                uint32_t dynamicOffsetCount,
                                const uint32_t* dynamicOffsets) const;

        // Construct an "error" programmable pass encoder.
        ProgrammableEncoder(DeviceBase* device,
                            EncodingContext* encodingContext,
                            ErrorTag errorTag);

        EncodingContext* mEncodingContext = nullptr;

        uint64_t mDebugGroupStackSize = 0;

      private:
        const bool mValidationEnabled;
    };

}  // namespace dawn_native

#endif  // DAWNNATIVE_PROGRAMMABLEENCODER_H_
