73 lines
2.9 KiB
C++
73 lines
2.9 KiB
C++
/*
|
|
* Copyright 2023 Google LLC
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "tests/Test.h"
|
|
|
|
#include "include/gpu/graphite/Context.h"
|
|
#include "include/gpu/graphite/Recorder.h"
|
|
#include "include/gpu/graphite/Recording.h"
|
|
#include "src/gpu/graphite/Buffer.h"
|
|
#include "src/gpu/graphite/BufferManager.h"
|
|
#include "src/gpu/graphite/Caps.h"
|
|
#include "src/gpu/graphite/ContextPriv.h"
|
|
#include "src/gpu/graphite/RecorderPriv.h"
|
|
#include "src/gpu/graphite/RecordingPriv.h"
|
|
|
|
namespace skgpu::graphite {
|
|
namespace {
|
|
|
|
static bool is_offset_aligned(size_t offset, size_t alignment) {
|
|
return 0 == (offset & (alignment - 1));
|
|
}
|
|
|
|
} // namespace
|
|
|
|
DEF_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(BufferManagerGpuOnlyBufferTest, reporter, context) {
|
|
std::unique_ptr<Recorder> recorder = context->makeRecorder();
|
|
DrawBufferManager* mgr = recorder->priv().drawBufferManager();
|
|
|
|
// Allocate a series of GPU-only buffers. These buffers should not be mapped before and after
|
|
// they get transferred to the recording.
|
|
auto ssbo = mgr->getStorage(10);
|
|
auto vertex = mgr->getVertexStorage(10);
|
|
auto index = mgr->getIndexStorage(10);
|
|
auto indirect = mgr->getIndirectStorage(10);
|
|
|
|
REPORTER_ASSERT(reporter, !ssbo.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !vertex.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !index.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !indirect.fBuffer->isMapped());
|
|
|
|
// Ensure that the buffers' starting alignment matches the required storage buffer alignment.
|
|
size_t requiredAlignment = context->priv().caps()->requiredStorageBufferAlignment();
|
|
REPORTER_ASSERT(reporter, is_offset_aligned(ssbo.fOffset, requiredAlignment));
|
|
REPORTER_ASSERT(reporter, is_offset_aligned(vertex.fOffset, requiredAlignment));
|
|
REPORTER_ASSERT(reporter, is_offset_aligned(index.fOffset, requiredAlignment));
|
|
REPORTER_ASSERT(reporter, is_offset_aligned(indirect.fOffset, requiredAlignment));
|
|
|
|
// Transfers the ownership of used buffers to a Recording.
|
|
auto recording = recorder->snap();
|
|
|
|
// Ensure that the buffers are still unmapped.
|
|
REPORTER_ASSERT(reporter, !ssbo.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !vertex.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !index.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, !indirect.fBuffer->isMapped());
|
|
|
|
// Since these buffers never need their contents to be host-visible, no buffer transfer/copy
|
|
// tasks should have been created for them.
|
|
REPORTER_ASSERT(reporter, !recording->priv().hasTasks());
|
|
|
|
// Request a mapped ssbo followed by an unmapped one. The two buffers should be distinct.
|
|
auto [ssboPtr, mappedSsbo] = mgr->getMappedStorage(10);
|
|
ssbo = mgr->getStorage(10);
|
|
REPORTER_ASSERT(reporter, !ssbo.fBuffer->isMapped());
|
|
REPORTER_ASSERT(reporter, ssbo.fBuffer != mappedSsbo.fBuffer);
|
|
}
|
|
|
|
} // namespace skgpu::graphite
|