dawn-cmake/src/utils/TerribleCommandBuffer.h
Yan b639e68495 Add large buffer to handle super large data block commands
TerribleCommandBuffer has space for 10,000,000 bytes worth of commands. If
commands contain super large data block (e.g. setsubdata), it will
return nullptr and crash dawn wire layer.

This patch adds a large buffer to handle super large data block.

BUG=dawn:251

Change-Id: Ib007e92b5282afbb93aef63cfffe5a3965f6d5c1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/13040
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
2019-11-15 09:32:56 +00:00

47 lines
1.4 KiB
C++

// Copyright 2017 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 UTILS_TERRIBLE_COMMAND_BUFFER_H_
#define UTILS_TERRIBLE_COMMAND_BUFFER_H_
#include <vector>
#include "dawn_wire/Wire.h"
namespace utils {
class TerribleCommandBuffer : public dawn_wire::CommandSerializer {
public:
TerribleCommandBuffer();
TerribleCommandBuffer(dawn_wire::CommandHandler* handler);
void SetHandler(dawn_wire::CommandHandler* handler);
void* GetCmdSpace(size_t size) override;
bool Flush() override;
private:
dawn_wire::CommandHandler* mHandler = nullptr;
size_t mOffset = 0;
// Cannot have commands in mBuffer and mLargeBuffer
// at the same time to ensure commands order.
char mBuffer[1000000];
std::vector<char> mLargeBuffer;
size_t mLargeBufferCmdSize = 0;
};
} // namespace utils
#endif // UTILS_TERRIBLE_COMMAND_BUFFER_H_