// 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_
