Updated all array_view uses with the C++20 span. (#7157)

* Updated all array_view uses with the C++20 span.

The updates were done in the following order
1. `AZStd::array_view<([^>].+)\* ?>`  -> `AZStd::span<\1 const>`
2. `AZStd::array_view<(?:const )(.+)>` -> `AZStd::span<const \1>`
3. `AZStd::array_view` -> `AZStd::span`

Removed the implementation of array_view.

Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>

* Added missing whitespace between `const` and the typename for spans.

Updated the ShaderTest comparison of the ShaderResourceGroupLayout span
to compare the sizes as well

Updated comments on some of the methods that stated that they return "an
array" to mention they return "a span".

Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
This commit is contained in:
lumberyard-employee-dm
2022-01-26 16:15:47 -06:00
committed by GitHub
parent 48cea89910
commit b9824ed172
170 changed files with 833 additions and 1274 deletions
@@ -13,7 +13,6 @@ set(FILES
Instance/InstanceData.h
Instance/InstanceData.cpp
Instance/InstanceDatabase.h
std/containers/array_view.h
std/containers/fixed_vector_set.h
std/containers/lru_cache.h
std/containers/vector_set.h
@@ -1,156 +0,0 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/containers/fixed_vector.h>
#include <AzCore/std/containers/array.h>
namespace AZStd
{
/**
* Immutable wrapper for an array of data. It does not maintain storage for the data,
* but just holds pointers to mark the beginning and end of the array. It can be
* conveniently constructed from a variety of other container types like array,
* vector, and fixed_vector.
*
* Example:
* Given "void Func(AZStd::array_view<int> a) {...}" you can call...
* - Func({1,2,3});
* - AZStd::array<int,3> a = {1,2,3};
* Func(a);
* - AZStd::vector<int> v = {1,2,3};
* Func(v);
* - AZStd::fixed_vector<int,10> fv = {1,2,3};
* Func(fv);
*
* Since the array_view does not copy and store any data, it is only valid as long as the data used to create it is valid.
*/
template <class Element>
class array_view final
{
public:
using value_type = Element;
using pointer = value_type*;
using const_pointer = const value_type*;
using reference = value_type&;
using const_reference = const value_type&;
using size_type = AZStd::size_t;
using difference_type = AZStd::ptrdiff_t;
using iterator = const value_type*;
using const_iterator = const value_type*;
using reverse_iterator = AZStd::reverse_iterator<iterator>;
using const_reverse_iterator = AZStd::reverse_iterator<const_iterator>;
array_view()
: m_begin(nullptr)
, m_end(nullptr)
{ }
~array_view() = default;
array_view(const_pointer s, size_type length)
: m_begin(s)
, m_end(m_begin + length)
{
if (length == 0) erase();
}
array_view(const_pointer first, const_pointer last)
: m_begin(first)
, m_end(last)
{ }
// We explicitly delete this constructor because it's too easy to accidentally
// create an array_view to just the first element instead of an entire array.
array_view(const_pointer s) = delete;
template<AZStd::size_t N>
array_view(const AZStd::array<value_type, N>& data)
: m_begin(data.data())
, m_end(m_begin + data.size())
{ }
array_view(const AZStd::vector<value_type>& data)
: m_begin(data.data())
, m_end(m_begin + data.size())
{ }
template<AZStd::size_t N>
array_view(const AZStd::fixed_vector<value_type, N>& data)
: m_begin(data.data())
, m_end(m_begin + data.size())
{ }
array_view(const array_view&) = default;
array_view(array_view&& other)
: array_view(other.m_begin, other.m_end)
{
#if AZ_DEBUG_BUILD // Clearing the original pointers isn't necessary, but is good for debugging
other.m_begin = nullptr;
other.m_end = nullptr;
#endif
}
array_view& operator=(const array_view& other) = default;
array_view& operator=(array_view&& other)
{
m_begin = other.m_begin;
m_end = other.m_end;
#if AZ_DEBUG_BUILD // Clearing the original pointers isn't necessary, but is good for debugging
other.m_begin = nullptr;
other.m_end = nullptr;
#endif
return *this;
}
size_type size() const { return m_end - m_begin; }
bool empty() const { return m_end == m_begin; }
const_pointer data() const { return m_begin; }
const_reference operator[](size_type index) const
{
AZ_Assert(index < size(), "index value is out of range");
return m_begin[index];
}
void erase() { m_begin = m_end = nullptr; }
iterator begin() const { return m_begin; }
iterator end() const { return m_end; }
const_iterator cbegin() const { return m_begin; }
const_iterator cend() const { return m_end; }
reverse_iterator rbegin() const { return reverse_iterator(m_end); }
reverse_iterator rend() const { return reverse_iterator(m_begin); }
const_reverse_iterator crbegin() const { return const_reverse_iterator(cend()); }
const_reverse_iterator crend() const { return const_reverse_iterator(cbegin()); }
friend bool operator==(array_view lhs, array_view rhs)
{
return lhs.m_begin == rhs.m_begin && lhs.m_end == rhs.m_end;
}
friend bool operator!=(array_view lhs, array_view rhs) { return !(lhs == rhs); }
friend bool operator< (array_view lhs, array_view rhs) { return lhs.m_begin < rhs.m_begin || lhs.m_begin == rhs.m_begin && lhs.m_end < rhs.m_end; }
friend bool operator> (array_view lhs, array_view rhs) { return lhs.m_begin > rhs.m_begin || lhs.m_begin == rhs.m_begin && lhs.m_end > rhs.m_end; }
friend bool operator<=(array_view lhs, array_view rhs) { return lhs == rhs || lhs < rhs; }
friend bool operator>=(array_view lhs, array_view rhs) { return lhs == rhs || lhs > rhs; }
private:
const_pointer m_begin;
const_pointer m_end;
};
} // namespace AZStd
-300
View File
@@ -1,300 +0,0 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/UnitTest/TestTypes.h>
namespace UnitTest
{
using namespace AZStd;
class ArrayView : public AllocatorsTestFixture
{
protected:
template<typename T>
void ExpectEqual(initializer_list<T> expectedValues, array_view<T> arrayView)
{
EXPECT_EQ(false, arrayView.empty());
EXPECT_EQ(expectedValues.size(), arrayView.size());
typename AZStd::vector<T>::const_iterator iterator = arrayView.begin();
for (int i = 0; i < expectedValues.size(); ++i, ++iterator)
{
EXPECT_EQ(expectedValues.begin()[i], arrayView[i]);
EXPECT_EQ(expectedValues.begin()[i], *iterator);
}
EXPECT_EQ(iterator, arrayView.end());
}
};
TEST_F(ArrayView, DefaultConstructor)
{
array_view<bool> defaultView;
EXPECT_EQ(nullptr, defaultView.begin());
EXPECT_EQ(nullptr, defaultView.end());
EXPECT_EQ(0, defaultView.size());
EXPECT_EQ(true, defaultView.empty());
}
TEST_F(ArrayView, PointerConstructor1)
{
int originalValues[4] = { 2,3,4,5 };
array_view<int> view(originalValues, AZ_ARRAY_SIZE(originalValues));
ExpectEqual({ 2,3,4,5 }, view);
EXPECT_EQ(originalValues, view.begin());
EXPECT_EQ(&originalValues[4], view.end());
}
TEST_F(ArrayView, PointerConstructor2)
{
int originalValues[3] = { 6,7,8 };
array_view<int> view(originalValues, &originalValues[3]);
ExpectEqual({ 6,7,8 }, view);
EXPECT_EQ(originalValues, view.begin());
EXPECT_EQ(&originalValues[3], view.end());
}
TEST_F(ArrayView, ArrayConstructor)
{
array<int, 4> originalValues = { 9,10,11,12 };
array_view<int> view(originalValues);
ExpectEqual({ 9,10,11,12 }, view);
EXPECT_EQ(originalValues.begin(), view.begin());
EXPECT_EQ(originalValues.end(), view.end());
}
TEST_F(ArrayView, VectorConstructor)
{
vector<int> originalValues = { 13,14,15,16,17,18 };
array_view<int> view(originalValues);
ExpectEqual({ 13,14,15,16,17,18 }, view);
EXPECT_EQ(originalValues.begin(), view.begin());
EXPECT_EQ(originalValues.end(), view.end());
}
TEST_F(ArrayView, FixedVectorConstructor)
{
fixed_vector<int, 10> originalValues = { 17,18,19 }; // Note that even though the fixed_vector capacity is 10, it's size is 3, so the view size will be 3 as well
array_view<int> view(originalValues);
ExpectEqual({ 17,18,19 }, view);
EXPECT_EQ(originalValues.begin(), view.begin());
EXPECT_EQ(originalValues.end(), view.end());
}
TEST_F(ArrayView, CopyConstructor)
{
fixed_vector<int, 2> originalValues = { 27,28 };
array_view<int> view1(originalValues);
array_view<int> view2(view1);
ExpectEqual({ 27,28 }, view2);
EXPECT_EQ(view1.begin(), view2.begin());
EXPECT_EQ(view1.end(), view2.end());
}
TEST_F(ArrayView, MoveConstructor)
{
int originalValues[] = { 29,30,31 };
array_view<int> view1(originalValues, AZ_ARRAY_SIZE(originalValues));
array_view<int> view2(AZStd::move(view1));
ExpectEqual({ 29,30,31 }, view2);
EXPECT_EQ(originalValues, view2.begin());
EXPECT_EQ(&originalValues[3], view2.end());
// This isn't strictly necessary but is a good way to make sure the move
// constructor actually exists and it itn't just calling the copy constructor
#if AZ_DEBUG_BUILD // The pointers are only cleared in debug
EXPECT_EQ(nullptr, view1.begin());
EXPECT_EQ(nullptr, view1.end());
#endif
}
TEST_F(ArrayView, AssignmentOperator)
{
fixed_vector<int, 4> originalValues = { 32,33,34,35 };
array_view<int> view1(originalValues);
array_view<int> view2;
view2 = view1;
ExpectEqual({ 32,33,34,35 }, view2);
EXPECT_EQ(view1.begin(), view2.begin());
EXPECT_EQ(view1.end(), view2.end());
}
TEST_F(ArrayView, MoveAssignmentOperator)
{
int originalValues[] = { 36,37,38,39,40 };
array_view<int> view1(originalValues, AZ_ARRAY_SIZE(originalValues));
array_view<int> view2;
view2 = AZStd::move(view1);
ExpectEqual({ 36,37,38,39,40 }, view2);
EXPECT_EQ(originalValues, view2.begin());
EXPECT_EQ(&originalValues[5], view2.end());
// This isn't strictly necessary but is a good way to make sure the move
// assignment operator actually exists and it itn't just calling the norm
// assignment operator
#if AZ_DEBUG_BUILD // The pointers are only cleared in debug
EXPECT_EQ(nullptr, view1.begin());
EXPECT_EQ(nullptr, view1.end());
#endif
}
TEST_F(ArrayView, Erase)
{
fixed_vector<int, 4> originalValues = { 1,2,3,4 };
array_view<int> view(originalValues);
view.erase();
EXPECT_EQ(nullptr, view.begin());
EXPECT_EQ(nullptr, view.end());
EXPECT_EQ(0, view.size());
EXPECT_EQ(true, view.empty());
}
TEST_F(ArrayView, BeginAndEnd)
{
fixed_vector<int, 4> originalValues = { 1,2,3,4 };
array_view<int> view(originalValues);
EXPECT_EQ(1, view.begin()[0]);
EXPECT_EQ(4, view.end()[-1]);
EXPECT_EQ(1, view.cbegin()[0]);
EXPECT_EQ(4, view.cend()[-1]);
EXPECT_EQ(4, view.rbegin()[0]);
EXPECT_EQ(1, view.rend()[-1]);
EXPECT_EQ(4, view.crbegin()[0]);
EXPECT_EQ(1, view.crend()[-1]);
}
TEST_F(ArrayView, ImplicitConstruction)
{
// This test verifies that we can pass in various non-array_view types
// into functions that take an array_view
// The compile cannot detect the correct template type so that has to be specified explicitly
ExpectEqual<int>({ 1,2,3 }, vector<int>({ 1,2,3 }));
ExpectEqual<int>({ 1,2,3 }, fixed_vector<int, 3>({ 1,2,3 }));
ExpectEqual<int>({ 1,2,3 }, array<int, 3>({ 1,2,3 }));
}
void CheckComparisonOperators(bool areEqual, array_view<int> a, array_view<int> b)
{
EXPECT_EQ(areEqual, a == b);
// For less/greater operators, the exact order doesn't really matter;
// We just check for internal consistency
if (areEqual)
{
EXPECT_EQ(false, a != b);
EXPECT_EQ(false, a < b);
EXPECT_EQ(false, a > b);
EXPECT_EQ(true, a <= b);
EXPECT_EQ(true, a >= b);
}
else
{
EXPECT_EQ(true, a != b);
EXPECT_EQ(a > b, a >= b);
EXPECT_EQ(a < b, a <= b);
EXPECT_NE(a > b, a < b);
EXPECT_NE(a >= b, a <= b);
EXPECT_NE(a >= b, a < b);
EXPECT_NE(a > b, a <= b);
EXPECT_NE(a <= b, a > b);
EXPECT_NE(a < b, a >= b);
}
}
TEST_F(ArrayView, ComparisonOperators)
{
int arrayA[] = { 1,2,3 };
int arrayB[] = { 1,2,3 };
array_view<int> arrayA_view(arrayA, 3);
array_view<int> arrayB_view(arrayB, 3);
array_view<int> arrayA_otherView(arrayA, 3);
// view of a sub-array aligned to the beginning of the array
array_view<int> arrayA_headView(arrayA, 2);
array_view<int> arrayB_headView(arrayB, 2);
// view of a sub-array aligned to the end of the array
array_view<int> arrayA_tailView(&arrayA[1], 2);
array_view<int> arrayB_tailView(&arrayB[1], 2);
// view of a sub-array in the middle of the array
array_view<int> arrayA_centerView(&arrayA[1], 1);
array_view<int> arrayB_centerView(&arrayB[1], 1);
// Same view
CheckComparisonOperators(true, arrayA_view, arrayA_view);
// Different view, same array
CheckComparisonOperators(true, arrayA_view, arrayA_otherView);
CheckComparisonOperators(true, arrayA_otherView, arrayA_view);
// Different arrays
CheckComparisonOperators(false, arrayA_view, arrayB_view);
CheckComparisonOperators(false, arrayB_view, arrayA_view);
// Same arrays, but one is a just a subset of the array
CheckComparisonOperators(false, arrayA_view, arrayA_headView);
CheckComparisonOperators(false, arrayA_view, arrayA_tailView);
CheckComparisonOperators(false, arrayA_view, arrayA_centerView);
CheckComparisonOperators(false, arrayA_headView, arrayA_view);
CheckComparisonOperators(false, arrayA_tailView, arrayA_view);
CheckComparisonOperators(false, arrayA_centerView, arrayA_view);
// Different arrays, different lengths
CheckComparisonOperators(false, arrayA_view, arrayB_headView);
CheckComparisonOperators(false, arrayB_view, arrayA_headView);
CheckComparisonOperators(false, arrayB_headView, arrayA_view);
CheckComparisonOperators(false, arrayA_headView, arrayB_view);
}
TEST_F(ArrayView, AssertOutOfBounds)
{
array_view<int> view({ 1,2,3,4 });
AZ_TEST_START_TRACE_SUPPRESSION;
view[4];
view[5];
AZ_TEST_STOP_TRACE_SUPPRESSION(2);
}
}
@@ -7,7 +7,6 @@
#
set(FILES
ArrayView.cpp
ConcurrencyCheckerTests.cpp
InstanceDatabase.cpp
lru_cache.cpp
@@ -42,12 +42,11 @@ namespace AZStd::Internal
namespace AZStd
{
/**
* First pass partial implementation of span copied over from array_view. It
* returns non-const iterator/pointers. first(), last(), and subspan()
* are yet to be implemented. It does not maintain storage for the data,
* but just holds pointers to mark the beginning and end of the array.
* It can be conveniently constructed from a variety of other container
* types like array, vector, and fixed_vector.
* Full C++20 implementation of span done using the C++ draft at https://eel.is/c++draft/views.
* It does not maintain storage for the data,
* but just hold a pointer to mark the beginning and the size for the elements.
* It can be constructed any type that models the C++ contiguous_range concept
* such like array, vector, fixed_vector, raw-array, string_view, string, etc... .
*
* Example:
* Given "void Func(AZStd::span<int> a) {...}" you can call...
@@ -84,7 +83,7 @@ namespace AZStd
inline static constexpr size_t extent = Extent;
constexpr span() noexcept = default;;
constexpr span() noexcept = default;
~span() = default;
@@ -110,12 +109,12 @@ namespace AZStd
Extent != dynamic_extent, int> = 0>
constexpr explicit span(It first, End last);
template<size_t N, class = enable_if_t<N == dynamic_extent || N == Extent>>
template<size_t N, class = enable_if_t<extent == dynamic_extent || N == Extent>>
constexpr span(type_identity_t<element_type> (&arr)[N]) noexcept;
template <class U, size_t N, class = enable_if_t<N == dynamic_extent || N == Extent>>
template <class U, size_t N, class = enable_if_t<extent == dynamic_extent || N == Extent>>
constexpr span(array<U, N>& data) noexcept;
template <class U, size_t N, class = enable_if_t<N == dynamic_extent || N == Extent>>
template <class U, size_t N, class = enable_if_t<extent == dynamic_extent || N == Extent>>
constexpr span(const array<U, N>& data) noexcept;
template <class R, class = enable_if_t<ranges::contiguous_range<R> &&
@@ -246,4 +246,16 @@ namespace UnitTest
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
}
}
TEST_F(SpanTestFixture, CanInitializeFixedArrayToDynamicExtentSpan)
{
constexpr size_t arrayElementCount = 5;
static constexpr AZStd::array<int, arrayElementCount> intArray{ 4, 5, 6, 1, 7 };
constexpr AZStd::span<const int, AZStd::dynamic_extent> arraySpan(intArray);
static_assert(intArray.data() == arraySpan.data());
constexpr AZStd::span<const int, arrayElementCount> arraySpanFixedExtent(intArray);
static_assert(intArray.data() == arraySpanFixedExtent.data());
}
}
@@ -286,7 +286,7 @@ namespace ImageProcessingAtom
for (u32 slice = 0; slice < arraySize; slice++)
{
AZStd::array_view<uint8_t> imageData = imageAsset->GetSubImageData(mip, slice);
AZStd::span<const uint8_t> imageData = imageAsset->GetSubImageData(mip, slice);
memcpy(imageBuf + slice * imageData.size(), imageData.data(), imageData.size());
}
}
@@ -71,7 +71,7 @@ namespace UnitTest
//! Helper function.
//! Given an input list of {Key, Value} pairs returns a list of strings where each string is of the form: "Key=Value".
AZStd::vector<AZStd::string> CreateListOfStringsFromListOfKeyValues(AZStd::array_view<KeyValueView> listOfKeyValues) const
AZStd::vector<AZStd::string> CreateListOfStringsFromListOfKeyValues(AZStd::span<const KeyValueView> listOfKeyValues) const
{
AZStd::vector<AZStd::string> listOfStrings;
for (const auto& keyValue : listOfKeyValues)
@@ -90,7 +90,7 @@ namespace UnitTest
//! Helper function.
//! Given an input list of {Key, Value} pairs returns a list of strings where each string is of the form: "Key1", "Value1", "Key2", "Value2".
AZStd::vector<AZStd::string> CreateListOfSingleStringsFromListOfKeyValues(AZStd::array_view<KeyValueView> listOfKeyValues) const
AZStd::vector<AZStd::string> CreateListOfSingleStringsFromListOfKeyValues(AZStd::span<const KeyValueView> listOfKeyValues) const
{
AZStd::vector<AZStd::string> listOfStrings;
for (const auto& keyValue : listOfKeyValues)
@@ -134,7 +134,7 @@ namespace UnitTest
//! Returns a command line string that results of concatenating the input list of {Key, Value} pairs (with '=').
//! Example of a returned string:
//! "key1=value1 key2 key3 key4=value"
AZStd::string CreateCmdLineStringFromListOfKeyValues(AZStd::array_view<KeyValueView> listOfKeyValues) const
AZStd::string CreateCmdLineStringFromListOfKeyValues(AZStd::span<const KeyValueView> listOfKeyValues) const
{
AZStd::string cmdLineString;
for (const auto& keyValueView : listOfKeyValues)
@@ -148,7 +148,7 @@ namespace UnitTest
//! Returns a command line string of macro definitions that results of concatenating the input list of {Key, Value} pairs.
//! Example of a returned string:
//! "-Dkey1=value1 -Dkey2 -Dkey3 -Dkey4=value"
AZStd::string CreateMacroDefinitionCmdLineStringFromListOfKeyValues(AZStd::array_view<KeyValueView> listOfKeyValues) const
AZStd::string CreateMacroDefinitionCmdLineStringFromListOfKeyValues(AZStd::span<const KeyValueView> listOfKeyValues) const
{
AZStd::string cmdLineString;
for (const auto& keyValueView : listOfKeyValues)
@@ -161,7 +161,7 @@ namespace UnitTest
//! @param includePaths A List of folder paths
//! @param predefinedMacros A List of strings with format: "name[=value]"
ShaderBuilder::PreprocessorOptions CreatePreprocessorOptions(
AZStd::array_view<AZStd::string> includePaths, AZStd::array_view<AZStd::string> predefinedMacros) const
AZStd::span<const AZStd::string> includePaths, AZStd::span<const AZStd::string> predefinedMacros) const
{
ShaderBuilder::PreprocessorOptions preprocessorOptions;
@@ -200,8 +200,8 @@ namespace UnitTest
//! @param azslcAdditionalFreeArguments A string representing series of command line arguments for AZSLc.
//! @param dxcAdditionalFreeArguments: A string representing series of command line arguments for DXC.
ShaderBuilder::GlobalBuildOptions CreateGlobalBuildOptions(
AZStd::array_view<AZStd::string> includePaths,
AZStd::array_view<AZStd::string> predefinedMacros,
AZStd::span<const AZStd::string> includePaths,
AZStd::span<const AZStd::string> predefinedMacros,
AZStd::string_view azslcAdditionalFreeArguments,
AZStd::string_view dxcAdditionalFreeArguments) const
{
@@ -227,7 +227,7 @@ namespace UnitTest
return supervariantInfo;
}
bool StringContainsAllSubstrings(AZStd::string_view haystack, AZStd::array_view<AZStd::string> substrings)
bool StringContainsAllSubstrings(AZStd::string_view haystack, AZStd::span<const AZStd::string> substrings)
{
return AZStd::all_of(AZ_BEGIN_END(substrings),
[&](AZStd::string_view needle) -> bool
@@ -237,7 +237,7 @@ namespace UnitTest
);
}
bool StringDoesNotContainAnyOneOfTheSubstrings(AZStd::string_view haystack, AZStd::array_view<AZStd::string> substrings)
bool StringDoesNotContainAnyOneOfTheSubstrings(AZStd::string_view haystack, AZStd::span<const AZStd::string> substrings)
{
return AZStd::all_of(AZ_BEGIN_END(substrings), [&](AZStd::string_view needle) -> bool {
return (haystack.find(needle) == AZStd::string::npos);
@@ -247,7 +247,7 @@ namespace UnitTest
//! @returns: True if all strings in @substring appear in @vectorOfString.
//! @remark: Keep in mind that this is not the same as saying that all strings in @vectorOfStrings appear in @substrings.
bool VectorContainsAllSubstrings(
AZStd::array_view<AZStd::string> vectorOfStrings, AZStd::array_view<AZStd::string> substrings)
AZStd::span<const AZStd::string> vectorOfStrings, AZStd::span<const AZStd::string> substrings)
{
return AZStd::all_of(
AZ_BEGIN_END(substrings),
@@ -264,7 +264,7 @@ namespace UnitTest
}
//! @returns: True only if None of the strings in @vectorOfStrings contains any of the strings in @substrings.
bool VectorDoesNotContainAnyOneOfTheSubstrings(AZStd::array_view<AZStd::string> vectorOfStrings, AZStd::array_view<AZStd::string> substrings)
bool VectorDoesNotContainAnyOneOfTheSubstrings(AZStd::span<const AZStd::string> vectorOfStrings, AZStd::span<const AZStd::string> substrings)
{
return AZStd::all_of(AZ_BEGIN_END(vectorOfStrings), [&](AZStd::string_view haystack) -> bool {
return StringDoesNotContainAnyOneOfTheSubstrings(haystack, substrings);
@@ -27,13 +27,13 @@ namespace AZ
class BufferView;
class IndexBufferView;
}
namespace RPI
{
class Model;
class ShaderResourceGroup;
}
namespace Render
{
//! Info needed to create per-submesh views into the skinned mesh buffers so that the target skinned model can be broken into multiple sub-meshes.
@@ -212,8 +212,8 @@ namespace AZ
//! Get an individual lod
const SkinnedMeshInputLod& GetLod(size_t lodIndex) const;
//! Get an array_view of the buffer views for all the input streams
AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>> GetInputBufferViews(size_t lodIndex) const;
//! Get a span of the buffer views for all the input streams
AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>> GetInputBufferViews(size_t lodIndex) const;
//! Get the buffer view for a specific input stream
AZ::RHI::Ptr<const RHI::BufferView> GetInputBufferView(size_t lodIndex, uint8_t inputStream) const;
@@ -8,7 +8,7 @@
#pragma once
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/vector.h>
namespace AZ::Render
@@ -9,7 +9,7 @@
#pragma once
#include <AzCore/std/containers/vector.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -71,7 +71,7 @@ namespace AZ
}
}
const AZStd::array_view<RPI::PipelineViewTag> CascadedShadowmapsPass::GetPipelineViewTags()
const AZStd::span<const RPI::PipelineViewTag> CascadedShadowmapsPass::GetPipelineViewTags()
{
if (m_childrenPipelineViewTags.size() != Shadow::MaxNumberOfCascades)
{
@@ -181,7 +181,7 @@ namespace AZ
RPI::Ptr<ShadowmapPass> CascadedShadowmapsPass::CreateChild(uint16_t cascadeIndex)
{
const AZStd::array_view<RPI::PipelineViewTag> childrenViewTags = GetPipelineViewTags();
const AZStd::span<const RPI::PipelineViewTag> childrenViewTags = GetPipelineViewTags();
const Name passName{ AZStd::string::format("DirectionalLightShadowmapPass.%d", cascadeIndex) };
auto passData = AZStd::make_shared<RPI::RasterPassData>();
@@ -9,7 +9,7 @@
#include <Atom/Feature/CoreLights/CoreLightsConstants.h>
#include <Atom/RPI.Public/Pass/ParentPass.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/fixed_vector.h>
#include <CoreLights/ShadowmapAtlas.h>
#include <CoreLights/ShadowmapPass.h>
@@ -36,7 +36,7 @@ namespace AZ
void SetCameraViewName(const AZStd::string& viewName);
//! This returns pipeline view tag for children.
const AZStd::array_view<RPI::PipelineViewTag> GetPipelineViewTags();
const AZStd::span<const RPI::PipelineViewTag> GetPipelineViewTags();
//! This exposes the shadowmap atlas.
ShadowmapAtlas& GetShadowmapAtlas();
@@ -1018,7 +1018,7 @@ namespace AZ
for (const auto& passIt : m_cascadedShadowmapsPasses)
{
CascadedShadowmapsPass* shadowPass = passIt.second.front();
const AZStd::array_view<RPI::PipelineViewTag>& viewTags = shadowPass->GetPipelineViewTags();
const AZStd::span<const RPI::PipelineViewTag>& viewTags = shadowPass->GetPipelineViewTags();
AZ_Assert(viewTags.size() >= cascadeCount, "DirectionalLightFeatureProcessor: There is not enough pipeline view tags.");
RPI::RenderPipeline* pipeline = shadowPass->GetRenderPipeline();
@@ -112,7 +112,7 @@ namespace AZ
m_shadowmapImageSize = inputBinding.m_attachment->m_descriptor.m_image.m_size;
m_shadowmapArraySize = inputBinding.m_attachment->m_descriptor.m_image.m_arraySize;
const AZStd::array_view<RPI::Ptr<RPI::Pass>>& children = GetChildren();
const AZStd::span<const RPI::Ptr<RPI::Pass>>& children = GetChildren();
AZ_Assert(children.size() == EsmChildPassKindCount, "[EsmShadowmapsPass '%s'] The count of children is wrong.", GetPathName().GetCStr());
for (uint32_t childPassIndex = 0; childPassIndex < EsmChildPassKindCount; ++childPassIndex)
@@ -15,7 +15,7 @@
#include <Atom/RPI.Public/Buffer/Buffer.h>
#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
#include <AtomCore/Instance/Instance.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/Preprocessor/Enum.h>
@@ -9,7 +9,7 @@
#include <Atom/Feature/CoreLights/CoreLightsConstants.h>
#include <Atom/RPI.Public/Pass/ParentPass.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/vector.h>
#include <CoreLights/ShadowmapAtlas.h>
#include <CoreLights/ShadowmapPass.h>
@@ -16,7 +16,7 @@
#include <Atom/RPI.Public/Scene.h>
#include <Atom/RPI.Public/View.h>
#include <AzCore/Math/Quaternion.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <Atom/RPI.Reflect/Asset/AssetUtils.h>
namespace AZ
@@ -114,14 +114,14 @@ namespace AZ
}
}
AZStd::array_view<Data::Instance<RPI::Image>> DecalFeatureProcessor::GetImageArray() const
AZStd::span<const Data::Instance<RPI::Image>> DecalFeatureProcessor::GetImageArray() const
{
// [GFX TODO][ATOM-4445] Replace this hardcoded constant with atlasing / bindless so we can have far more than 8 decal textures
// Note this constant also is defined in View.srg
const size_t MaxDecals = 8;
size_t numImages = AZStd::min(MaxDecals, m_decalData.GetDataCount());
AZStd::array_view<ImagePtr> imageArrayView(m_decalData.GetDataVector<1>().begin(), m_decalData.GetDataVector<1>().begin() + numImages);
AZStd::span<const ImagePtr> imageArrayView(m_decalData.GetDataVector<1>().begin(), m_decalData.GetDataVector<1>().begin() + numImages);
return imageArrayView;
}
@@ -130,8 +130,8 @@ namespace AZ
{
AZ_PROFILE_SCOPE(RPI, "DecalFeatureProcessor: Render");
AZStd::array_view<Data::Instance<RPI::Image>> baseMaps = GetImagesFromDecalData<1>();
AZStd::array_view<Data::Instance<RPI::Image>> opacityMaps = GetImagesFromDecalData<2>();
AZStd::span<const Data::Instance<RPI::Image>> baseMaps = GetImagesFromDecalData<1>();
AZStd::span<const Data::Instance<RPI::Image>> opacityMaps = GetImagesFromDecalData<2>();
for (const RPI::ViewPtr& view : packet.m_views)
{
@@ -81,11 +81,11 @@ namespace AZ
DecalFeatureProcessor(const DecalFeatureProcessor&) = delete;
Data::Instance<RPI::Image> GetImageFromMaterial(const AZ::Name& mapName, Data::Instance<RPI::Material> materialInstance) const;
AZStd::array_view<Data::Instance<RPI::Image>> GetImageArray() const;
AZStd::span<const Data::Instance<RPI::Image>> GetImageArray() const;
void CacheShaderIndices();
template<size_t ArrayIndex>
AZStd::array_view<Data::Instance<RPI::Image>> GetImagesFromDecalData();
AZStd::span<const Data::Instance<RPI::Image>> GetImagesFromDecalData();
static constexpr const char* FeatureProcessorName = "DecalFeatureProcessor";
@@ -105,7 +105,7 @@ namespace AZ
};
template<size_t ArrayIndex>
AZStd::array_view<Data::Instance<RPI::Image>>
AZStd::span<const Data::Instance<RPI::Image>>
AZ::Render::DecalFeatureProcessor::GetImagesFromDecalData()
{
// [GFX TODO][ATOM-4445] Replace this hardcoded constant with atlasing / bindless so we can have far more than 8 decal textures
@@ -113,7 +113,7 @@ namespace AZ
const size_t MaxDecals = 4;
size_t numImages = AZStd::min(MaxDecals, m_decalData.GetDataCount());
AZStd::array_view<ImagePtr> imageArrayView(m_decalData.GetDataVector<ArrayIndex>().begin(), m_decalData.GetDataVector<ArrayIndex>().begin() + numImages);
AZStd::span<const ImagePtr> imageArrayView(m_decalData.GetDataVector<ArrayIndex>().begin(), m_decalData.GetDataVector<ArrayIndex>().begin() + numImages);
return imageArrayView;
}
} // namespace Render
@@ -267,7 +267,7 @@ namespace AZ
return AZ::RHI::GetImageSubresourceLayout(mipSize, descriptor.m_format);
}
AZStd::array_view<uint8_t> DecalTextureArray::GetRawImageData(const AZ::Name& mapName, int arrayLevel, const int mip) const
AZStd::span<const uint8_t> DecalTextureArray::GetRawImageData(const AZ::Name& mapName, int arrayLevel, const int mip) const
{
// We always want to provide valid data to the AssetCreator for each texture.
// If this spot in the array is empty, just provide some random image as filler.
@@ -13,7 +13,7 @@
#include <AzCore/Asset/AssetCommon.h>
#include <Atom/RHI.Reflect/ImageDescriptor.h>
#include <Atom/RHI.Reflect/ImageSubresource.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <Atom/RPI.Public/Image/StreamingImage.h>
@@ -81,7 +81,7 @@ namespace AZ
RHI::Size GetImageDimensions(const DecalMapType mapType) const;
RHI::Format GetFormat(const DecalMapType mapType) const;
RHI::ImageSubresourceLayout GetLayout(const DecalMapType mapType, int mip) const;
AZStd::array_view<uint8_t> GetRawImageData(const AZ::Name& mapName, int arrayLevel, int mip) const;
AZStd::span<const uint8_t> GetRawImageData(const AZ::Name& mapName, int arrayLevel, int mip) const;
bool AreAllAssetsReady() const;
bool IsAssetReady(const MaterialData& materialData) const;
@@ -13,7 +13,7 @@
#include <Atom/RPI.Public/Scene.h>
#include <Atom/RPI.Public/View.h>
#include <AzCore/Math/Quaternion.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <Atom/RPI.Public/Image/ImageSystemInterface.h>
#include <Atom/RPI.Reflect/Image/StreamingImageAssetHandler.h>
#include <AtomCore/Instance/InstanceDatabase.h>
@@ -772,7 +772,7 @@ namespace AZ
return;
}
const AZStd::array_view<Data::Instance<RPI::ModelLod>>& modelLods = m_model->GetLods();
const AZStd::span<const Data::Instance<RPI::ModelLod>>& modelLods = m_model->GetLods();
if (modelLods.empty())
{
return;
@@ -225,12 +225,12 @@ namespace AZ
return m_boneTransforms;
}
AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshDispatchItem::GetSourceUnskinnedBufferViews() const
AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshDispatchItem::GetSourceUnskinnedBufferViews() const
{
return m_inputBuffers->GetInputBufferViews(m_lodIndex);
}
AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshDispatchItem::GetTargetSkinnedBufferViews() const
AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshDispatchItem::GetTargetSkinnedBufferViews() const
{
return m_actorInstanceBufferViews;
}
@@ -65,8 +65,8 @@ namespace AZ
const RHI::DispatchItem& GetRHIDispatchItem() const;
Data::Instance<RPI::Buffer> GetBoneTransforms() const;
AZStd::array_view<RHI::Ptr<RHI::BufferView>> GetSourceUnskinnedBufferViews() const;
AZStd::array_view<RHI::Ptr<RHI::BufferView>> GetTargetSkinnedBufferViews() const;
AZStd::span<const RHI::Ptr<RHI::BufferView>> GetSourceUnskinnedBufferViews() const;
AZStd::span<const RHI::Ptr<RHI::BufferView>> GetTargetSkinnedBufferViews() const;
size_t GetVertexCount() const;
private:
// SkinnedMeshShaderOptionNotificationBus::Handler
@@ -212,7 +212,7 @@ namespace AZ
void SkinnedMeshInputLod::CreateSharedSubMeshBufferViews()
{
AZStd::array_view<RPI::ModelLodAsset::Mesh> meshes = m_modelLodAsset->GetMeshes();
AZStd::span<const RPI::ModelLodAsset::Mesh> meshes = m_modelLodAsset->GetMeshes();
m_sharedSubMeshViews.resize(meshes.size());
// The index and static buffer views will be shared by all instances that use the same SkinnedMeshInputBuffers, so set them here
@@ -307,7 +307,7 @@ namespace AZ
return m_lods[lodIndex];
}
AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshInputBuffers::GetInputBufferViews(size_t lodIndex) const
AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>> SkinnedMeshInputBuffers::GetInputBufferViews(size_t lodIndex) const
{
return m_lods[lodIndex].m_bufferViews;
}
@@ -145,7 +145,7 @@ namespace AZ
}
}
AZStd::array_view<AZStd::unique_ptr<SkinnedMeshDispatchItem>> SkinnedMeshRenderProxy::GetDispatchItems() const
AZStd::span<const AZStd::unique_ptr<SkinnedMeshDispatchItem>> SkinnedMeshRenderProxy::GetDispatchItems() const
{
return m_dispatchItemsByLod;
}
@@ -45,7 +45,7 @@ namespace AZ
void SetSkinningMatrices(const AZStd::vector<float>& data) override;
void SetMorphTargetWeights(uint32_t lodIndex, const AZStd::vector<float>& weights) override;
AZStd::array_view< AZStd::unique_ptr<SkinnedMeshDispatchItem>> GetDispatchItems() const;
AZStd::span<const AZStd::unique_ptr<SkinnedMeshDispatchItem>> GetDispatchItems() const;
private:
AZ_DISABLE_COPY_MOVE(SkinnedMeshRenderProxy);
@@ -78,7 +78,7 @@ namespace AZ
}
}
void SkinnedMeshStatsCollector::AddReadOnlyBufferViewsToSceneStats(const AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>>& sourceUnskinnedBufferViews)
void SkinnedMeshStatsCollector::AddReadOnlyBufferViewsToSceneStats(const AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>>& sourceUnskinnedBufferViews)
{
for (const AZ::RHI::Ptr<RHI::BufferView>& bufferView : sourceUnskinnedBufferViews)
{
@@ -94,7 +94,7 @@ namespace AZ
}
}
void SkinnedMeshStatsCollector::AddWritableBufferViewsToSceneStats(const AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>>& targetSkinnedBufferViews)
void SkinnedMeshStatsCollector::AddWritableBufferViewsToSceneStats(const AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>>& targetSkinnedBufferViews)
{
for (const AZ::RHI::Ptr<RHI::BufferView>& bufferView : targetSkinnedBufferViews)
{
@@ -33,8 +33,8 @@ namespace AZ
void ResetAllStats();
void AddDispatchItemToSceneStats(const AZStd::unique_ptr<SkinnedMeshDispatchItem>& dispatchItem);
void AddBonesToSceneStats(const Data::Instance<RPI::Buffer>& boneTransformBuffer);
void AddReadOnlyBufferViewsToSceneStats(const AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>>& sourceUnskinnedBufferViews);
void AddWritableBufferViewsToSceneStats(const AZStd::array_view<AZ::RHI::Ptr<RHI::BufferView>>& targetSkinnedBufferViews);
void AddReadOnlyBufferViewsToSceneStats(const AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>>& sourceUnskinnedBufferViews);
void AddWritableBufferViewsToSceneStats(const AZStd::span<const AZ::RHI::Ptr<RHI::BufferView>>& targetSkinnedBufferViews);
void AddVerticesToSceneStats(size_t vertexCount);
SkinnedMeshSceneStats m_sceneStats;
@@ -10,7 +10,7 @@
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Preprocessor/Enum.h>
#include <AzCore/std/string/string.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -129,7 +129,7 @@ namespace AZ
//! @returns A new string based on @commandLineString but with the matching arguments and their values
//! removed from it.
AZStd::string RemoveArgumentsFromCommandLineString(
AZStd::array_view<AZStd::string> listOfArguments, AZStd::string_view commandLineString);
AZStd::span<const AZStd::string> listOfArguments, AZStd::string_view commandLineString);
//! @param commandLineString: " --arg1 -arg2 --arg3=foo --arg4=bar "
//! @returns "--arg1 -arg2 --arg3=foo --arg4=bar"
@@ -9,7 +9,7 @@
#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
#include <Atom/RHI.Reflect/NameIdReflectionMap.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/smart_ptr/intrusive_base.h>
#include <AzCore/Utils/TypeHash.h>
@@ -72,7 +72,7 @@ namespace AZ
//! Returns the full lists of shader input added to the layout. Inputs
//! maintain their original order with respect to AddShaderInput.
AZStd::array_view<ShaderInputConstantDescriptor> GetShaderInputList() const;
AZStd::span<const ShaderInputConstantDescriptor> GetShaderInputList() const;
//! Returns the total size in bytes used by the constants.
uint32_t GetDataSize() const;
@@ -84,7 +84,7 @@ namespace AZ
//! Prints to the console the shader input names specified by input list of indices
//! Will ignore any indices outside of the inputs array bounds
void DebugPrintNames(AZStd::array_view<ShaderInputConstantIndex> constantList) const;
void DebugPrintNames(AZStd::span<const ShaderInputConstantIndex> constantList) const;
protected:
ConstantsLayout() = default;
@@ -12,7 +12,7 @@
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/Utils/TypeHash.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -137,7 +137,7 @@ namespace AZ
bool AddIndirectCommand(const IndirectCommandDescriptor& command);
/// Returns the list of indirect commands of the layout. Must be called after the layout is finalized.
AZStd::array_view<IndirectCommandDescriptor> GetCommands() const;
AZStd::span<const IndirectCommandDescriptor> GetCommands() const;
//! Returns the position of a command.
//! Must be called after the layout is finalized.
@@ -10,7 +10,7 @@
#include <Atom/RHI.Reflect/Format.h>
#include <Atom/RHI.Reflect/Limits.h>
#include <Atom/RHI.Reflect/ShaderSemantic.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/fixed_vector.h>
#include <AzCore/Utils/TypeHash.h>
@@ -158,10 +158,10 @@ namespace AZ
const PrimitiveTopology GetTopology() const;
/// Returns the list of stream channels.
AZStd::array_view<StreamChannelDescriptor> GetStreamChannels() const;
AZStd::span<const StreamChannelDescriptor> GetStreamChannels() const;
/// Returns the list of stream buffers.
AZStd::array_view<StreamBufferDescriptor> GetStreamBuffers() const;
AZStd::span<const StreamBufferDescriptor> GetStreamBuffers() const;
/// Returns the hash computed in Finalize(), which must be called first.
HashValue64 GetHash() const;
@@ -10,7 +10,7 @@
#include <Atom/RHI.Reflect/ShaderResourceGroupLayout.h>
#include <Atom/RHI.Reflect/ConstantsLayout.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Name/Name.h>
#include <AzCore/Serialization/SerializeContext.h>
@@ -8,7 +8,7 @@
#pragma once
#include <Atom/RHI.Reflect/Base.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/smart_ptr/intrusive_base.h>
@@ -47,7 +47,7 @@ namespace AZ
static ConstPtr<PipelineLibraryData> Create(AZStd::vector<uint8_t>&& data);
/// Returns the data payload which describes the platform-specific pipeline library data.
AZStd::array_view<uint8_t> GetData() const;
AZStd::span<const uint8_t> GetData() const;
private:
PipelineLibraryData(AZStd::vector<uint8_t>&& data);
@@ -13,7 +13,7 @@
#include <Atom/RHI.Reflect/Limits.h>
#include <AzCore/Utils/TypeHash.h>
#include <AzCore/std/containers/array.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -10,7 +10,7 @@
#include <Atom/RHI.Reflect/ConstantsLayout.h>
#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
#include <Atom/RHI.Reflect/NameIdReflectionMap.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/smart_ptr/intrusive_base.h>
#include <AzCore/Outcome/Outcome.h>
#include <AzCore/Serialization/SerializeContext.h>
@@ -116,7 +116,7 @@ namespace AZ
// The following methods are only permitted on a finalized layout.
/// Returns the full list of static samplers descriptors declared on the layout.
AZStd::array_view<ShaderInputStaticSamplerDescriptor> GetStaticSamplers() const;
AZStd::span<const ShaderInputStaticSamplerDescriptor> GetStaticSamplers() const;
/**
* Resolves an shader input name to an index for each type of shader input. To maximize performance,
@@ -148,13 +148,13 @@ namespace AZ
* maintain their original order with respect to AddShaderInput. Each type
* of shader input has its own separate list.
*/
AZStd::array_view<ShaderInputBufferDescriptor> GetShaderInputListForBuffers() const;
AZStd::array_view<ShaderInputImageDescriptor> GetShaderInputListForImages() const;
AZStd::array_view<ShaderInputSamplerDescriptor> GetShaderInputListForSamplers() const;
AZStd::array_view<ShaderInputConstantDescriptor> GetShaderInputListForConstants() const;
AZStd::span<const ShaderInputBufferDescriptor> GetShaderInputListForBuffers() const;
AZStd::span<const ShaderInputImageDescriptor> GetShaderInputListForImages() const;
AZStd::span<const ShaderInputSamplerDescriptor> GetShaderInputListForSamplers() const;
AZStd::span<const ShaderInputConstantDescriptor> GetShaderInputListForConstants() const;
AZStd::array_view<ShaderInputBufferUnboundedArrayDescriptor> GetShaderInputListForBufferUnboundedArrays() const;
AZStd::array_view<ShaderInputImageUnboundedArrayDescriptor> GetShaderInputListForImageUnboundedArrays() const;
AZStd::span<const ShaderInputBufferUnboundedArrayDescriptor> GetShaderInputListForBufferUnboundedArrays() const;
AZStd::span<const ShaderInputImageUnboundedArrayDescriptor> GetShaderInputListForImageUnboundedArrays() const;
/**
* Each shader input may contain multiple shader resources. The layout computes
@@ -20,7 +20,7 @@ namespace AZ
struct CommandListRenderTargetsState
{
using StateList = AZStd::fixed_vector<T, RHI::Limits::Pipeline::AttachmentColorCountMax>;
void Set(AZStd::array_view<T> newElements)
void Set(AZStd::span<const T> newElements)
{
m_states = StateList(newElements.begin(), newElements.end());
m_isDirty = true;
@@ -20,11 +20,11 @@ namespace AZ
{
namespace RHI
{
//! The intent of this class is to provide fast and thin access to the underlying constant
//! data (inline or from an SRG), with basic validation to protect the user. As a secondary objective, it provides type-specific convenience
//! operations as long as they don't violate the primary "fast" and "thin" objectives. To clarify, thin means
//! we don't make assumptions about the data or how the user wants to operate on the data, and the convenience
//! operations boil down to thin wrappers for single calls to SetConstantRaw and GetConstantRaw. So these
//! The intent of this class is to provide fast and thin access to the underlying constant
//! data (inline or from an SRG), with basic validation to protect the user. As a secondary objective, it provides type-specific convenience
//! operations as long as they don't violate the primary "fast" and "thin" objectives. To clarify, thin means
//! we don't make assumptions about the data or how the user wants to operate on the data, and the convenience
//! operations boil down to thin wrappers for single calls to SetConstantRaw and GetConstantRaw. So these
//! convenience functions are provided in situations that are "low-hanging-fruit".
class ConstantsData
{
@@ -53,7 +53,7 @@ namespace AZ
//! Assigns an array of type T to the constant shader input.
template <typename T>
bool SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::array_view<T> values);
bool SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::span<const T> values);
//! Assigns constant data as a whole.
bool SetConstantData(const void* bytes, size_t byteCount);
@@ -64,7 +64,7 @@ namespace AZ
//! of elements in the returned array is the number of evenly divisible elements.
//! If the strides do not match, an empty array is returned.
template <typename T>
AZStd::array_view<T> GetConstantArray(ShaderInputConstantIndex inputIndex) const;
AZStd::span<const T> GetConstantArray(ShaderInputConstantIndex inputIndex) const;
//! Returns the constant data as type 'T' returned by value. The size of the constant region
//! must match the size of T exactly. Otherwise, an empty instance is returned.
@@ -77,11 +77,11 @@ namespace AZ
template <typename T>
T GetConstant(ShaderInputConstantIndex inputIndex, uint32_t arrayIndex) const;
//! Returns constant data for the given shader input index as an array of bytes.
AZStd::array_view<uint8_t> GetConstantRaw(ShaderInputConstantIndex inputIndex) const;
//! Returns constant data for the given shader input index as a span of bytes.
AZStd::span<const uint8_t> GetConstantRaw(ShaderInputConstantIndex inputIndex) const;
//! Returns the opaque constant data populated by calls to SetConstant and SetConstantData.
AZStd::array_view<uint8_t> GetConstantData() const;
AZStd::span<const uint8_t> GetConstantData() const;
//! Returns the constants layout.
const ConstantsLayout* GetLayout() const;
@@ -123,7 +123,7 @@ namespace AZ
template <typename T>
bool ConstantsData::SetConstant(ShaderInputConstantIndex inputIndex, const T& value)
{
AZStd::array_view<T> valueArray(&value, 1);
AZStd::span<const T> valueArray(&value, 1);
return SetConstantArray(inputIndex, valueArray);
}
@@ -152,7 +152,7 @@ namespace AZ
bool ConstantsData::SetConstant<Color>(ShaderInputConstantIndex inputIndex, const Color& value);
template <>
bool ConstantsData::SetConstantArray<bool>(ShaderInputConstantIndex inputIndex, AZStd::array_view<bool> values);
bool ConstantsData::SetConstantArray<bool>(ShaderInputConstantIndex inputIndex, AZStd::span<const bool> values);
template <>
bool ConstantsData::GetConstant<bool>(ShaderInputConstantIndex inputIndex) const;
@@ -213,7 +213,7 @@ namespace AZ
}
template <typename T>
bool ConstantsData::SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::array_view<T> values)
bool ConstantsData::SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::span<const T> values)
{
const size_t sizeInBytes = values.size() * sizeof(T);
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
@@ -224,15 +224,15 @@ namespace AZ
}
template <typename T>
AZStd::array_view<T> ConstantsData::GetConstantArray(ShaderInputConstantIndex inputIndex) const
AZStd::span<const T> ConstantsData::GetConstantArray(ShaderInputConstantIndex inputIndex) const
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
const size_t elementSize = sizeof(T);
const size_t elementCount = DivideByMultiple(constantBytes.size(), elementSize);
const size_t sizeInBytes = elementCount * elementSize;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
{
return AZStd::array_view<T>(reinterpret_cast<const T*>(constantBytes.data()), elementCount);
return AZStd::span<const T>(reinterpret_cast<const T*>(constantBytes.data()), elementCount);
}
return {};
}
@@ -240,7 +240,7 @@ namespace AZ
template <typename T>
T ConstantsData::GetConstant(ShaderInputConstantIndex inputIndex) const
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
const size_t sizeInBytes = sizeof(T);
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
{
@@ -252,7 +252,7 @@ namespace AZ
template <typename T>
T ConstantsData::GetConstant(ShaderInputConstantIndex inputIndex, uint32_t arrayIndex) const
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
const size_t elementSize = sizeof(T);
const size_t elementOffset = arrayIndex * elementSize;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::ArrayElement, elementOffset, elementSize))
@@ -11,7 +11,7 @@
#include <Atom/RHI.Reflect/Base.h>
#include <Atom/RHI.Reflect/Handle.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/bitset.h>
@@ -36,7 +36,7 @@ namespace AZ
using DrawListMask = AZStd::bitset<RHI::Limits::Pipeline::DrawListTagCountMax>;
using DrawList = AZStd::vector<RHI::DrawItemProperties>;
using DrawListView = AZStd::array_view<RHI::DrawItemProperties>;
using DrawListView = AZStd::span<const RHI::DrawItemProperties>;
/// Contains a table of draw lists, indexed by the tag.
using DrawListsByTag = AZStd::array<DrawList, RHI::Limits::Pipeline::DrawListTagCountMax>;
@@ -32,7 +32,7 @@ namespace AZ
uint8_t m_stencilRef = 0;
//! The array of stream buffers to bind for this draw item.
AZStd::array_view<StreamBufferView> m_streamBufferViews;
AZStd::span<const StreamBufferView> m_streamBufferViews;
//! Shader resource group unique for this draw request
const ShaderResourceGroup* m_uniqueShaderResourceGroup = nullptr;
@@ -56,13 +56,13 @@ namespace AZ
void SetIndexBufferView(const IndexBufferView& indexBufferView);
void SetRootConstants(AZStd::array_view<uint8_t> rootConstants);
void SetRootConstants(AZStd::span<const uint8_t> rootConstants);
void SetScissors(AZStd::array_view<Scissor> scissors);
void SetScissors(AZStd::span<const Scissor> scissors);
void SetScissor(const Scissor& scissor);
void SetViewports(AZStd::array_view<Viewport> viewports);
void SetViewports(AZStd::span<const Viewport> viewports);
void SetViewport(const Viewport& viewport);
@@ -85,7 +85,7 @@ namespace AZ
IndexBufferView m_indexBufferView;
AZStd::fixed_vector<DrawRequest, DrawItemCountMax> m_drawRequests;
AZStd::fixed_vector<const ShaderResourceGroup*, Limits::Pipeline::ShaderResourceGroupCountMax> m_shaderResourceGroups;
AZStd::array_view<uint8_t> m_rootConstants;
AZStd::span<const uint8_t> m_rootConstants;
AZStd::fixed_vector<Scissor, Limits::Pipeline::AttachmentColorCountMax> m_scissors;
AZStd::fixed_vector<Viewport, Limits::Pipeline::AttachmentColorCountMax> m_viewports;
};
@@ -7,7 +7,7 @@
*/
#pragma once
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <Atom/RHI.Reflect/BufferScopeAttachmentDescriptor.h>
#include <Atom/RHI.Reflect/ImageScopeAttachmentDescriptor.h>
@@ -105,11 +105,11 @@ namespace AZ
// See RHI::FrameGraphInterface for detailed comments
ResultCode UseAttachment(const BufferScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access, ScopeAttachmentUsage usage);
ResultCode UseAttachment(const ImageScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access, ScopeAttachmentUsage usage);
ResultCode UseAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors, ScopeAttachmentAccess access, ScopeAttachmentUsage usage);
ResultCode UseAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors, ScopeAttachmentAccess access, ScopeAttachmentUsage usage);
ResultCode UseResolveAttachment(const ResolveScopeAttachmentDescriptor& descriptor);
ResultCode UseColorAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors);
ResultCode UseColorAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors);
ResultCode UseDepthStencilAttachment(const ImageScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access);
ResultCode UseSubpassInputAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors);
ResultCode UseSubpassInputAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors);
ResultCode UseShaderAttachment(const BufferScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access);
ResultCode UseShaderAttachment(const ImageScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access);
ResultCode UseCopyAttachment(const BufferScopeAttachmentDescriptor& descriptor, ScopeAttachmentAccess access);
@@ -124,7 +124,7 @@ namespace AZ
FrameGraphExecuteGroupType* AddGroup();
//! Returns a list of the registered execute groups.
AZStd::array_view<AZStd::unique_ptr<FrameGraphExecuteGroup>> GetGroups() const;
AZStd::span<const AZStd::unique_ptr<FrameGraphExecuteGroup>> GetGroups() const;
private:
//////////////////////////////////////////////////////////////////////////
@@ -18,7 +18,7 @@
#include <Atom/RHI.Reflect/ResolveScopeAttachmentDescriptor.h>
#include <Atom/RHI.Reflect/ScopeId.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -79,7 +79,7 @@ namespace AZ
//! Declares an array of image attachments for use on the current scope.
ResultCode UseAttachments(
AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors,
AZStd::span<const ImageScopeAttachmentDescriptor> descriptors,
ScopeAttachmentAccess access,
ScopeAttachmentUsage usage)
{
@@ -87,7 +87,7 @@ namespace AZ
}
//! Declares an array of color attachments for use on the current scope.
ResultCode UseColorAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors)
ResultCode UseColorAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors)
{
return m_frameGraph.UseColorAttachments(descriptors);
}
@@ -100,7 +100,7 @@ namespace AZ
//! Declares an array of subpass input attachments for use on the current scope.
//! See UseSubpassInputAttachment for a definition about a SubpassInput.
ResultCode UseSubpassInputAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors)
ResultCode UseSubpassInputAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors)
{
return m_frameGraph.UseSubpassInputAttachments(descriptors);
}
@@ -19,7 +19,7 @@ namespace AZ
/// A handle typed to the pipeline library. Used by the PipelineStateCache to abstract access.
using PipelineLibraryHandle = Handle<uint32_t, class PipelineLibrary>;
//! PipelineState initialization is an expensive operation on certain platforms. If multiple pipeline states
//! are created with little variation between them, the contents are still duplicated. This class is an allocation
//! context for pipeline states, provided at PipelineState::Init, which will perform de-duplication of
@@ -58,7 +58,7 @@ namespace AZ
//! libraries and merge them into a single unified library. The serialized data can then be
//! extracted from the unified library. An error code is returned on failure and the behavior
//! is as if the method was never called.
ResultCode MergeInto(AZStd::array_view<const PipelineLibrary*> librariesToMerge);
ResultCode MergeInto(AZStd::span<const PipelineLibrary* const> librariesToMerge);
//! Serializes the platform-specific data and returns it as a new PipelineLibraryData instance.
//! The data is opaque to the user and can only be used to re-initialize the library. Use
@@ -85,7 +85,7 @@ namespace AZ
virtual void ShutdownInternal() = 0;
/// Called when libraries are being merged into this one.
virtual ResultCode MergeIntoInternal(AZStd::array_view<const PipelineLibrary*> libraries) = 0;
virtual ResultCode MergeIntoInternal(AZStd::span<const PipelineLibrary* const> libraries) = 0;
/// Called when the library is serializing out platform-specific data.
virtual ConstPtr<PipelineLibraryData> GetSerializedDataInternal() const = 0;
@@ -24,16 +24,16 @@ namespace AZ
//! and shader constants. It utilizes basic reflection information from the shader resource group layout
//! to construct the table in the correct format for the platform-specific compile phase. The user
//! is expected to create instances of this class, fill data, and then push it to an SRG instance.
//!
//!
//! The shader resource group (SRG) includes a set of built-in SRG constants in a single internally-managed
//! constant buffer. This is separate from any custom constant buffers that some SRG layouts may include
//! as shader resources. SRG constants can be conveniently accessed through a variety of SetConstant.
//!
//!
//! This data structure holds strong references to the resource views bound onto it.
//!
//!
//! NOTE [Performance Warning]: This data structure allocates memory. If compiling several SRG's in a batch,
//! prefer to share the data between them (i.e. within a single job).
//!
//!
//! NOTE [SRG Constants]: The ConstantsData class is used for efficiently setting/getting the constants values of the SRG.
class ShaderResourceGroupData
{
@@ -65,25 +65,25 @@ namespace AZ
bool SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView, uint32_t arrayIndex);
//! Sets an array of image view for the given shader input index.
bool SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view<const ImageView*> imageViews, uint32_t arrayIndex = 0);
bool SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::span<const ImageView* const> imageViews, uint32_t arrayIndex = 0);
//! Sets an unbounded array of image view for the given shader input index.
bool SetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex, AZStd::array_view<const ImageView*> imageViews);
bool SetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex, AZStd::span<const ImageView* const> imageViews);
//! Sets one buffer view for the given shader input index.
bool SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView, uint32_t arrayIndex = 0);
//! Sets an array of image view for the given shader input index.
bool SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view<const BufferView*> bufferViews, uint32_t arrayIndex = 0);
bool SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::span<const BufferView* const> bufferViews, uint32_t arrayIndex = 0);
//! Sets an unbounded array of buffer view for the given shader input index.
bool SetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex, AZStd::array_view<const BufferView*> bufferViews);
bool SetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex, AZStd::span<const BufferView* const> bufferViews);
//! Sets one sampler for the given shader input index, using the bindingIndex as the key.
bool SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler, uint32_t arrayIndex = 0);
//! Sets an array of samplers for the given shader input index.
bool SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view<SamplerState> samplers, uint32_t arrayIndex = 0);
bool SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::span<const SamplerState> samplers, uint32_t arrayIndex = 0);
//! Assigns constant data for the given constant shader input index.
bool SetConstantRaw(ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteCount);
@@ -96,17 +96,17 @@ namespace AZ
//! Assigns a specified number of rows from a Matrix
template <typename T>
bool SetConstantMatrixRows(ShaderInputConstantIndex inputIndex, const T& value, uint32_t rowCount);
//! Assigns a value of type T to the constant shader input, at an array offset.
template <typename T>
bool SetConstant(ShaderInputConstantIndex inputIndex, const T& value, uint32_t arrayIndex);
//! Assigns an array of type T to the constant shader input.
template <typename T>
bool SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::array_view<T> values);
bool SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::span<const T> values);
//! Assigns constant data as a whole.
//!
//!
//! CAUTION!
//! Different platforms might follow different packing rules for the internally-managed SRG constant buffer.
//! To set manually a constant buffer as a whole please use Constant Buffers in AZSL,
@@ -118,33 +118,33 @@ namespace AZ
//! Returns a single image view associated with the image shader input index and array offset.
const ConstPtr<ImageView>& GetImageView(ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const;
//! Returns an array of image views associated with the given image shader input index.
AZStd::array_view<ConstPtr<ImageView>> GetImageViewArray(ShaderInputImageIndex inputIndex) const;
//! Returns a span of image views associated with the given image shader input index.
AZStd::span<const ConstPtr<ImageView>> GetImageViewArray(ShaderInputImageIndex inputIndex) const;
//! Returns an unbounded array of image views associated with the given buffer shader input index.
AZStd::array_view<ConstPtr<ImageView>> GetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex) const;
//! Returns an unbounded span of image views associated with the given buffer shader input index.
AZStd::span<const ConstPtr<ImageView>> GetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex) const;
//! Returns a single buffer view associated with the buffer shader input index and array offset.
const ConstPtr<BufferView>& GetBufferView(ShaderInputBufferIndex inputIndex, uint32_t arrayIndex) const;
//! Returns an array of buffer views associated with the given buffer shader input index.
AZStd::array_view<ConstPtr<BufferView>> GetBufferViewArray(ShaderInputBufferIndex inputIndex) const;
//! Returns a span of buffer views associated with the given buffer shader input index.
AZStd::span<const ConstPtr<BufferView>> GetBufferViewArray(ShaderInputBufferIndex inputIndex) const;
//! Returns an unbounded array of buffer views associated with the given buffer shader input index.
AZStd::array_view<ConstPtr<BufferView>> GetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex) const;
//! Returns an unbounded span of buffer views associated with the given buffer shader input index.
AZStd::span<const ConstPtr<BufferView>> GetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex) const;
//! Returns a single sampler associated with the sampler shader input index and array offset.
const SamplerState& GetSampler(ShaderInputSamplerIndex inputIndex, uint32_t arrayIndex) const;
//! Returns an array of samplers associated with the sampler shader input index.
AZStd::array_view<SamplerState> GetSamplerArray(ShaderInputSamplerIndex inputIndex) const;
//! Returns a span of samplers associated with the sampler shader input index.
AZStd::span<const SamplerState> GetSamplerArray(ShaderInputSamplerIndex inputIndex) const;
//! Returns constant data for the given shader input index as a template type.
//! The stride of T must match the size of the constant input region. The number
//! of elements in the returned array is the number of evenly divisible elements.
//! If the strides do not match, an empty array is returned.
//! of elements in the returned span is the number of evenly divisible elements.
//! If the strides do not match, an empty span is returned.
template <typename T>
AZStd::array_view<T> GetConstantArray(ShaderInputConstantIndex inputIndex) const;
AZStd::span<const T> GetConstantArray(ShaderInputConstantIndex inputIndex) const;
//! Returns the constant data as type 'T' returned by value. The size of the constant region
//! must match the size of T exactly. Otherwise, an empty instance is returned.
@@ -157,25 +157,25 @@ namespace AZ
template <typename T>
T GetConstant(ShaderInputConstantIndex inputIndex, uint32_t arrayIndex) const;
//! Returns constant data for the given shader input index as an array of bytes.
AZStd::array_view<uint8_t> GetConstantRaw(ShaderInputConstantIndex inputIndex) const;
//! Returns constant data for the given shader input index as a span of bytes.
AZStd::span<const uint8_t> GetConstantRaw(ShaderInputConstantIndex inputIndex) const;
//! Returns a {Buffer, Image, Sampler} shader resource group. Each resource type has its own separate group.
//! - The size of this group matches the size provided by ShaderResourceGroupLayout::GetGroupSizeFor{Buffer, Image, Sampler}.
//! - Use ShaderResourceGroupLayout::GetGroupInterval to retrieve a [min, max) interval into the array.
AZStd::array_view<ConstPtr<ImageView>> GetImageGroup() const;
AZStd::array_view<ConstPtr<BufferView>> GetBufferGroup() const;
AZStd::array_view<SamplerState> GetSamplerGroup() const;
//! - Use ShaderResourceGroupLayout::GetGroupInterval to retrieve a [min, max) interval into the span.
AZStd::span<const ConstPtr<ImageView>> GetImageGroup() const;
AZStd::span<const ConstPtr<BufferView>> GetBufferGroup() const;
AZStd::span<const SamplerState> GetSamplerGroup() const;
//! Reset image and buffer views setup for this ShaderResourceGroupData
//! So it won't hold references for any RHI resources
void ResetViews();
//! Returns the opaque constant data populated by calls to SetConstant and SetConstantData.
//!
//!
//! CAUTION!
//! Different platforms might follow different packing rules for the internally-managed SRG constant buffer.
AZStd::array_view<uint8_t> GetConstantData() const;
AZStd::span<const uint8_t> GetConstantData() const;
//! Returns the underlying ConstantsData struct
const ConstantsData& GetConstantsData() const;
@@ -213,7 +213,7 @@ namespace AZ
//! times in order to ensure all SRG buffers are updated.
void DisableCompilationForAllResourceTypes();
//! Returns true if any of the resource type has been enabled for compilation.
//! Returns true if any of the resource type has been enabled for compilation.
bool IsAnyResourceTypeUpdated() const;
//! Enable compilation for a resourceType specified by resourceType/resourceTypeMask
@@ -265,7 +265,7 @@ namespace AZ
EnableResourceTypeCompilation(ResourceTypeMask::ConstantDataMask, ResourceType::ConstantData);
return m_constantsData.SetConstant(inputIndex, value, arrayIndex);
}
template<typename T>
bool ShaderResourceGroupData::SetConstantMatrixRows(ShaderInputConstantIndex inputIndex, const T& value, uint32_t rowCount)
{
@@ -274,7 +274,7 @@ namespace AZ
}
template <typename T>
bool ShaderResourceGroupData::SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::array_view<T> values)
bool ShaderResourceGroupData::SetConstantArray(ShaderInputConstantIndex inputIndex, AZStd::span<const T> values)
{
if (!values.empty())
{
@@ -284,7 +284,7 @@ namespace AZ
}
template <typename T>
AZStd::array_view<T> ShaderResourceGroupData::GetConstantArray(ShaderInputConstantIndex inputIndex) const
AZStd::span<const T> ShaderResourceGroupData::GetConstantArray(ShaderInputConstantIndex inputIndex) const
{
return m_constantsData.GetConstantArray<T>(inputIndex);
}
@@ -8,7 +8,7 @@
#pragma once
#include <Atom/RHI.Reflect/Format.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Utils/TypeHash.h>
namespace AZ
@@ -65,6 +65,6 @@ namespace AZ
};
/// Utility function for checking that the set of StreamBufferViews aligns with the InputStreamLayout
bool ValidateStreamBufferViews(const InputStreamLayout& inputStreamLayout, AZStd::array_view<StreamBufferView> streamBufferViews);
bool ValidateStreamBufferViews(const InputStreamLayout& inputStreamLayout, AZStd::span<const StreamBufferView> streamBufferViews);
}
}
@@ -11,7 +11,7 @@
#include <Atom/RHI/Image.h>
#include <Atom/RHI/ImagePoolBase.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -34,7 +34,7 @@ namespace AZ
struct StreamingImageMipSlice
{
/// An array of subresource datas. The size of this array must match the array size of the image.
AZStd::array_view<StreamingImageSubresourceData> m_subresources;
AZStd::span<const StreamingImageSubresourceData> m_subresources;
/// The layout of each image in the array.
ImageSubresourceLayout m_subresourceLayout;
@@ -52,7 +52,7 @@ namespace AZ
StreamingImageInitRequest(
Image& image,
const ImageDescriptor& descriptor,
AZStd::array_view<StreamingImageMipSlice> tailMipSlices);
AZStd::span<const StreamingImageMipSlice> tailMipSlices);
/// The image to initialize.
Image* m_image = nullptr;
@@ -65,7 +65,7 @@ namespace AZ
* This should only include the baseline set of mips necessary to render the image at
* its lowest resolution. The uploads is performed synchronously.
*/
AZStd::array_view<StreamingImageMipSlice> m_tailMipSlices;
AZStd::span<const StreamingImageMipSlice> m_tailMipSlices;
};
/**
@@ -83,7 +83,7 @@ namespace AZ
* remain valid for the duration of the upload (until m_completeCallback
* is triggered).
*/
AZStd::array_view<StreamingImageMipSlice> m_mipSlices;
AZStd::span<const StreamingImageMipSlice> m_mipSlices;
/// Whether the function need to wait until the upload is finished.
bool m_waitForUpload = false;
@@ -123,7 +123,7 @@ namespace AZ
protected:
// Adds the stats of a list of heaps into the Pool's TransientAttachmentStatistics.
void CollectHeapStats(AliasedResourceTypeFlags typeMask, AZStd::array_view<TransientAttachmentStatistics::Heap> heapStats);
void CollectHeapStats(AliasedResourceTypeFlags typeMask, AZStd::span<const TransientAttachmentStatistics::Heap> heapStats);
Scope* m_currentScope = nullptr;
RHI::TransientAttachmentStatistics m_statistics;
+1 -1
View File
@@ -496,7 +496,7 @@ namespace AZ
}
AZStd::string RemoveArgumentsFromCommandLineString(
AZStd::array_view<AZStd::string> listOfArgumentsToRemove, AZStd::string_view commandLineString)
AZStd::span<const AZStd::string> listOfArgumentsToRemove, AZStd::string_view commandLineString)
{
AZStd::string customizedArguments = commandLineString;
for (const AZStd::string& azslcArgumentName : listOfArgumentsToRemove)
@@ -106,7 +106,7 @@ namespace AZ
return m_inputs[inputIndex.GetIndex()];
}
AZStd::array_view<ShaderInputConstantDescriptor> ConstantsLayout::GetShaderInputList() const
AZStd::span<const ShaderInputConstantDescriptor> ConstantsLayout::GetShaderInputList() const
{
return m_inputs;
}
@@ -145,7 +145,7 @@ namespace AZ
return true;
}
void ConstantsLayout::DebugPrintNames(AZStd::array_view<ShaderInputConstantIndex> constantList) const
void ConstantsLayout::DebugPrintNames(AZStd::span<const ShaderInputConstantIndex> constantList) const
{
AZStd::string output;
for (const ShaderInputConstantIndex& constantIdx : constantList)
@@ -137,11 +137,11 @@ namespace AZ
return true;
}
AZStd::array_view<IndirectCommandDescriptor> IndirectBufferLayout::GetCommands() const
AZStd::span<const IndirectCommandDescriptor> IndirectBufferLayout::GetCommands() const
{
if (!ValidateFinalizeState(ValidateFinalizeStateExpect::Finalized))
{
return AZStd::array_view<IndirectCommandDescriptor>();
return AZStd::span<const IndirectCommandDescriptor>();
}
return m_commands;
}
@@ -159,12 +159,12 @@ namespace AZ
return m_topology;
}
AZStd::array_view<StreamChannelDescriptor> InputStreamLayout::GetStreamChannels() const
AZStd::span<const StreamChannelDescriptor> InputStreamLayout::GetStreamChannels() const
{
return m_streamChannels;
}
AZStd::array_view<StreamBufferDescriptor> InputStreamLayout::GetStreamBuffers() const
AZStd::span<const StreamBufferDescriptor> InputStreamLayout::GetStreamBuffers() const
{
return m_streamBuffers;
}
@@ -31,7 +31,7 @@ namespace AZ
: m_data{AZStd::move(data)}
{}
AZStd::array_view<uint8_t> PipelineLibraryData::GetData() const
AZStd::span<const uint8_t> PipelineLibraryData::GetData() const
{
return m_data;
}
@@ -432,7 +432,7 @@ namespace AZ
m_bindingSlot = Handle<uint32_t>(bindingSlot);
}
AZStd::array_view<ShaderInputStaticSamplerDescriptor> ShaderResourceGroupLayout::GetStaticSamplers() const
AZStd::span<const ShaderInputStaticSamplerDescriptor> ShaderResourceGroupLayout::GetStaticSamplers() const
{
return m_staticSamplers;
}
@@ -497,32 +497,32 @@ namespace AZ
return m_constantsDataLayout->GetShaderInput(index);
}
AZStd::array_view<ShaderInputBufferDescriptor> ShaderResourceGroupLayout::GetShaderInputListForBuffers() const
AZStd::span<const ShaderInputBufferDescriptor> ShaderResourceGroupLayout::GetShaderInputListForBuffers() const
{
return m_inputsForBuffers;
}
AZStd::array_view<ShaderInputImageDescriptor> ShaderResourceGroupLayout::GetShaderInputListForImages() const
AZStd::span<const ShaderInputImageDescriptor> ShaderResourceGroupLayout::GetShaderInputListForImages() const
{
return m_inputsForImages;
}
AZStd::array_view<ShaderInputSamplerDescriptor> ShaderResourceGroupLayout::GetShaderInputListForSamplers() const
AZStd::span<const ShaderInputSamplerDescriptor> ShaderResourceGroupLayout::GetShaderInputListForSamplers() const
{
return m_inputsForSamplers;
}
AZStd::array_view<ShaderInputConstantDescriptor> ShaderResourceGroupLayout::GetShaderInputListForConstants() const
AZStd::span<const ShaderInputConstantDescriptor> ShaderResourceGroupLayout::GetShaderInputListForConstants() const
{
return m_constantsDataLayout->GetShaderInputList();
}
AZStd::array_view<ShaderInputBufferUnboundedArrayDescriptor> ShaderResourceGroupLayout::GetShaderInputListForBufferUnboundedArrays() const
AZStd::span<const ShaderInputBufferUnboundedArrayDescriptor> ShaderResourceGroupLayout::GetShaderInputListForBufferUnboundedArrays() const
{
return m_inputsForBufferUnboundedArrays;
}
AZStd::array_view<ShaderInputImageUnboundedArrayDescriptor> ShaderResourceGroupLayout::GetShaderInputListForImageUnboundedArrays() const
AZStd::span<const ShaderInputImageUnboundedArrayDescriptor> ShaderResourceGroupLayout::GetShaderInputListForImageUnboundedArrays() const
{
return m_inputsForImageUnboundedArrays;
}
+17 -17
View File
@@ -144,7 +144,7 @@ namespace AZ
}
template <>
bool ConstantsData::SetConstantArray<bool>(ShaderInputConstantIndex inputIndex, AZStd::array_view<bool> values)
bool ConstantsData::SetConstantArray<bool>(ShaderInputConstantIndex inputIndex, AZStd::span<const bool> values)
{
// The shader packs type bool as 4 bytes
const size_t elementSize = 4;
@@ -310,7 +310,7 @@ namespace AZ
template <>
bool ConstantsData::GetConstant<bool>(ShaderInputConstantIndex inputIndex) const
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
// The shader packs bool data as 4 bytes
const size_t sizeInBytes = 4;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
@@ -328,7 +328,7 @@ namespace AZ
const size_t sizeInBytes = sizeof(float) * 11;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
{
const AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
const AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
// As per shader packing rules the Matrix3x3 is stored as 11 floats (2 are padding).
float localData[12];
@@ -348,7 +348,7 @@ namespace AZ
const uint32_t sizeInBytes = sizeof(Matrix3x4);
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
{
const AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
const AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
const Matrix3x4& resultMatrix = Matrix3x4::CreateFromRowMajorFloat12(reinterpret_cast<const float*>(constantBytes.data()));
return resultMatrix;
}
@@ -361,7 +361,7 @@ namespace AZ
const size_t sizeInBytes = sizeof(float) * 16;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, sizeInBytes))
{
const AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
const AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
const Matrix4x4& resultMatrix = Matrix4x4::CreateFromRowMajorFloat16(reinterpret_cast<const float*>(constantBytes.data()));
return resultMatrix;
}
@@ -374,7 +374,7 @@ namespace AZ
constexpr size_t vector2Size = 8;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, aznumeric_caster(vector2Size)))
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
return Vector2::CreateFromFloat2(reinterpret_cast<const float*>(constantBytes.data()));
}
return Vector2();
@@ -387,7 +387,7 @@ namespace AZ
constexpr size_t vector3Size = sizeof(float) * 3;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, vector3Size))
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
return Vector3::CreateFromFloat3(reinterpret_cast<const float*>(constantBytes.data()));
}
return Vector3();
@@ -399,7 +399,7 @@ namespace AZ
constexpr size_t vector4Size = 16;
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, aznumeric_caster(vector4Size)))
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
return Vector4::CreateFromFloat4(reinterpret_cast<const float*>(constantBytes.data()));
}
return Vector4();
@@ -411,19 +411,19 @@ namespace AZ
constexpr size_t colorSize = sizeof(Color);
if (ValidateConstantAccess(inputIndex, ValidateConstantAccessExpect::Complete, 0, aznumeric_caster(colorSize)))
{
AZStd::array_view<uint8_t> constantBytes = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> constantBytes = GetConstantRaw(inputIndex);
return Color::CreateFromFloat4(reinterpret_cast<const float*>(constantBytes.data()));
}
return Color();
}
AZStd::array_view<uint8_t> ConstantsData::GetConstantRaw(ShaderInputConstantIndex inputIndex) const
AZStd::span<const uint8_t> ConstantsData::GetConstantRaw(ShaderInputConstantIndex inputIndex) const
{
const Interval interval = GetLayout()->GetInterval(inputIndex);
return AZStd::array_view<uint8_t>(&m_constantData[interval.m_min], interval.m_max - interval.m_min);
return AZStd::span<const uint8_t>(&m_constantData[interval.m_min], interval.m_max - interval.m_min);
}
AZStd::array_view<uint8_t> ConstantsData::GetConstantData() const
AZStd::span<const uint8_t> ConstantsData::GetConstantData() const
{
return m_constantData;
}
@@ -436,11 +436,11 @@ namespace AZ
bool ConstantsData::ConstantIsEqual(const ConstantsData& other, ShaderInputConstantIndex inputIndex) const
{
AZStd::array_view<uint8_t> myConstant = GetConstantRaw(inputIndex);
AZStd::array_view<uint8_t> otherConstant = other.GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> myConstant = GetConstantRaw(inputIndex);
AZStd::span<const uint8_t> otherConstant = other.GetConstantRaw(inputIndex);
// If they point to the same data, they are equal
if (myConstant == otherConstant)
if (myConstant.data() == otherConstant.data() && myConstant.size() == otherConstant.size())
{
return true;
}
@@ -474,8 +474,8 @@ namespace AZ
return differingIndices;
}
AZStd::array_view<ShaderInputConstantDescriptor> myShaderInputs = m_layout->GetShaderInputList();
AZStd::array_view<ShaderInputConstantDescriptor> otherShaderInputs = other.m_layout->GetShaderInputList();
AZStd::span<const ShaderInputConstantDescriptor> myShaderInputs = m_layout->GetShaderInputList();
AZStd::span<const ShaderInputConstantDescriptor> otherShaderInputs = other.m_layout->GetShaderInputList();
size_t minSize = AZStd::min(myShaderInputs.size(), otherShaderInputs.size());
size_t maxSize = AZStd::max(myShaderInputs.size(), otherShaderInputs.size());
@@ -33,29 +33,29 @@ namespace AZ
m_indexBufferView = indexBufferView;
}
void DrawPacketBuilder::SetRootConstants(AZStd::array_view<uint8_t> rootConstants)
void DrawPacketBuilder::SetRootConstants(AZStd::span<const uint8_t> rootConstants)
{
m_rootConstants = rootConstants;
}
void DrawPacketBuilder::SetScissors(AZStd::array_view<Scissor> scissors)
void DrawPacketBuilder::SetScissors(AZStd::span<const Scissor> scissors)
{
m_scissors = decltype(m_scissors)(scissors.begin(), scissors.end());
}
void DrawPacketBuilder::SetScissor(const Scissor& scissor)
{
SetScissors(AZStd::array_view<Scissor>(&scissor, 1));
SetScissors(AZStd::span<const Scissor>(&scissor, 1));
}
void DrawPacketBuilder::SetViewports(AZStd::array_view<Viewport> viewports)
void DrawPacketBuilder::SetViewports(AZStd::span<const Viewport> viewports)
{
m_viewports = decltype(m_viewports)(viewports.begin(), viewports.end());
}
void DrawPacketBuilder::SetViewport(const Viewport& viewport)
{
SetViewports(AZStd::array_view<Viewport>(&viewport, 1));
SetViewports(AZStd::span<const Viewport>(&viewport, 1));
}
void DrawPacketBuilder::AddShaderResourceGroup(const ShaderResourceGroup* shaderResourceGroup)
+3 -3
View File
@@ -327,7 +327,7 @@ namespace AZ
return ResultCode::InvalidArgument;
}
ResultCode FrameGraph::UseAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors, ScopeAttachmentAccess access, ScopeAttachmentUsage usage)
ResultCode FrameGraph::UseAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors, ScopeAttachmentAccess access, ScopeAttachmentUsage usage)
{
for (const ImageScopeAttachmentDescriptor& descriptor : descriptors)
{
@@ -354,7 +354,7 @@ namespace AZ
return ResultCode::InvalidArgument;
}
ResultCode FrameGraph::UseColorAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors)
ResultCode FrameGraph::UseColorAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors)
{
return UseAttachments(descriptors, ScopeAttachmentAccess::Write, ScopeAttachmentUsage::RenderTarget);
}
@@ -364,7 +364,7 @@ namespace AZ
return UseAttachment(descriptor, access, ScopeAttachmentUsage::DepthStencil);
}
ResultCode FrameGraph::UseSubpassInputAttachments(AZStd::array_view<ImageScopeAttachmentDescriptor> descriptors)
ResultCode FrameGraph::UseSubpassInputAttachments(AZStd::span<const ImageScopeAttachmentDescriptor> descriptors)
{
return UseAttachments(descriptors, ScopeAttachmentAccess::Read, ScopeAttachmentUsage::SubpassInput);
}
@@ -19,7 +19,7 @@ namespace AZ
m_jobPolicy = jobPolicy;
}
AZStd::array_view<AZStd::unique_ptr<FrameGraphExecuteGroup>> FrameGraphExecuter::GetGroups() const
AZStd::span<const AZStd::unique_ptr<FrameGraphExecuteGroup>> FrameGraphExecuter::GetGroups() const
{
return m_groups;
}
@@ -44,7 +44,7 @@ namespace AZ
return resultCode;
}
ResultCode PipelineLibrary::MergeInto(AZStd::array_view<const PipelineLibrary*> librariesToMerge)
ResultCode PipelineLibrary::MergeInto(AZStd::span<const PipelineLibrary* const> librariesToMerge)
{
if (!ValidateIsInitialized())
{
@@ -112,7 +112,7 @@ namespace AZ
return SetImageViewArray(inputIndex, imageViews, arrayIndex);
}
bool ShaderResourceGroupData::SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view<const ImageView*> imageViews, uint32_t arrayIndex)
bool ShaderResourceGroupData::SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::span<const ImageView* const> imageViews, uint32_t arrayIndex)
{
if (GetLayout()->ValidateAccess(inputIndex, static_cast<uint32_t>(arrayIndex + imageViews.size() - 1)))
{
@@ -132,13 +132,13 @@ namespace AZ
{
EnableResourceTypeCompilation(ResourceTypeMask::ImageViewMask, ResourceType::ImageView);
}
return isValidAll;
}
return false;
}
bool ShaderResourceGroupData::SetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex, AZStd::array_view<const ImageView*> imageViews)
bool ShaderResourceGroupData::SetImageViewUnboundedArray(ShaderInputImageUnboundedArrayIndex inputIndex, AZStd::span<const ImageView* const> imageViews)
{
if (GetLayout()->ValidateAccess(inputIndex))
{
@@ -169,7 +169,7 @@ namespace AZ
return SetBufferViewArray(inputIndex, bufferViews, arrayIndex);
}
bool ShaderResourceGroupData::SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view<const BufferView*> bufferViews, uint32_t arrayIndex)
bool ShaderResourceGroupData::SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::span<const BufferView* const> bufferViews, uint32_t arrayIndex)
{
if (GetLayout()->ValidateAccess(inputIndex, static_cast<uint32_t>(arrayIndex + bufferViews.size() - 1)))
{
@@ -194,7 +194,7 @@ namespace AZ
return false;
}
bool ShaderResourceGroupData::SetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex, AZStd::array_view<const BufferView*> bufferViews)
bool ShaderResourceGroupData::SetBufferViewUnboundedArray(ShaderInputBufferUnboundedArrayIndex inputIndex, AZStd::span<const BufferView* const> bufferViews)
{
if (GetLayout()->ValidateAccess(inputIndex))
{
@@ -221,10 +221,10 @@ namespace AZ
bool ShaderResourceGroupData::SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler, uint32_t arrayIndex)
{
return SetSamplerArray(inputIndex, AZStd::array_view<SamplerState>(&sampler, 1), arrayIndex);
return SetSamplerArray(inputIndex, AZStd::span<const SamplerState>(&sampler, 1), arrayIndex);
}
bool ShaderResourceGroupData::SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view<SamplerState> samplers, uint32_t arrayIndex)
bool ShaderResourceGroupData::SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::span<const SamplerState> samplers, uint32_t arrayIndex)
{
if (GetLayout()->ValidateAccess(inputIndex, static_cast<uint32_t>(arrayIndex + samplers.size() - 1)))
{
@@ -241,7 +241,7 @@ namespace AZ
return true;
}
return false;
}
}
bool ShaderResourceGroupData::SetConstantRaw(ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteCount)
{
@@ -265,7 +265,7 @@ namespace AZ
EnableResourceTypeCompilation(ResourceTypeMask::ConstantDataMask, ResourceType::ConstantData);
return m_constantsData.SetConstantData(bytes, byteOffset, byteCount);
}
const RHI::ConstPtr<RHI::ImageView>& ShaderResourceGroupData::GetImageView(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const
{
if (GetLayout()->ValidateAccess(inputIndex, arrayIndex))
@@ -276,21 +276,21 @@ namespace AZ
return s_nullImageView;
}
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> ShaderResourceGroupData::GetImageViewArray(RHI::ShaderInputImageIndex inputIndex) const
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> ShaderResourceGroupData::GetImageViewArray(RHI::ShaderInputImageIndex inputIndex) const
{
if (GetLayout()->ValidateAccess(inputIndex, 0))
{
const Interval interval = GetLayout()->GetGroupInterval(inputIndex);
return AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>(&m_imageViews[interval.m_min], interval.m_max - interval.m_min);
return AZStd::span<const RHI::ConstPtr<RHI::ImageView>>(&m_imageViews[interval.m_min], interval.m_max - interval.m_min);
}
return {};
}
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> ShaderResourceGroupData::GetImageViewUnboundedArray(RHI::ShaderInputImageUnboundedArrayIndex inputIndex) const
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> ShaderResourceGroupData::GetImageViewUnboundedArray(RHI::ShaderInputImageUnboundedArrayIndex inputIndex) const
{
if (GetLayout()->ValidateAccess(inputIndex))
{
return AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>(m_imageViewsUnboundedArray.data(), m_imageViewsUnboundedArray.size());
return AZStd::span<const RHI::ConstPtr<RHI::ImageView>>(m_imageViewsUnboundedArray.data(), m_imageViewsUnboundedArray.size());
}
return {};
}
@@ -305,21 +305,21 @@ namespace AZ
return s_nullBufferView;
}
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> ShaderResourceGroupData::GetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex) const
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> ShaderResourceGroupData::GetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex) const
{
if (GetLayout()->ValidateAccess(inputIndex, 0))
{
const Interval interval = GetLayout()->GetGroupInterval(inputIndex);
return AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>(&m_bufferViews[interval.m_min], interval.m_max - interval.m_min);
return AZStd::span<const RHI::ConstPtr<RHI::BufferView>>(&m_bufferViews[interval.m_min], interval.m_max - interval.m_min);
}
return {};
}
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> ShaderResourceGroupData::GetBufferViewUnboundedArray(RHI::ShaderInputBufferUnboundedArrayIndex inputIndex) const
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> ShaderResourceGroupData::GetBufferViewUnboundedArray(RHI::ShaderInputBufferUnboundedArrayIndex inputIndex) const
{
if (GetLayout()->ValidateAccess(inputIndex))
{
return AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>(m_bufferViewsUnboundedArray.data(), m_bufferViewsUnboundedArray.size());
return AZStd::span<const RHI::ConstPtr<RHI::BufferView>>(m_bufferViewsUnboundedArray.data(), m_bufferViewsUnboundedArray.size());
}
return {};
}
@@ -334,28 +334,28 @@ namespace AZ
return s_nullSamplerState;
}
AZStd::array_view<RHI::SamplerState> ShaderResourceGroupData::GetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex) const
AZStd::span<const RHI::SamplerState> ShaderResourceGroupData::GetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex) const
{
const Interval interval = GetLayout()->GetGroupInterval(inputIndex);
return AZStd::array_view<RHI::SamplerState>(&m_samplers[interval.m_min], interval.m_max - interval.m_min);
return AZStd::span<const RHI::SamplerState>(&m_samplers[interval.m_min], interval.m_max - interval.m_min);
}
AZStd::array_view<uint8_t> ShaderResourceGroupData::GetConstantRaw(ShaderInputConstantIndex inputIndex) const
AZStd::span<const uint8_t> ShaderResourceGroupData::GetConstantRaw(ShaderInputConstantIndex inputIndex) const
{
return m_constantsData.GetConstantRaw(inputIndex);
}
AZStd::array_view<ConstPtr<ImageView>> ShaderResourceGroupData::GetImageGroup() const
AZStd::span<const ConstPtr<ImageView>> ShaderResourceGroupData::GetImageGroup() const
{
return m_imageViews;
}
AZStd::array_view<ConstPtr<BufferView>> ShaderResourceGroupData::GetBufferGroup() const
AZStd::span<const ConstPtr<BufferView>> ShaderResourceGroupData::GetBufferGroup() const
{
return m_bufferViews;
}
AZStd::array_view<SamplerState> ShaderResourceGroupData::GetSamplerGroup() const
AZStd::span<const SamplerState> ShaderResourceGroupData::GetSamplerGroup() const
{
return m_samplers;
}
@@ -368,7 +368,7 @@ namespace AZ
m_bufferViewsUnboundedArray.assign(m_bufferViewsUnboundedArray.size(), nullptr);
}
AZStd::array_view<uint8_t> ShaderResourceGroupData::GetConstantData() const
AZStd::span<const uint8_t> ShaderResourceGroupData::GetConstantData() const
{
return m_constantsData.GetConstantData();
}
@@ -202,8 +202,8 @@ namespace AZ
// Generate diffs for image views.
if (HasImageGroup())
{
AZStd::array_view<ConstPtr<ImageView>> viewGroupOld = shaderResourceGroup.GetData().GetImageGroup();
AZStd::array_view<ConstPtr<ImageView>> viewGroupNew = groupData.GetImageGroup();
AZStd::span<const ConstPtr<ImageView>> viewGroupOld = shaderResourceGroup.GetData().GetImageGroup();
AZStd::span<const ConstPtr<ImageView>> viewGroupNew = groupData.GetImageGroup();
AZ_Assert(viewGroupOld.size() == viewGroupNew.size(), "ShaderResourceGroupData layouts do not match.");
for (size_t i = 0; i < viewGroupOld.size(); ++i)
{
@@ -214,8 +214,8 @@ namespace AZ
// Generate diffs for buffer views.
if (HasBufferGroup())
{
AZStd::array_view<ConstPtr<BufferView>> viewGroupOld = shaderResourceGroup.GetData().GetBufferGroup();
AZStd::array_view<ConstPtr<BufferView>> viewGroupNew = groupData.GetBufferGroup();
AZStd::span<const ConstPtr<BufferView>> viewGroupOld = shaderResourceGroup.GetData().GetBufferGroup();
AZStd::span<const ConstPtr<BufferView>> viewGroupNew = groupData.GetBufferGroup();
AZ_Assert(viewGroupOld.size() == viewGroupNew.size(), "ShaderResourceGroupData layouts do not match.");
for (size_t i = 0; i < viewGroupOld.size(); ++i)
{
@@ -56,7 +56,7 @@ namespace AZ
return m_byteStride;
}
bool ValidateStreamBufferViews(const RHI::InputStreamLayout& inputStreamLayout, AZStd::array_view<RHI::StreamBufferView> streamBufferViews)
bool ValidateStreamBufferViews(const RHI::InputStreamLayout& inputStreamLayout, AZStd::span<const RHI::StreamBufferView> streamBufferViews)
{
bool ok = true;
@@ -14,7 +14,7 @@ namespace AZ
StreamingImageInitRequest::StreamingImageInitRequest(
Image& image,
const ImageDescriptor& descriptor,
AZStd::array_view<StreamingImageMipSlice> tailMipSlices)
AZStd::span<const StreamingImageMipSlice> tailMipSlices)
: m_image{&image}
, m_descriptor{descriptor}
, m_tailMipSlices{tailMipSlices}
@@ -117,7 +117,7 @@ namespace AZ
return m_compileFlags;
}
void TransientAttachmentPool::CollectHeapStats(AliasedResourceTypeFlags typeMask, AZStd::array_view<TransientAttachmentStatistics::Heap> heapStats)
void TransientAttachmentPool::CollectHeapStats(AliasedResourceTypeFlags typeMask, AZStd::span<const TransientAttachmentStatistics::Heap> heapStats)
{
// [GFX_TODO][ATOM-4162] Report the memory allocated stat correctly (or as close as possible) when the heap
// supports multiple resource types. Right now we are assigning all the memory used to one resource type.
@@ -20,7 +20,7 @@ namespace UnitTest
{
protected:
void ExpectEq(AZStd::array_view<StreamBufferDescriptor> expected, AZStd::array_view<StreamBufferDescriptor> actual)
void ExpectEq(AZStd::span<const StreamBufferDescriptor> expected, AZStd::span<const StreamBufferDescriptor> actual)
{
EXPECT_EQ(expected.size(), actual.size());
for (int i = 0; i < expected.size() && i < actual.size(); ++i)
@@ -31,7 +31,7 @@ namespace UnitTest
}
}
void ExpectEq(AZStd::array_view<StreamChannelDescriptor> expected, AZStd::array_view<StreamChannelDescriptor> actual)
void ExpectEq(AZStd::span<const StreamChannelDescriptor> expected, AZStd::span<const StreamChannelDescriptor> actual)
{
EXPECT_EQ(expected.size(), actual.size());
for (int i = 0; i < expected.size() && i < actual.size(); ++i)
+1 -1
View File
@@ -28,7 +28,7 @@ namespace UnitTest
{
}
RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::array_view<const RHI::PipelineLibrary*> libraries)
RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::span<const RHI::PipelineLibrary* const> libraries)
{
return RHI::ResultCode::Success;
}
+1 -1
View File
@@ -25,7 +25,7 @@ namespace UnitTest
private:
AZ::RHI::ResultCode InitInternal(AZ::RHI::Device&, const AZ::RHI::PipelineLibraryData*) override { return AZ::RHI::ResultCode::Success; }
void ShutdownInternal() override;
AZ::RHI::ResultCode MergeIntoInternal(AZStd::array_view<const AZ::RHI::PipelineLibrary*>) override;
AZ::RHI::ResultCode MergeIntoInternal(AZStd::span<const AZ::RHI::PipelineLibrary* const>) override;
AZ::RHI::ConstPtr<AZ::RHI::PipelineLibraryData> GetSerializedDataInternal() const override { return nullptr; }
};
@@ -21,13 +21,13 @@ namespace UnitTest
protected:
template<class T>
void ExpectEqMemory(AZStd::array_view<T> expected, AZStd::array_view<T> actual)
void ExpectEqMemory(AZStd::span<const T> expected, AZStd::span<const T> actual)
{
EXPECT_EQ(expected.size(), actual.size());
EXPECT_TRUE(memcmp(expected.data(), actual.data(), expected.size() * sizeof(T)) == 0);
}
void ExpectEq(AZStd::array_view<SubpassRenderAttachmentLayout> expected, AZStd::array_view<SubpassRenderAttachmentLayout> actual)
void ExpectEq(AZStd::span<const SubpassRenderAttachmentLayout> expected, AZStd::span<const SubpassRenderAttachmentLayout> actual)
{
EXPECT_EQ(expected.size(), actual.size());
for (int i = 0; i < expected.size() && i < actual.size(); ++i)
@@ -316,7 +316,7 @@ namespace UnitTest
const auto ValidateFloat4Values = [&]()
{
AZStd::array_view<float> float4ValueResult = srgData.GetConstantArray<float>(float4ValueIndex);
AZStd::span<const float> float4ValueResult = srgData.GetConstantArray<float>(float4ValueIndex);
EXPECT_EQ(float4ValueResult.size(), 4);
EXPECT_EQ(float4ValueResult[0], float4Values[0]);
EXPECT_EQ(float4ValueResult[1], float4Values[1]);
@@ -324,13 +324,13 @@ namespace UnitTest
EXPECT_EQ(float4ValueResult[3], float4Values[3]);
};
AZStd::array_view<uint32_t> uintValuesResult = srgData.GetConstantArray<uint32_t>(uintValueIndex);
AZStd::span<const uint32_t> uintValuesResult = srgData.GetConstantArray<uint32_t>(uintValueIndex);
EXPECT_EQ(uintValuesResult.size(), 3);
EXPECT_EQ(uintValuesResult[0], uintValues[0]);
EXPECT_EQ(uintValuesResult[1], uintValues[1]);
EXPECT_EQ(uintValuesResult[2], uintValues[2]);
AZStd::array_view<NestedData> nestedDataResult = srgData.GetConstantArray<NestedData>(nestedDataIndex);
AZStd::span<const NestedData> nestedDataResult = srgData.GetConstantArray<NestedData>(nestedDataIndex);
EXPECT_EQ(nestedDataResult.size(), 16);
ValidateFloat4Values();
@@ -484,17 +484,17 @@ namespace UnitTest
const Vector4 vector4 = Vector4::CreateFromFloat4(vector4values);
EXPECT_TRUE(srgData.SetConstant(vector2index, vector2));
AZStd::array_view<uint8_t> resultVector2 = srgData.GetConstantRaw(vector2index);
AZStd::span<const uint8_t> resultVector2 = srgData.GetConstantRaw(vector2index);
const Vector2 vector2result = *reinterpret_cast<const Vector2*>(resultVector2.data());
EXPECT_EQ(vector2result, vector2);
EXPECT_TRUE(srgData.SetConstant(vector3index, vector3));
AZStd::array_view<uint8_t> resutVector3 = srgData.GetConstantRaw(vector3index);
AZStd::span<const uint8_t> resutVector3 = srgData.GetConstantRaw(vector3index);
const Vector3 vector3result = *reinterpret_cast<const Vector3*>(resutVector3.data());
EXPECT_EQ(vector3result, vector3);
EXPECT_TRUE(srgData.SetConstant(vector4index, vector4));
AZStd::array_view<uint8_t> resutVector4 = srgData.GetConstantRaw(vector4index);
AZStd::span<const uint8_t> resutVector4 = srgData.GetConstantRaw(vector4index);
const Vector4 vector4result = *reinterpret_cast<const Vector4*>(resutVector4.data());
EXPECT_EQ(vector4result, vector4);
}
@@ -524,7 +524,7 @@ namespace UnitTest
AZ_TEST_START_ASSERTTEST;
EXPECT_FALSE(srgData.SetConstant(vector2index, vector3));
AZ_TEST_STOP_ASSERTTEST(1);
AZStd::array_view<uint8_t> resutV3 = srgData.GetConstantRaw(vector2index);
AZStd::span<const uint8_t> resutV3 = srgData.GetConstantRaw(vector2index);
const Vector3 v3result = *reinterpret_cast<const Vector3*>(resutV3.data());
EXPECT_NE(v3result, vector3);
@@ -534,7 +534,7 @@ namespace UnitTest
AZ_TEST_START_ASSERTTEST;
EXPECT_FALSE(srgData.SetConstant(vector3index, vector4));
AZ_TEST_STOP_ASSERTTEST(1);
AZStd::array_view<uint8_t> resutV4 = srgData.GetConstantRaw(vector3index);
AZStd::span<const uint8_t> resutV4 = srgData.GetConstantRaw(vector3index);
const Vector4 v4result = *reinterpret_cast<const Vector4*>(resutV4.data());
EXPECT_NE(v4result, vector4);
@@ -544,7 +544,7 @@ namespace UnitTest
AZ_TEST_START_ASSERTTEST;
EXPECT_FALSE(srgData.SetConstant(vector4index, vector3));
AZ_TEST_STOP_ASSERTTEST(1);
AZStd::array_view<uint8_t> resutV3FromIndex4 = srgData.GetConstantRaw(vector4index);
AZStd::span<const uint8_t> resutV3FromIndex4 = srgData.GetConstantRaw(vector4index);
const Vector4 v4resultFromIndex4 = *reinterpret_cast<const Vector4*>(resutV3FromIndex4.data());
EXPECT_NE(v4resultFromIndex4, vector4);
}
@@ -8,7 +8,7 @@
#pragma once
#include <Atom/RHI.Reflect/ShaderStageFunction.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/std/containers/vector.h>
@@ -19,7 +19,7 @@ namespace AZ
namespace DX12
{
using ShaderByteCode = AZStd::vector<uint8_t>;
using ShaderByteCodeView = AZStd::array_view<uint8_t>;
using ShaderByteCodeView = AZStd::span<const uint8_t>;
/**
* A set of indices used to access physical sub-stages within a virtual stage.
@@ -9,7 +9,7 @@
#include <RHI/CommandQueue.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
namespace AZ
{
@@ -129,14 +129,14 @@ namespace AZ
const RHI::Viewport* viewports,
uint32_t count)
{
m_state.m_viewportState.Set(AZStd::array_view<RHI::Viewport>(viewports, count));
m_state.m_viewportState.Set(AZStd::span<const RHI::Viewport>(viewports, count));
}
void CommandList::SetScissors(
const RHI::Scissor* scissors,
uint32_t count)
{
m_state.m_scissorState.Set(AZStd::array_view<RHI::Scissor>(scissors, count));
m_state.m_scissorState.Set(AZStd::span<const RHI::Scissor>(scissors, count));
}
void CommandList::SetShaderResourceGroupForDraw(const RHI::ShaderResourceGroup& shaderResourceGroup)
@@ -18,7 +18,7 @@
#include <Atom/RHI/CommandListValidator.h>
#include <Atom/RHI/CommandListStates.h>
#include <Atom/RHI/ObjectPool.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/containers/array.h>
@@ -46,7 +46,7 @@ namespace AZ
ID3D12DeviceX* dx12Device = device.GetDevice();
#if defined (AZ_DX12_USE_PIPELINE_LIBRARY)
AZStd::array_view<uint8_t> bytes;
AZStd::span<const uint8_t> bytes;
bool shouldCreateLibFromSerializedData = true;
if (RHI::Factory::Get().IsRenderDocModuleLoaded() ||
@@ -214,7 +214,7 @@ namespace AZ
#endif
}
RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::array_view<const RHI::PipelineLibrary*> pipelineLibraries)
RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::span<const RHI::PipelineLibrary* const> pipelineLibraries)
{
if (RHI::Factory::Get().IsRenderDocModuleLoaded() ||
RHI::Factory::Get().IsPixModuleLoaded())
@@ -239,14 +239,14 @@ namespace AZ
}
}
#endif
return RHI::ResultCode::Success;
return RHI::ResultCode::Success;
}
RHI::ConstPtr<RHI::PipelineLibraryData> PipelineLibrary::GetSerializedDataInternal() const
{
#if defined (AZ_DX12_USE_PIPELINE_LIBRARY)
AZStd::lock_guard<AZStd::mutex> lock(m_mutex);
AZStd::vector<uint8_t> serializedData(m_library->GetSerializedSize());
HRESULT hr = m_library->Serialize(serializedData.data(), serializedData.size());
@@ -33,7 +33,7 @@ namespace AZ
// RHI::PipelineLibrary
RHI::ResultCode InitInternal(RHI::Device& device, const RHI::PipelineLibraryData* serializedData) override;
void ShutdownInternal() override;
RHI::ResultCode MergeIntoInternal(AZStd::array_view<const RHI::PipelineLibrary*> libraries) override;
RHI::ResultCode MergeIntoInternal(AZStd::span<const RHI::PipelineLibrary* const> libraries) override;
RHI::ConstPtr<RHI::PipelineLibraryData> GetSerializedDataInternal() const override;
bool IsMergeRequired() const;
//////////////////////////////////////////////////////////////////////////
@@ -20,7 +20,7 @@ namespace AZ
namespace DX12
{
template<typename T, typename U>
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetSRVsFromImageViews(const AZStd::array_view<RHI::ConstPtr<T>>& imageViews, D3D12_SRV_DIMENSION dimension)
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetSRVsFromImageViews(const AZStd::span<const RHI::ConstPtr<T>>& imageViews, D3D12_SRV_DIMENSION dimension)
{
AZStd::vector<DescriptorHandle> cpuSourceDescriptors(imageViews.size(), m_descriptorContext->GetNullHandleSRV(dimension));
@@ -36,7 +36,7 @@ namespace AZ
}
template<typename T, typename U>
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetUAVsFromImageViews(const AZStd::array_view<RHI::ConstPtr<T>>& imageViews, D3D12_UAV_DIMENSION dimension)
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetUAVsFromImageViews(const AZStd::span<const RHI::ConstPtr<T>>& imageViews, D3D12_UAV_DIMENSION dimension)
{
AZStd::vector<DescriptorHandle> cpuSourceDescriptors(imageViews.size(), m_descriptorContext->GetNullHandleUAV(dimension));
for (size_t i = 0; i < cpuSourceDescriptors.size(); ++i)
@@ -50,7 +50,7 @@ namespace AZ
return cpuSourceDescriptors;
}
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetCBVsFromBufferViews(const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufferViews)
AZStd::vector<DescriptorHandle> ShaderResourceGroupPool::GetCBVsFromBufferViews(const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufferViews)
{
AZStd::vector<DescriptorHandle> cpuSourceDescriptors(bufferViews.size(), m_descriptorContext->GetNullHandleCBV());
@@ -278,7 +278,7 @@ namespace AZ
{
const RHI::ShaderInputBufferIndex bufferInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
D3D12_DESCRIPTOR_RANGE_TYPE descriptorRangeType = ConvertShaderInputBufferAccess(shaderInputBuffer.m_access);
AZStd::vector<DescriptorHandle> descriptorHandles;
switch (descriptorRangeType)
@@ -313,7 +313,7 @@ namespace AZ
{
const RHI::ShaderInputImageIndex imageInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
D3D12_DESCRIPTOR_RANGE_TYPE descriptorRangeType = ConvertShaderInputImageAccess(shaderInputImage.m_access);
AZStd::vector<DescriptorHandle> descriptorHandles;
@@ -349,7 +349,7 @@ namespace AZ
{
const RHI::ShaderInputSamplerIndex samplerInputIndex(shaderInputIndex);
AZStd::array_view<RHI::SamplerState> samplers = groupData.GetSamplerArray(samplerInputIndex);
AZStd::span<const RHI::SamplerState> samplers = groupData.GetSamplerArray(samplerInputIndex);
UpdateDescriptorTableRange(descriptorTable, samplerInputIndex, samplers);
}
}
@@ -364,7 +364,7 @@ namespace AZ
for (const RHI::ShaderInputBufferUnboundedArrayDescriptor& shaderInputBufferUnboundedArray : groupLayout.GetShaderInputListForBufferUnboundedArrays())
{
const RHI::ShaderInputBufferUnboundedArrayIndex bufferUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewUnboundedArray(bufferUnboundedArrayInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewUnboundedArray(bufferUnboundedArrayInputIndex);
uint32_t tableIndex = shaderInputIndex * RHI::Limits::Device::FrameCountMax + group.m_compiledDataIndex;
@@ -403,7 +403,7 @@ namespace AZ
for (const RHI::ShaderInputImageUnboundedArrayDescriptor& shaderInputImageUnboundedArray : groupLayout.GetShaderInputListForImageUnboundedArrays())
{
const RHI::ShaderInputImageUnboundedArrayIndex imageUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewUnboundedArray(imageUnboundedArrayInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewUnboundedArray(imageUnboundedArrayInputIndex);
uint32_t tableIndex = shaderInputIndex * RHI::Limits::Device::FrameCountMax + group.m_compiledDataIndex;
@@ -447,7 +447,7 @@ namespace AZ
RHI::ShaderInputBufferAccess bufferAccess)
{
const RHI::ShaderInputBufferUnboundedArrayIndex bufferUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews =
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> bufferViews =
groupData.GetBufferViewUnboundedArray(bufferUnboundedArrayInputIndex);
if (bufferViews.empty())
@@ -488,7 +488,7 @@ namespace AZ
RHI::ShaderInputImageType imageType)
{
const RHI::ShaderInputImageUnboundedArrayIndex imageUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews =
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> imageViews =
groupData.GetImageViewUnboundedArray(imageUnboundedArrayInputIndex);
if (imageViews.empty())
@@ -565,7 +565,7 @@ namespace AZ
for (const RHI::ShaderInputBufferUnboundedArrayDescriptor& shaderInputBufferUnboundedArray : groupLayout.GetShaderInputListForBufferUnboundedArrays())
{
const RHI::ShaderInputBufferUnboundedArrayIndex bufferUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewUnboundedArray(bufferUnboundedArrayInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewUnboundedArray(bufferUnboundedArrayInputIndex);
uint32_t tableIndex = shaderInputIndex * RHI::Limits::Device::FrameCountMax + group.m_compiledDataIndex;
if (!bufferViews.empty())
@@ -597,7 +597,7 @@ namespace AZ
groupLayout.GetShaderInputListForImageUnboundedArrays())
{
const RHI::ShaderInputImageUnboundedArrayIndex imageUnboundedArrayInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews =
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> imageViews =
groupData.GetImageViewUnboundedArray(imageUnboundedArrayInputIndex);
uint32_t tableIndex = shaderInputIndex * RHI::Limits::Device::FrameCountMax + group.m_compiledDataIndex;
@@ -675,7 +675,7 @@ namespace AZ
void ShaderResourceGroupPool::UpdateDescriptorTableRange(
DescriptorTable descriptorTable,
RHI::ShaderInputSamplerIndex samplerInputIndex,
AZStd::array_view<RHI::SamplerState> samplerStates)
AZStd::span<const RHI::SamplerState> samplerStates)
{
const DescriptorHandle nullHandle = m_descriptorContext->GetNullHandleSampler();
AZStd::vector<DescriptorHandle> cpuSourceDescriptors(aznumeric_caster(samplerStates.size()), nullHandle);
@@ -82,7 +82,7 @@ namespace AZ
void UpdateDescriptorTableRange(
DescriptorTable descriptorTable,
RHI::ShaderInputSamplerIndex samplerIndex,
AZStd::array_view<RHI::SamplerState> samplerStates);
AZStd::span<const RHI::SamplerState> samplerStates);
//Cache all the gpu handles for the Descriptor tables related to all the views
void CacheGpuHandlesForViews(ShaderResourceGroup& group);
@@ -93,12 +93,12 @@ namespace AZ
DescriptorTable GetSamplerTable(DescriptorTable descriptorTable, RHI::ShaderInputSamplerIndex samplerInputIndex) const;
template<typename T, typename U>
AZStd::vector<DescriptorHandle> GetSRVsFromImageViews(const AZStd::array_view<RHI::ConstPtr<T>>& imageViews, D3D12_SRV_DIMENSION dimension);
AZStd::vector<DescriptorHandle> GetSRVsFromImageViews(const AZStd::span<const RHI::ConstPtr<T>>& imageViews, D3D12_SRV_DIMENSION dimension);
template<typename T, typename U>
AZStd::vector<DescriptorHandle> GetUAVsFromImageViews(const AZStd::array_view<RHI::ConstPtr<T>>& bufferViews, D3D12_UAV_DIMENSION dimension);
AZStd::vector<DescriptorHandle> GetUAVsFromImageViews(const AZStd::span<const RHI::ConstPtr<T>>& bufferViews, D3D12_UAV_DIMENSION dimension);
AZStd::vector<DescriptorHandle> GetCBVsFromBufferViews(const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufferViews);
AZStd::vector<DescriptorHandle> GetCBVsFromBufferViews(const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufferViews);
MemoryPoolSubAllocator m_constantAllocator;
DescriptorContext* m_descriptorContext = nullptr;
@@ -9,7 +9,7 @@
#include <Atom/RHI.Reflect/Metal/Base.h>
#include <Atom/RHI.Reflect/ShaderStageFunction.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/std/containers/vector.h>
@@ -53,7 +53,7 @@ namespace AZ
{
return AZ::Metal::PipelineLayoutDescriptor::Create();
}
bool ShaderPlatformInterface::BuildPipelineLayoutDescriptor(
RHI::Ptr<RHI::PipelineLayoutDescriptor> pipelineLayoutDescriptor,
const ShaderResourceGroupInfoList& srgInfoList,
@@ -62,10 +62,10 @@ namespace AZ
{
AZ::Metal::PipelineLayoutDescriptor* metalDescriptor = azrtti_cast<AZ::Metal::PipelineLayoutDescriptor*>(pipelineLayoutDescriptor.get());
AZ_Assert(metalDescriptor, "PipelineLayoutDescriptor should have been created by now");
const uint32_t groupLayoutCount = static_cast<uint32_t>(srgInfoList.size());
AZ_Assert(groupLayoutCount <= RHI::Limits::Pipeline::ShaderResourceGroupCountMax, "Exceeded ShaderResourceGroupLayout count limit.");
// Slot to index mapping
AZ::Metal::SlotToIndexTable slotToIndexTable;
AZ::Metal::IndexToSlotTable indexToSlotTable;
@@ -81,17 +81,17 @@ namespace AZ
{
return first.m_layout->GetBindingSlot() < second.m_layout->GetBindingSlot();
});
for (uint32_t groupLayoutIndex = 0; groupLayoutIndex < groupLayoutCount; ++groupLayoutIndex)
{
const auto& srgInfo = sortedSrgInfos[groupLayoutIndex];
const RHI::ShaderResourceGroupLayout& groupLayout = *srgInfo.m_layout;
const uint32_t srgLayoutSlot = groupLayout.GetBindingSlot();
AZ_Assert(srgLayoutSlot <= RHI::Limits::Pipeline::ShaderResourceGroupCountMax, "Cannot exceed the array limit");
slotToIndexTable[srgLayoutSlot] = groupLayoutIndex;
indexToSlotTable[groupLayoutIndex] = srgLayoutSlot;
ShaderResourceGroupVisibility srgVisibility;
for (const auto& resourceBindInfo : srgInfo.m_bindingInfo.m_resourcesRegisterMap)
{
@@ -99,24 +99,24 @@ namespace AZ
}
srgVisibility.m_constantDataStageMask = srgInfo.m_bindingInfo.m_constantDataBindingInfo.m_shaderStageMask;
metalDescriptor->AddShaderResourceGroupVisibility(srgVisibility);
//cache the layout in order to fill out unused variables
m_srgLayouts[groupLayoutIndex] = srgInfo.m_layout;
}
if (rootConstantsInfo.m_totalSizeInBytes > 0)
{
metalDescriptor->SetRootConstantBinding(RootConstantBinding{ rootConstantsInfo.m_registerId, rootConstantsInfo.m_spaceId });
}
metalDescriptor->SetBindingTables(slotToIndexTable, indexToSlotTable);
return metalDescriptor->Finalize() == RHI::ResultCode::Success;
}
RHI::Ptr<RHI::ShaderStageFunction> ShaderPlatformInterface::CreateShaderStageFunction(const StageDescriptor& stageDescriptor)
{
RHI::Ptr<ShaderStageFunction> newShaderStageFunction = ShaderStageFunction::Create(RHI::ToRHIShaderStage(stageDescriptor.m_stageType));
const Metal::ShaderSourceCode& sourceCode = stageDescriptor.m_sourceCode;
//Metal sourceCode is great for debugging but it is not needed as we are also packing the bytecode. This
@@ -127,7 +127,7 @@ namespace AZ
const AZStd::string& entryFunctionName = stageDescriptor.m_entryFunctionName;
newShaderStageFunction->SetByteCode(byteCode);
newShaderStageFunction->SetEntryFunctionName(entryFunctionName);
newShaderStageFunction->Finalize();
return newShaderStageFunction;
}
@@ -159,7 +159,7 @@ namespace AZ
return shaderCompilerArguments.MakeAdditionalAzslcCommandLineString() +
" --use-spaces --unique-idx --namespace=mt,vk --root-const=128 --pad-root-const";
}
AZStd::string ShaderPlatformInterface::GetAzslCompilerWarningParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const
{
return shaderCompilerArguments.MakeAdditionalAzslcWarningCommandLineString();
@@ -255,7 +255,7 @@ namespace AZ
// Stage profile name parameter
const AZStd::string shaderModelVersion = "6_2";
const AZStd::unordered_map<RHI::ShaderHardwareStage, AZStd::string> stageToProfileName =
{
{RHI::ShaderHardwareStage::Vertex, "vs_" + shaderModelVersion},
@@ -268,15 +268,15 @@ namespace AZ
AZ_Error(MetalShaderPlatformName, false, "Unsupported shader stage");
return false;
}
// For this approach we will be doing hlsl->spirv(through dxc) and spirv->metalSL(through spirv cross)
// Output spirv file
AZStd::string shaderSpirvOutputFile = RHI::BuildFileNameWithExtension(shaderSourceFile, tempFolder, "spirv");
// Compilation parameters
AZStd::string params = shaderCompilerArguments.MakeAdditionalDxcCommandLineString();
params += " -spirv"; // Generate SPIRV shader
// Enable half precision types when shader model >= 6.2
int shaderModelMajor = 0;
int shaderModelMinor = 0;
@@ -318,7 +318,7 @@ namespace AZ
params.c_str(), // 3
shaderSpirvOutputFile.c_str(), // 4
dxcInputFile.c_str()); // 5
// Run dxc Compiler
if (!RHI::ExecuteShaderCompiler(dxcRelativePath, dxcCommandOptions, shaderSourceFile, "DXC"))
{
@@ -329,9 +329,9 @@ namespace AZ
{
byProducts.m_intermediatePaths.insert(shaderSpirvOutputFile); // the spirv spit by DXC
}
IO::FileIOStream spirvOutFileStream(shaderSpirvOutputFile.data(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary);
if (!spirvOutFileStream.IsOpen())
{
AZ_Error(MetalShaderPlatformName, false, "Failed because the shader file \"%s\" could not be opened", shaderSpirvOutputFile.data());
@@ -343,12 +343,12 @@ namespace AZ
spirvOutFileStream.Close();
return false;
}
// spirv cross compiler executable
static const char* spirvCrossRelativePath = "Builders/SPIRVCross/spirv-cross";
AZStd::string spirvCrossCommandOptions = AZStd::string::format("--msl --msl-version 20100 --msl-invariant-float-math --msl-argument-buffers --msl-decoration-binding --msl-texture-buffer-native --output \"%s\" \"%s\"", shaderMSLOutputFile.c_str(), shaderSpirvOutputFile.c_str());
// Run spirv cross
if (!RHI::ExecuteShaderCompiler(spirvCrossRelativePath, spirvCrossCommandOptions, shaderSpirvOutputFile, "SpirvCross"))
{
@@ -357,7 +357,7 @@ namespace AZ
return false;
}
spirvOutFileStream.Close();
IO::FileIOStream outFileStream(shaderMSLOutputFile.data(), IO::OpenMode::ModeRead);
bool finalizeShaderResult = UpdateCompiledShader(outFileStream, MetalShaderPlatformName, shaderMSLOutputFile.data(), sourceMetalShader);
AZ_Assert(finalizeShaderResult, "Final compiled shader was not created. Check if %s was created", shaderMSLOutputFile.c_str());
@@ -366,7 +366,7 @@ namespace AZ
{
byProducts.m_intermediatePaths.emplace(AZStd::move(shaderMSLOutputFile)); // .msl metal out of sv-cross
}
bool compileMetalSL = CreateMetalLib(MetalShaderPlatformName, shaderSourceFile, tempFolder, compiledByteCode, sourceMetalShader, platform);
if (!compileMetalSL)
{
@@ -376,7 +376,7 @@ namespace AZ
return finalizeShaderResult;
}
bool ShaderPlatformInterface::UpdateCompiledShader(AZ::IO::FileIOStream& fileStream, const char* platformName, const char* fileName, AZStd::vector<char>& compiledShader) const
{
if (!fileStream.IsOpen())
@@ -390,16 +390,16 @@ namespace AZ
fileStream.Close();
return false;
}
compiledShader.resize(fileStream.GetLength() + 1); // +1 to add end of string
memset(compiledShader.data(), 0, fileStream.GetLength() + 1);
fileStream.Read(fileStream.GetLength(), compiledShader.data());
fileStream.Close();
//Ensure that the argument buffer declaration in the shader matches the srg layout
return AddUnusedResources(compiledShader);
}
bool ShaderPlatformInterface::CreateMetalLib(const char* platformName,
const AZStd::string& shaderSourceFile,
const AZStd::string& tempFolder,
@@ -408,22 +408,22 @@ namespace AZ
const AssetBuilderSDK::PlatformInfo& platform) const
{
AZStd::string inputMetalFile = RHI::BuildFileNameWithExtension(shaderSourceFile, tempFolder, "metal");
AZ::IO::FileIOStream sourceMtlfileStream(inputMetalFile.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary);
if (!sourceMtlfileStream.IsOpen())
{
AZ_Error(platformName, false, "Failed because the shader file \"%s\" could not be opened", inputMetalFile.c_str());
return false;
}
AZStd::string mtlSource = AZStd::string(sourceMetalShader.begin(), sourceMetalShader.end());
sourceMtlfileStream.Write(mtlSource.size(), mtlSource.data());
sourceMtlfileStream.Close();
AZStd::string outputAirFile = RHI::BuildFileNameWithExtension(shaderSourceFile, tempFolder, "air");
AZStd::string outMetalLibFile = RHI::BuildFileNameWithExtension(shaderSourceFile, tempFolder, "metallib");
//Debug symbols are always enabled at the moment. Need to turn them off for optimized shader assets.
//Debug symbols are always enabled at the moment. Need to turn them off for optimized shader assets.
AZStd::string shaderDebugInfo = "-gline-tables-only -MO";
AZStd::string shaderMslToAirOptions = "-fpreserve-invariance";
@@ -434,47 +434,47 @@ namespace AZ
{
platformSdk = "iphoneos";
}
//Convert to air file
AZStd::string mslToAirCommandOptions = AZStd::string::format("-sdk %s metal \"%s\" %s %s -c -o \"%s\"", platformSdk.c_str(), inputMetalFile.c_str(), shaderDebugInfo.c_str(), shaderMslToAirOptions.c_str(), outputAirFile.c_str());
if (!RHI::ExecuteShaderCompiler("/usr/bin/xcrun", mslToAirCommandOptions, inputMetalFile, "MslToAir"))
{
AZ_Error(MetalShaderPlatformName, false, "Failed to convert to AIR file %s", inputMetalFile.c_str());
return false;
}
//convert to metallib
AZStd::string airToMetalLibCommandOptions = AZStd::string::format("-sdk %s metallib \"%s\" -o \"%s\"", platformSdk.c_str(), outputAirFile.c_str(), outMetalLibFile.c_str());
if (!RHI::ExecuteShaderCompiler("/usr/bin/xcrun", airToMetalLibCommandOptions, outputAirFile, "AirToMetallib"))
{
AZ_Error(MetalShaderPlatformName, false, "Failed to convert to metallib file");
return false;
}
AZ::IO::FileIOStream fileStream(outMetalLibFile.data(), AZ::IO::OpenMode::ModeRead);
compiledByteCode.resize(fileStream.GetLength());
memset(compiledByteCode.data(), 0, fileStream.GetLength() );
fileStream.Read(fileStream.GetLength(), compiledByteCode.data());
fileStream.Close();
return true;
}
bool ShaderPlatformInterface::AddUnusedResources(AZStd::vector<char>& compiledShader) const
{
AZStd::string finalMetalSLStr = AZStd::string(compiledShader.begin(), compiledShader.end());
const uint32_t groupLayoutCount = static_cast<uint32_t>(m_srgLayouts.size());
AZStd::string constantBufferTempStructs = "\n";
AZStd::string structuredBufferTempStructs = "\n";
for (uint32_t groupLayoutIndex = 0; groupLayoutIndex < groupLayoutCount; ++groupLayoutIndex)
{
//const auto& srgInfo = m_srgInfoList[groupLayoutIndex];
const RHI::ShaderResourceGroupLayout& groupLayout = *m_srgLayouts[groupLayoutIndex];
//Check if an argument buffer declaration exists for this srg layout.
AZStd::string srgBuffer = AZStd::string::format("spvDescriptorSetBuffer%i", groupLayoutIndex);
size_t startOfArgBufferPos = finalMetalSLStr.find(srgBuffer);
@@ -485,7 +485,7 @@ namespace AZ
size_t endOfArgBufferPos = finalMetalSLStr.find("}", startOfArgBufferPos);
AZStd::string fullArgBufferDeclarationStr = finalMetalSLStr.substr(startOfArgBufferPos,endOfArgBufferPos - startOfArgBufferPos + 1);
//Add all the existing or dummy entries into m_argBufferEntries which is a set. The reason for using a set
//is because we need the entries to be sorted based on the register and we do not want duplicates.
bool result = AddConstantBufferEntries(groupLayout, constantBufferTempStructs, fullArgBufferDeclarationStr, groupLayoutIndex);
@@ -494,44 +494,44 @@ namespace AZ
AZ_Error(MetalShaderPlatformName, false, "Failed because adding constant buffer entries within AddUnusedResources failed");
return false;
}
result = AddImageEntries(groupLayout, fullArgBufferDeclarationStr);
if(!result)
{
AZ_Error(MetalShaderPlatformName, false, "Failed because adding image entries within AddUnusedResources failed");
return false;
}
result = AddSamplerEntries(groupLayout, fullArgBufferDeclarationStr);
if(!result)
{
AZ_Error(MetalShaderPlatformName, false, "Failed because adding static sampler entries within AddUnusedResources failed");
return false;
}
result = AddBufferEntries(groupLayout, structuredBufferTempStructs, fullArgBufferDeclarationStr, groupLayoutIndex);
if(!result)
{
AZ_Error(MetalShaderPlatformName, false, "Failed because adding buffer entries within AddUnusedResources failed");
return false;
}
//Create a new spvDescriptorSetBuffer which matches the layout.
AZStd::string newArgBufferLayoutStr = "\n";
for (const ArgBufferEntries &entry : m_argBufferEntries )
{
newArgBufferLayoutStr += " " + entry.first + "\n";
}
//Replace the existing declaration with the new one just generated.
//We look for '{' and '}' to find out boundaries of the argument buffer declaration to replace
size_t startOfArgBufferBracketPos = finalMetalSLStr.find("{", startOfArgBufferPos) + 1;
size_t endOfArgBufferBracketPos = finalMetalSLStr.find("}", startOfArgBufferBracketPos) - 1;
finalMetalSLStr.replace(startOfArgBufferBracketPos, endOfArgBufferBracketPos - startOfArgBufferBracketPos, newArgBufferLayoutStr);
m_argBufferEntries.clear();
}
//Add dummy definitions of constant buffer and structured buffer types to the top of the file
AZStd::string startOfShaderTag = "using namespace metal;";
const size_t startOfShaderPos = finalMetalSLStr.find(startOfShaderTag);
@@ -540,28 +540,28 @@ namespace AZ
finalMetalSLStr.insert(startOfShaderPos + startOfShaderTag.length() + 1, constantBufferTempStructs);
finalMetalSLStr.insert(startOfShaderPos + startOfShaderTag.length() + 1, structuredBufferTempStructs);
}
compiledShader = AZStd::vector<char>(finalMetalSLStr.begin(), finalMetalSLStr.end());
return true;
}
bool ShaderPlatformInterface::AddConstantBufferEntries(const RHI::ShaderResourceGroupLayout& groupLayout,
AZStd::string& constantBufferTempStructs,
AZStd::string& argBufferStr,
uint32_t groupLayoutIndex) const
{
AZStd::array_view<RHI::ShaderInputConstantDescriptor> shaderInputConstantList = groupLayout.GetShaderInputListForConstants();
AZStd::span<const RHI::ShaderInputConstantDescriptor> shaderInputConstantList = groupLayout.GetShaderInputListForConstants();
if (shaderInputConstantList.empty())
{
return true;
}
//Only need the information from the first element of the constant buffer.
const RHI::ShaderInputConstantDescriptor& shaderInputConstant = shaderInputConstantList[0];
uint32_t regId = shaderInputConstant.m_registerId;
AZStd::string srgResource = AZStd::string::format("id(%i)", regId);
size_t resourceStartPos = argBufferStr.find(srgResource);
//Check if we need to create a dummy entry
if (resourceStartPos == AZStd::string::npos)
@@ -578,7 +578,7 @@ namespace AZ
*
*/
constantBufferTempStructs += AZStd::string::format("struct type_DummyStruct%i_DescSet%i\n{\n float dummyArray[%i];\n};\n", regId, groupLayoutIndex, numElements);
//Create the final resource entry to be added to the set
AZStd::string dummyResource = AZStd::string::format("constant type_DummyStruct%i_DescSet%i* dummyConstantBuffer%i [[id(%i)]];", regId, groupLayoutIndex, regId, regId);
m_argBufferEntries.insert(AZStd::make_pair(dummyResource, regId));
@@ -590,7 +590,7 @@ namespace AZ
return AddExistingResourceEntry("constant type_ConstantBuffer", resourceStartPos, regId, argBufferStr);
}
}
bool ShaderPlatformInterface::AddImageEntries(const RHI::ShaderResourceGroupLayout& groupLayout,
AZStd::string& argBufferStr) const
{
@@ -599,7 +599,7 @@ namespace AZ
{
uint32_t regId = shaderInputImage.m_registerId;
AZStd::string srgResource = AZStd::string::format("id(%i)", regId);
const size_t resourceStartPos = argBufferStr.find(srgResource);
//Check if we need to create a dummy entry
if (resourceStartPos == AZStd::string::npos)
@@ -652,7 +652,7 @@ namespace AZ
AZ_Assert(false, "Invalid texture type.");
}
}
//Create the resource entry to be added to the set. Handle arrays by checking the shaderInputImage.m_count
AZStd::string dummyResource;
if(shaderInputImage.m_count > 1)
@@ -678,11 +678,11 @@ namespace AZ
}
return result;
}
bool ShaderPlatformInterface::ProcessSamplerEntry(uint32_t regId, AZStd::string& argBufferStr, uint32_t samplercount) const
{
AZStd::string srgResource = AZStd::string::format("id(%i)", regId);
const size_t resourceStartPos = argBufferStr.find(srgResource);
//Check if we need to create a dummy entry
if (resourceStartPos == AZStd::string::npos)
@@ -705,7 +705,7 @@ namespace AZ
return AddExistingResourceEntry("sampler", resourceStartPos, regId, argBufferStr);
}
}
bool ShaderPlatformInterface::AddSamplerEntries(const RHI::ShaderResourceGroupLayout& groupLayout,
AZStd::string& argBufferStr) const
{
@@ -714,15 +714,15 @@ namespace AZ
{
result &= ProcessSamplerEntry(staticSampler.m_registerId, argBufferStr, 0);
}
for (const RHI::ShaderInputSamplerDescriptor& dynamicSampler : groupLayout.GetShaderInputListForSamplers())
{
result &= ProcessSamplerEntry(dynamicSampler.m_registerId, argBufferStr, dynamicSampler.m_count);
}
return result;
}
bool ShaderPlatformInterface::AddBufferEntries(const RHI::ShaderResourceGroupLayout& groupLayout,
AZStd::string& structuredBufferTempStructs,
AZStd::string& argBufferStr,
@@ -733,7 +733,7 @@ namespace AZ
{
uint32_t regId = shaderInputBuffer.m_registerId;
AZStd::string srgResource = AZStd::string::format("id(%i)", regId);
size_t resourceStartPos = argBufferStr.find(srgResource);
//Check if we need to create a dummy entry
if (resourceStartPos == AZStd::string::npos)
@@ -755,7 +755,7 @@ namespace AZ
*/
structuredBufferTempStructs += AZStd::string::format("struct DummySRG_%s_DescSet%i\n{\n float dummyArray[%i];\n};\n", shaderInputBuffer.m_name.GetCStr(), groupLayoutIndex, numElements);
structuredBufferTempStructs += AZStd::string::format("struct type_RWStructuredDummyBuffer%i_DescSet%i\n{\n DummySRG_%s_DescSet%i _m0[%i];\n};\n", regId, groupLayoutIndex, shaderInputBuffer.m_name.GetCStr(), groupLayoutIndex, shaderInputBuffer.m_count);
//Create the final resource entry to be added to the set
AZStd::string dummyResource = AZStd::string::format("device type_RWStructuredDummyBuffer%i_DescSet%i* dummyStructuredBuffer%i [[id(%i)]];", regId, groupLayoutIndex, regId, regId);
m_argBufferEntries.insert(AZStd::make_pair(dummyResource, regId));
@@ -823,7 +823,7 @@ namespace AZ
}
return result;
}
bool ShaderPlatformInterface::AddExistingResourceEntry(const char* resourceStr,
size_t resourceStartPos,
uint32_t regId,
@@ -832,8 +832,8 @@ namespace AZ
size_t prevEndOfLine = argBufferStr.rfind("\n", resourceStartPos);
size_t nextEndOfLine = argBufferStr.find("\n", resourceStartPos);
size_t startOfEntryPos = argBufferStr.find(resourceStr, prevEndOfLine);
//Check to see if a valid entry is found.
//Check to see if a valid entry is found.
if(startOfEntryPos == AZStd::string::npos || startOfEntryPos > nextEndOfLine)
{
AZ_Error(MetalShaderPlatformName, startOfEntryPos != AZStd::string::npos, "Entry-> %s not found within Descriptor set %s", resourceStr, argBufferStr.c_str());
@@ -843,7 +843,7 @@ namespace AZ
{
size_t endOfEntryPos = argBufferStr.find("\n", startOfEntryPos);
AZ_Assert(endOfEntryPos != AZStd::string::npos, "Resource entry missing");
AZStd::string existingEntry = argBufferStr.substr(prevEndOfLine,endOfEntryPos - prevEndOfLine);
m_argBufferEntries.insert(AZStd::make_pair(existingEntry, regId));
return true;
@@ -23,14 +23,14 @@ namespace AZ
{
return aznew ArgumentBuffer();
}
void ArgumentBuffer::Init(Device* device, RHI::ConstPtr<RHI::ShaderResourceGroupLayout> srgLayout, ShaderResourceGroup& group, ShaderResourceGroupPool* srgPool)
{
@autoreleasepool
{
m_device = device;
m_srgLayout = srgLayout;
m_constantBufferSize = srgLayout->GetConstantDataSize();
if (m_constantBufferSize)
{
@@ -47,23 +47,23 @@ namespace AZ
m_constantBuffer.SetName(constantBufferName.c_str());
AZ_Assert(m_constantBuffer.IsValid(), "Couldnt allocate memory for Constant buffer")
}
NSMutableArray* argBufferDecriptors = [[[NSMutableArray alloc] init] autorelease];
bool argDescriptorsCreated = CreateArgumentDescriptors(argBufferDecriptors);
if(argDescriptorsCreated)
{
NSSortDescriptor* sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"index"
ascending:YES] autorelease];
NSArray* sortedArgDescriptors = [argBufferDecriptors sortedArrayUsingDescriptors:@[sortDescriptor]];
m_argumentEncoder = [m_device->GetMtlDevice() newArgumentEncoderWithArguments:sortedArgDescriptors];
NSUInteger argumentBufferLength = m_argumentEncoder.encodedLength;
RHI::BufferDescriptor bufferDescriptor;
bufferDescriptor.m_byteCount = argumentBufferLength;
bufferDescriptor.m_bindFlags = RHI::BufferBindFlags::Constant;
AZStd::string argBufferName = "ArgumentBuffer";
@@ -77,24 +77,24 @@ namespace AZ
m_argumentBuffer.SetName(argBufferName.c_str());
SetName(Name(argBufferName.c_str()));
//Attach the argument buffer to the argument encoder
[m_argumentEncoder setArgumentBuffer:m_argumentBuffer.GetGpuAddress<id<MTLBuffer>>()
offset:m_argumentBuffer.GetOffset()];
//Attach the static samplers
AttachStaticSamplers();
//Attach the constant buffer
AttachConstantBuffer();
}
}
}
bool ArgumentBuffer::CreateArgumentDescriptors(NSMutableArray* argBufferDecriptors)
{
bool resourceAdded = false;
for (const RHI::ShaderInputBufferDescriptor& shaderInputBuffer : m_srgLayout->GetShaderInputListForBuffers())
{
MTLArgumentDescriptor* bufferArgDescriptor = [[[MTLArgumentDescriptor alloc] init] autorelease];
@@ -102,7 +102,7 @@ namespace AZ
[argBufferDecriptors addObject:bufferArgDescriptor];
resourceAdded = true;
}
for (const RHI::ShaderInputImageDescriptor& shaderInputImage : m_srgLayout->GetShaderInputListForImages())
{
MTLArgumentDescriptor* imgArgDescriptor = [[[MTLArgumentDescriptor alloc] init] autorelease];
@@ -110,7 +110,7 @@ namespace AZ
[argBufferDecriptors addObject:imgArgDescriptor];
resourceAdded = true;
}
for (const RHI::ShaderInputSamplerDescriptor& shaderInputSampler : m_srgLayout->GetShaderInputListForSamplers())
{
MTLArgumentDescriptor* samplerArgDescriptor = [[[MTLArgumentDescriptor alloc] init] autorelease];
@@ -121,7 +121,7 @@ namespace AZ
[argBufferDecriptors addObject:samplerArgDescriptor];
resourceAdded = true;
}
for (const RHI::ShaderInputStaticSamplerDescriptor& staticSamplerInput : m_srgLayout->GetStaticSamplers())
{
MTLArgumentDescriptor* staticSamplerArgDescriptor = [[[MTLArgumentDescriptor alloc] init] autorelease];
@@ -131,8 +131,8 @@ namespace AZ
[argBufferDecriptors addObject:staticSamplerArgDescriptor];
resourceAdded = true;
}
AZStd::array_view<RHI::ShaderInputConstantDescriptor> shaderInputConstantList = m_srgLayout->GetShaderInputListForConstants();
AZStd::span<const RHI::ShaderInputConstantDescriptor> shaderInputConstantList = m_srgLayout->GetShaderInputListForConstants();
if (!shaderInputConstantList.empty())
{
const RHI::ShaderInputConstantDescriptor& shaderInputConstant = shaderInputConstantList[0];
@@ -143,10 +143,10 @@ namespace AZ
[argBufferDecriptors addObject:constBufferArgDescriptor];
resourceAdded = true;
}
return resourceAdded;
}
void ArgumentBuffer::AttachStaticSamplers()
{
for (const RHI::ShaderInputStaticSamplerDescriptor& staticSampler : m_srgLayout->GetStaticSamplers())
@@ -157,17 +157,17 @@ namespace AZ
[m_argumentEncoder setSamplerState:mtlSamplerState atIndex:staticSampler.m_registerId];
}
}
void ArgumentBuffer::AttachConstantBuffer()
{
AZStd::array_view<RHI::ShaderInputConstantDescriptor> shaderInputConstantList = m_srgLayout->GetShaderInputListForConstants();
AZStd::span<const RHI::ShaderInputConstantDescriptor> shaderInputConstantList = m_srgLayout->GetShaderInputListForConstants();
if (!shaderInputConstantList.empty())
{
const RHI::ShaderInputConstantDescriptor& shaderInputConstant = shaderInputConstantList[0];
[m_argumentEncoder setBuffer:m_constantBuffer.GetGpuAddress<id<MTLBuffer>>() offset:m_constantBuffer.GetOffset() atIndex:shaderInputConstant.m_registerId];
}
}
void ArgumentBuffer::BindNullSamplers(uint32_t registerId, uint32_t samplerCount)
{
AZStd::array<id<MTLSamplerState>, MaxEntriesInArgTable> mtlSamplers;
@@ -177,25 +177,25 @@ namespace AZ
{
mtlSamplers[i] = nullMtlSampler;
}
NSRange range = {registerId, samplerCount};
[m_argumentEncoder setSamplerStates : mtlSamplers.data()
withRange : range];
}
void ArgumentBuffer::UpdateImageViews(const RHI::ShaderInputImageDescriptor& shaderInputImage,
const RHI::ShaderInputImageIndex shaderInputIndex,
const AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>& imageViews)
const AZStd::span<const RHI::ConstPtr<RHI::ImageView>>& imageViews)
{
int imageArrayLen = 0;
AZStd::array<id<MTLTexture>, MaxEntriesInArgTable> mtlTextures;
for (const RHI::ConstPtr<RHI::ImageView>& imageViewBase : imageViews)
{
if (imageViewBase && !imageViewBase->IsStale())
{
const auto& imageView = static_cast<const ImageView&>(*imageViewBase);
RHI::Ptr<Memory> textureMemPtr = imageView.GetMemoryView().GetMemory();
mtlTextures[imageArrayLen] = textureMemPtr->GetGpuAddress<id<MTLTexture>>();
m_resourceBindings[shaderInputImage.m_name].insert(ResourceBindingData{textureMemPtr, .m_imageAccess = shaderInputImage.m_access});
@@ -208,7 +208,7 @@ namespace AZ
}
imageArrayLen++;
}
AZ_Assert(imageArrayLen==shaderInputImage.m_count, "Make sure we have created the correct length of texture array");
if(imageArrayLen > 0)
{
@@ -217,10 +217,10 @@ namespace AZ
withRange : range];
}
}
void ArgumentBuffer::UpdateSamplers(const RHI::ShaderInputSamplerDescriptor& shaderInputSampler,
const RHI::ShaderInputSamplerIndex shaderInputIndex,
const AZStd::array_view<RHI::SamplerState>& samplerStates)
const AZStd::span<const RHI::SamplerState>& samplerStates)
{
int samplerArrayLen = 0;
AZStd::array<id<MTLSamplerState>, MaxEntriesInArgTable> mtlSamplers;
@@ -232,7 +232,7 @@ namespace AZ
mtlSamplers[samplerArrayLen] = GetMtlSampler(samplerDesc);
samplerArrayLen++;
}
AZ_Assert(samplerArrayLen==shaderInputSampler.m_count, "Make sure we dont have a nil sampler within mtlSamplers");
if(samplerArrayLen > 0)
{
@@ -245,16 +245,16 @@ namespace AZ
BindNullSamplers(shaderInputSampler.m_registerId, shaderInputSampler.m_count);
}
}
void ArgumentBuffer::UpdateBufferViews(const RHI::ShaderInputBufferDescriptor& shaderInputBuffer,
const RHI::ShaderInputBufferIndex shaderInputIndex,
const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufferViews)
const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufferViews)
{
int bufferArrayLen = 0;
AZStd::array<id<MTLBuffer>, MaxEntriesInArgTable> mtlBuffers;
AZStd::array<NSUInteger, MaxEntriesInArgTable> mtlBufferOffsets;
AZStd::array<id<MTLTexture>, MaxEntriesInArgTable> mtlTextures;
for (const RHI::ConstPtr<RHI::BufferView>& bufferViewBase : bufferViews)
{
if (bufferViewBase && !bufferViewBase->IsStale())
@@ -298,12 +298,12 @@ namespace AZ
bufferArrayLen++;
}
AZ_Assert(bufferArrayLen==shaderInputBuffer.m_count, "Make sure we have created the correct length of buffer array");
if(bufferArrayLen > 0)
{
NSRange range = {shaderInputBuffer.m_registerId, bufferArrayLen};
if(shaderInputBuffer.m_type == RHI::ShaderInputBufferType::Typed)
{
[m_argumentEncoder setTextures : mtlTextures.data()
@@ -317,8 +317,8 @@ namespace AZ
}
}
}
void ArgumentBuffer::UpdateConstantBufferViews(AZStd::array_view<uint8_t> rawData)
void ArgumentBuffer::UpdateConstantBufferViews(AZStd::span<const uint8_t> rawData)
{
AZ_Assert(rawData.size() <= m_constantBufferSize, "rawData size can not be bigger than constant Buffer Size");
if ( (m_constantBufferSize > 0) && (rawData.size() <= m_constantBufferSize))
@@ -326,11 +326,11 @@ namespace AZ
memcpy(m_constantBuffer.GetCpuAddress(), rawData.data(), rawData.size());
}
}
void ArgumentBuffer::Shutdown()
{
ClearResourceTracking();
#if defined(ARGUMENTBUFFER_PAGEALLOCATOR)
if(m_constantBuffer.IsValid())
{
@@ -339,13 +339,13 @@ namespace AZ
if(m_argumentBuffer.IsValid())
{
m_device->GetArgumentBufferAllocator().DeAllocate(m_argumentBuffer);
}
}
#else
if(m_argumentBuffer.IsValid())
{
m_device->QueueForRelease(m_argumentBuffer);
}
if(m_constantBuffer.IsValid())
{
m_device->QueueForRelease(m_constantBuffer);
@@ -354,28 +354,28 @@ namespace AZ
m_argumentBuffer = {};
m_constantBuffer = {};
[m_argumentEncoder release];
m_argumentEncoder = nil;
Base::Shutdown();
}
id<MTLBuffer> ArgumentBuffer::GetArgEncoderBuffer() const
{
return m_argumentBuffer.GetGpuAddress<id<MTLBuffer>>();
};
size_t ArgumentBuffer::GetOffset() const
{
return m_argumentBuffer.GetOffset();
};
void ArgumentBuffer::ClearResourceTracking()
{
m_resourceBindings.clear();
}
id<MTLSamplerState> ArgumentBuffer::GetMtlSampler(MTLSamplerDescriptor* samplerDesc)
{
const NSCache* samplerCache = m_device->GetSamplerCache();
@@ -385,10 +385,10 @@ namespace AZ
mtlSamplerState = [m_device->GetMtlDevice() newSamplerStateWithDescriptor:samplerDesc];
[samplerCache setObject:mtlSamplerState forKey:samplerDesc];
}
return mtlSamplerState;
}
void ArgumentBuffer::CollectUntrackedResources(id<MTLCommandEncoder> commandEncoder,
const ShaderResourceGroupVisibility& srgResourcesVisInfo,
ComputeResourcesToMakeResidentMap& resourcesToMakeResidentCompute,
@@ -408,19 +408,19 @@ namespace AZ
else
{
MTLRenderStages mtlRenderStages = GetRenderStages(srgResourcesVisInfo.m_constantDataStageMask);
AZStd::pair <MTLResourceUsage,MTLRenderStages> key = AZStd::make_pair(MTLResourceUsageRead, mtlRenderStages);
AZStd::pair <MTLResourceUsage,MTLRenderStages> key = AZStd::make_pair(MTLResourceUsageRead, mtlRenderStages);
resourcesToMakeResidentGraphics[key].emplace(mtlconstantBufferResource);
}
}
}
//Cach all the resources within a srg that are used by the shader based on the visibility information
for (const auto& it : m_resourceBindings)
{
//Extract the visibility mask for the give resource
auto visMaskIt = srgResourcesVisInfo.m_resourcesStageMask.find(it.first);
AZ_Assert(visMaskIt != srgResourcesVisInfo.m_resourcesStageMask.end(), "No Visibility information available")
uint8_t numBitsSet = RHI::CountBitsSet(static_cast<uint64_t>(visMaskIt->second));
//Only use this resource if it is used in one of the shaders
if (numBitsSet > 0)
@@ -464,7 +464,7 @@ namespace AZ
AZ_Assert(false, "Undefined Resource type");
}
}
id<MTLResource> mtlResourceToBind = resourceBindingData.m_resourcPtr->GetGpuAddress<id<MTLResource>>();
resourcesToMakeResidentMap[resourceUsage].emplace(mtlResourceToBind);
}
@@ -475,7 +475,7 @@ namespace AZ
const ResourceBindingsSet& resourceBindingDataSet,
GraphicsResourcesToMakeResidentMap& resourcesToMakeResidentMap) const
{
MTLRenderStages mtlRenderStages = GetRenderStages(visShaderMask);
MTLResourceUsage resourceUsage = MTLResourceUsageRead;
for (const auto& resourceBindingData : resourceBindingDataSet)
@@ -498,17 +498,17 @@ namespace AZ
AZ_Assert(false, "Undefined Resource type");
}
}
AZStd::pair <MTLResourceUsage, MTLRenderStages> key = AZStd::make_pair(resourceUsage, mtlRenderStages);
id<MTLResource> mtlResourceToBind = resourceBindingData.m_resourcPtr->GetGpuAddress<id<MTLResource>>();
resourcesToMakeResidentMap[key].emplace(mtlResourceToBind);
}
}
bool ArgumentBuffer::IsNullHeapNeededForVertexStage(const ShaderResourceGroupVisibility& srgResourcesVisInfo) const
{
bool isUsedByVertexStage = false;
//Iterate over all the SRG entries
for (const auto& it : srgResourcesVisInfo.m_resourcesStageMask)
{
@@ -520,7 +520,7 @@ namespace AZ
}
return isUsedByVertexStage;
}
bool ArgumentBuffer::IsNullDescHeapNeeded() const
{
return m_useNullDescriptorHeap;
@@ -26,12 +26,12 @@ struct ResourceBindingData
AZ::RHI::ShaderInputImageAccess m_imageAccess;
AZ::RHI::ShaderInputBufferAccess m_bufferAccess;
};
bool operator==(const ResourceBindingData& other) const
{
return this->m_resourcPtr == other.m_resourcPtr;
};
size_t GetHash() const
{
return static_cast<size_t>(m_resourcPtr->GetHash());
@@ -58,12 +58,12 @@ namespace AZ
class BufferMemoryAllocator;
class ShaderResourceGroup;
struct ShaderResourceGroupCompiledData;
class ArgumentBuffer final
: public RHI::DeviceObject
{
using Base = RHI::DeviceObject;
public:
AZ_CLASS_ALLOCATOR(ArgumentBuffer, AZ::SystemAllocator, 0);
AZ_RTTI(ArgumentBuffer, "FEFE8823-7772-4EA0-9241-65C49ADFF6B3", Base);
@@ -78,21 +78,21 @@ namespace AZ
void UpdateImageViews(const RHI::ShaderInputImageDescriptor& shaderInputImage,
const RHI::ShaderInputImageIndex shaderInputIndex,
const AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>& imageViews);
const AZStd::span<const RHI::ConstPtr<RHI::ImageView>>& imageViews);
void UpdateSamplers(const RHI::ShaderInputSamplerDescriptor& shaderInputSampler,
const RHI::ShaderInputSamplerIndex shaderInputIndex,
const AZStd::array_view<RHI::SamplerState>& samplerStates);
const AZStd::span<const RHI::SamplerState>& samplerStates);
void UpdateBufferViews(const RHI::ShaderInputBufferDescriptor& shaderInputBuffer,
const RHI::ShaderInputBufferIndex shaderInputIndex,
const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufferViews);
void UpdateConstantBufferViews(AZStd::array_view<uint8_t> rawData);
const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufferViews);
void UpdateConstantBufferViews(AZStd::span<const uint8_t> rawData);
id<MTLBuffer> GetArgEncoderBuffer() const;
size_t GetOffset() const;
//Map to cache all the resources based on the usage as we can batch all the resources for a given usage.
using ComputeResourcesToMakeResidentMap = AZStd::unordered_map<MTLResourceUsage, AZStd::unordered_set<id <MTLResource>>>;
//Map to cache all the resources based on the usage and shader stage as we can batch all the resources for a given usage/shader usage.
@@ -102,31 +102,31 @@ namespace AZ
const ShaderResourceGroupVisibility& srgResourcesVisInfo,
ComputeResourcesToMakeResidentMap& resourcesToMakeResidentCompute,
GraphicsResourcesToMakeResidentMap& resourcesToMakeResidentGraphics) const;
void ClearResourceTracking();
bool IsNullHeapNeededForVertexStage(const ShaderResourceGroupVisibility& srgResourcesVisInfo) const;
bool IsNullDescHeapNeeded() const;
//////////////////////////////////////////////////////////////////////////
// RHI::DeviceObject
void Shutdown() override;
//////////////////////////////////////////////////////////////////////////
private:
bool CreateArgumentDescriptors(NSMutableArray * argBufferDecriptors);
void AttachStaticSamplers();
void AttachConstantBuffer();
// Use a cache to store and retrieve samplers
id<MTLSamplerState> GetMtlSampler(MTLSamplerDescriptor* samplerDesc);
using ResourceBindingsSet = AZStd::unordered_set<ResourceBindingData>;
using ResourceBindingsMap = AZStd::unordered_map<AZ::Name, ResourceBindingsSet>;
ResourceBindingsMap m_resourceBindings;
static const int MaxEntriesInArgTable = 31;
void CollectResourcesForCompute(id<MTLCommandEncoder> encoder,
const ResourceBindingsSet& resourceBindingData,
ComputeResourcesToMakeResidentMap& resourcesToMakeResidentMap) const;
@@ -139,13 +139,13 @@ namespace AZ
const ResourceBindingsMap& resourceMap,
const ShaderResourceGroupVisibility& srgResourcesVisInfo) const;
void BindNullSamplers(uint32_t registerId, uint32_t samplerCount);
Device* m_device = nullptr;
RHI::ConstPtr<RHI::ShaderResourceGroupLayout> m_srgLayout;
id <MTLArgumentEncoder> m_argumentEncoder;
uint32_t m_constantBufferSize = 0;
#if defined(ARGUMENTBUFFER_PAGEALLOCATOR)
BufferMemoryView m_argumentBuffer;
BufferMemoryView m_constantBuffer;
@@ -10,7 +10,7 @@
#include <Atom/RHI/AsyncWorkQueue.h>
#include <Atom/RHI/DeviceObject.h>
#include <Atom/RHI/StreamingImagePool.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <RHI/CommandQueue.h>
#include <RHI/Buffer.h>
#include <RHI/Image.h>
@@ -34,7 +34,7 @@ namespace AZ
: public RHI::DeviceObject
{
using Base = RHI::DeviceObject;
public:
AsyncUploadQueue() = default;
@@ -57,13 +57,13 @@ namespace AZ
uint64_t QueueUpload(const RHI::BufferStreamRequest& request);
//! Queue copy commands to upload image subresources.
//! @param residentMip is the resident mip level the expand request starts from.
//! @param residentMip is the resident mip level the expand request starts from.
//! @return queue id which can be use to check whether upload finished or wait for upload finish
RHI::AsyncWorkHandle QueueUpload(const RHI::StreamingImageExpandRequest& request, uint32_t residentMip);
bool IsUploadFinished(uint64_t fenceValue);
void WaitForUpload(const RHI::AsyncWorkHandle& workHandle);
private:
struct FramePacket;
RHI::AsyncWorkHandle CreateAsyncWork(Fence& fence, RHI::Fence::SignalCallback callback = nullptr);
@@ -84,26 +84,26 @@ namespace AZ
Fence m_fence;
// Using persistent mapping for the staging resource so the Map function only need to be called called once.
uint8_t* m_stagingResourceData = nullptr;
uint8_t* m_stagingResourceData = nullptr;
uint32_t m_dataOffset = 0;
};
RHI::Ptr<CommandQueue> m_copyQueue;
// Begin the frame packet which m_frameIndex point to and get ready to start recording copy command by using this frame packet
// Begin the frame packet which m_frameIndex point to and get ready to start recording copy command by using this frame packet
FramePacket* BeginFramePacket(CommandQueue* commandQueue);
void EndFramePacket(CommandQueue* commandQueue);
bool m_recordingFrame = false;
AZStd::vector<FramePacket> m_framePackets;
AZStd::vector<FramePacket> m_framePackets;
size_t m_frameIndex = 0;
Descriptor m_descriptor;
// Fence for external upload request
Fence m_uploadFence;
RHI::Ptr<Device> m_device;
//Command Buffer associated with the async copy queue
CommandQueueCommandBuffer m_commandBuffer;
@@ -28,7 +28,7 @@ namespace AZ
{
return aznew CommandList();
}
void CommandList::Init(RHI::HardwareQueueClass hardwareQueueClass, Device* device)
{
CommandListBase::Init(hardwareQueueClass, device);
@@ -39,13 +39,13 @@ namespace AZ
//Undefined symbols for architecture arm64:
// "_objc_memmove_collectable", referenced from:
//We can come back and revisit this after upgrading the build server machines to Mojave.
m_state.m_pipelineState = nullptr;
m_state.m_pipelineLayout = nullptr;
m_state.m_streamsHash = AZ::HashValue64{0};
m_state.m_indicesHash = AZ::HashValue64{0};
m_state.m_stencilRef = -1;
CommandListBase::Reset();
}
@@ -59,11 +59,11 @@ namespace AZ
Reset();
CommandListBase::FlushEncoder();
}
void CommandList::Submit(const RHI::CopyItem& copyItem)
{
CreateEncoder(CommandEncoderType::Blit);
id<MTLBlitCommandEncoder> blitEncoder = GetEncoder<id<MTLBlitCommandEncoder>>();
switch (copyItem.m_type)
{
@@ -78,7 +78,7 @@ namespace AZ
toBuffer:destinationBuffer->GetMemoryView().GetGpuAddress<id<MTLBuffer>>()
destinationOffset:descriptor.m_destinationOffset
size:descriptor.m_size];
Platform::SynchronizeBufferOnGPU(blitEncoder, destinationBuffer->GetMemoryView().GetGpuAddress<id<MTLBuffer>>());
break;
}
@@ -87,19 +87,19 @@ namespace AZ
const RHI::CopyImageDescriptor& descriptor = copyItem.m_image;
const Image* sourceImage = static_cast<const Image*>(descriptor.m_sourceImage);
const Image* destinationImage = static_cast<const Image*>(descriptor.m_destinationImage);
MTLOrigin sourceOrigin = MTLOriginMake(descriptor.m_sourceOrigin.m_left,
descriptor.m_sourceOrigin.m_top,
descriptor.m_sourceOrigin.m_front);
MTLSize sourceSize = MTLSizeMake(descriptor.m_sourceSize.m_width,
descriptor.m_sourceSize.m_height,
descriptor.m_sourceSize.m_depth);
MTLOrigin destinationOrigin = MTLOriginMake(descriptor.m_destinationOrigin.m_left,
descriptor.m_destinationOrigin.m_top,
descriptor.m_destinationOrigin.m_front);
[blitEncoder copyFromTexture: sourceImage->GetMemoryView().GetGpuAddress<id<MTLTexture>>()
sourceSlice: descriptor.m_sourceSubresource.m_arraySlice
sourceLevel: descriptor.m_sourceSubresource.m_mipSlice
@@ -109,7 +109,7 @@ namespace AZ
destinationSlice: descriptor.m_destinationSubresource.m_arraySlice
destinationLevel: descriptor.m_destinationSubresource.m_mipSlice
destinationOrigin: destinationOrigin];
Platform::SynchronizeTextureOnGPU(blitEncoder, destinationImage->GetMemoryView().GetGpuAddress<id<MTLTexture>>());
break;
}
@@ -122,11 +122,11 @@ namespace AZ
MTLOrigin destinationOrigin = MTLOriginMake(descriptor.m_destinationOrigin.m_left,
descriptor.m_destinationOrigin.m_top,
descriptor.m_destinationOrigin.m_front);
MTLSize sourceSize = MTLSizeMake(descriptor.m_sourceSize.m_width,
descriptor.m_sourceSize.m_height,
descriptor.m_sourceSize.m_depth);
[blitEncoder copyFromBuffer:sourceBuffer->GetMemoryView().GetGpuAddress<id<MTLBuffer>>()
sourceOffset:sourceBuffer->GetMemoryView().GetOffset() + descriptor.m_sourceOffset
sourceBytesPerRow:descriptor.m_sourceBytesPerRow
@@ -136,7 +136,7 @@ namespace AZ
destinationSlice:descriptor.m_destinationSubresource.m_arraySlice
destinationLevel:descriptor.m_destinationSubresource.m_mipSlice
destinationOrigin:destinationOrigin];
Platform::SynchronizeTextureOnGPU(blitEncoder, destinationImage->GetMemoryView().GetGpuAddress<id<MTLTexture>>());
break;
}
@@ -145,15 +145,15 @@ namespace AZ
const RHI::CopyImageToBufferDescriptor& descriptor = copyItem.m_imageToBuffer;
const auto* sourceImage = static_cast<const Image*>(descriptor.m_sourceImage);
const auto* destinationBuffer = static_cast<const Buffer*>(descriptor.m_destinationBuffer);
MTLOrigin sourceOrigin = MTLOriginMake(descriptor.m_sourceOrigin.m_left,
descriptor.m_sourceOrigin.m_top,
descriptor.m_sourceOrigin.m_front);
MTLSize sourceSize = MTLSizeMake(descriptor.m_sourceSize.m_width,
descriptor.m_sourceSize.m_height,
descriptor.m_sourceSize.m_depth);
[blitEncoder copyFromTexture:sourceImage->GetMemoryView().GetGpuAddress<id<MTLTexture>>()
sourceSlice:descriptor.m_sourceSubresource.m_arraySlice
sourceLevel:descriptor.m_sourceSubresource.m_mipSlice
@@ -163,7 +163,7 @@ namespace AZ
destinationOffset:destinationBuffer->GetMemoryView().GetOffset() + descriptor.m_destinationOffset
destinationBytesPerRow:descriptor.m_destinationBytesPerRow
destinationBytesPerImage:descriptor.m_destinationBytesPerImage];
Platform::SynchronizeBufferOnGPU(blitEncoder, destinationBuffer->GetMemoryView().GetGpuAddress<id<MTLBuffer>>());
break;
}
@@ -173,27 +173,27 @@ namespace AZ
}
}
}
void CommandList::Submit(const RHI::DispatchItem& dispatchItem)
{
AZ_PROFILE_FUNCTION(RHI);
CreateEncoder(CommandEncoderType::Compute);
bool bindResourceSuccessfull = CommitShaderResources<RHI::PipelineStateType::Dispatch>(dispatchItem);
if(!bindResourceSuccessfull)
{
AZ_Assert(false, "Resource binding was unsuccessfully.");
return;
}
const RHI::DispatchDirect& arguments = dispatchItem.m_arguments.m_direct;
MTLSize threadsPerGroup = {arguments.m_threadsPerGroupX, arguments.m_threadsPerGroupY, arguments.m_threadsPerGroupZ};
MTLSize threadsPerGroup = {arguments.m_threadsPerGroupX, arguments.m_threadsPerGroupY, arguments.m_threadsPerGroupZ};
MTLSize numThreadGroup = {arguments.GetNumberOfGroupsX(), arguments.GetNumberOfGroupsY(), arguments.GetNumberOfGroupsZ()};
id<MTLComputeCommandEncoder> computeEncoder = GetEncoder<id<MTLComputeCommandEncoder>>();
[computeEncoder dispatchThreadgroups: numThreadGroup
threadsPerThreadgroup: threadsPerGroup];
}
void CommandList::Submit(const RHI::DispatchRaysItem& dispatchRaysItem)
@@ -204,14 +204,14 @@ namespace AZ
void CommandList::SetViewports(const RHI::Viewport* rhiViewports, uint32_t count)
{
m_state.m_viewportState.Set(AZStd::array_view<RHI::Viewport>(rhiViewports, count));
m_state.m_viewportState.Set(AZStd::span<const RHI::Viewport>(rhiViewports, count));
}
void CommandList::SetScissors(const RHI::Scissor* rhiScissors, uint32_t count)
{
m_state.m_scissorState.Set(AZStd::array_view<RHI::Scissor>(rhiScissors, count));
m_state.m_scissorState.Set(AZStd::span<const RHI::Scissor>(rhiScissors, count));
}
template <typename Item>
void CommandList::SetRootConstants(const Item& item, const PipelineState* pipelineState)
{
@@ -221,15 +221,15 @@ namespace AZ
if(m_commandEncoderType == CommandEncoderType::Render)
{
id<MTLRenderCommandEncoder> renderEncoder = GetEncoder<id<MTLRenderCommandEncoder>>();
[renderEncoder setVertexBytes: item.m_rootConstants
length: pipelineLayout.GetRootConstantsSize()
atIndex: pipelineLayout.GetRootConstantsSlotIndex()];
[renderEncoder setFragmentBytes: item.m_rootConstants
length: pipelineLayout.GetRootConstantsSize()
atIndex: pipelineLayout.GetRootConstantsSlotIndex()];
}
else if(m_commandEncoderType == CommandEncoderType::Compute)
{
@@ -237,39 +237,39 @@ namespace AZ
[computeEncoder setBytes: item.m_rootConstants
length: pipelineLayout.GetRootConstantsSize()
atIndex: pipelineLayout.GetRootConstantsSlotIndex()];
}
}
}
bool CommandList::SetArgumentBuffers(const PipelineState* pipelineState, RHI::PipelineStateType stateType)
{
bool bindNullDescriptorHeap = false;
MTLRenderStages mtlRenderStagesForNullDescHeap = 0;
ShaderResourceBindings& bindings = GetShaderResourceBindingsByPipelineType(stateType);
const PipelineLayout& pipelineLayout = pipelineState->GetPipelineLayout();
uint32_t bufferVertexRegisterIdMin = RHI::Limits::Pipeline::ShaderResourceGroupCountMax;
uint32_t bufferFragmentOrComputeRegisterIdMin = RHI::Limits::Pipeline::ShaderResourceGroupCountMax;
uint32_t bufferVertexRegisterIdMax = 0;
uint32_t bufferFragmentOrComputeRegisterIdMax = 0;
//Arrays to cache all the buffers and offsets in order to make batch calls
MetalArgumentBufferArray mtlVertexArgBuffers;
MetalArgumentBufferArrayOffsets mtlVertexArgBufferOffsets;
MetalArgumentBufferArray mtlFragmentOrComputeArgBuffers;
MetalArgumentBufferArrayOffsets mtlFragmentOrComputeArgBufferOffsets;
mtlVertexArgBuffers.fill(nil);
mtlFragmentOrComputeArgBuffers.fill(nil);
mtlVertexArgBufferOffsets.fill(0);
mtlFragmentOrComputeArgBufferOffsets.fill(0);
//Map to cache all the resources based on the usage as we can batch all the resources for a given usage
ArgumentBuffer::ComputeResourcesToMakeResidentMap resourcesToMakeResidentCompute;
//Map to cache all the resources based on the usage and shader stage as we can batch all the resources for a given usage/shader usage
ArgumentBuffer::GraphicsResourcesToMakeResidentMap resourcesToMakeResidentGraphics;
for (uint32_t slot = 0; slot < RHI::Limits::Pipeline::ShaderResourceGroupCountMax; ++slot)
{
const ShaderResourceGroup* shaderResourceGroup = bindings.m_srgsBySlot[slot];
@@ -282,7 +282,7 @@ namespace AZ
uint32_t srgVisIndex = pipelineLayout.GetIndexBySlot(shaderResourceGroup->GetBindingSlot());
const RHI::ShaderStageMask& srgVisInfo = pipelineLayout.GetSrgVisibility(srgVisIndex);
const ShaderResourceGroupVisibility& srgResourcesVisInfo = pipelineLayout.GetSrgResourcesVisibility(srgVisIndex);
bool isSrgUpdatd = bindings.m_srgsByIndex[slot] != shaderResourceGroup;
if(isSrgUpdatd)
{
@@ -290,12 +290,12 @@ namespace AZ
auto& compiledArgBuffer = shaderResourceGroup->GetCompiledArgumentBuffer();
id<MTLBuffer> argBuffer = compiledArgBuffer.GetArgEncoderBuffer();
size_t argBufferOffset = compiledArgBuffer.GetOffset();
if(srgVisInfo != RHI::ShaderStageMask::None)
{
bool isNullDescHeapNeeded = compiledArgBuffer.IsNullDescHeapNeeded();
bindNullDescriptorHeap |= isNullDescHeapNeeded;
//For graphics and compute shader stages, cache all the argument buffers, offsets and track the min/max indices
if(m_commandEncoderType == CommandEncoderType::Render)
{
@@ -305,11 +305,11 @@ namespace AZ
mtlVertexArgBuffers[slotIndex] = argBuffer;
mtlVertexArgBufferOffsets[slotIndex] = argBufferOffset;
bufferVertexRegisterIdMin = AZStd::min(slotIndex, bufferVertexRegisterIdMin);
bufferVertexRegisterIdMax = AZStd::max(slotIndex, bufferVertexRegisterIdMax);
bufferVertexRegisterIdMax = AZStd::max(slotIndex, bufferVertexRegisterIdMax);
mtlRenderStagesForNullDescHeap = shaderResourceGroup->IsNullHeapNeededForVertexStage(srgResourcesVisInfo) ?
mtlRenderStagesForNullDescHeap | MTLRenderStageVertex : mtlRenderStagesForNullDescHeap;
}
if( numBitsSet > 1 || srgVisInfo == RHI::ShaderStageMask::Fragment)
{
mtlFragmentOrComputeArgBuffers[slotIndex] = argBuffer;
@@ -328,7 +328,7 @@ namespace AZ
}
}
}
//Check if the srg has been updated or if the srg resources visibility hash has been updated
//as it is possible for draw items to have different PSOs in the same pass.
const AZ::HashValue64 srgResourcesVisHash = pipelineLayout.GetSrgResourcesVisibilityHash(srgVisIndex);
@@ -337,8 +337,8 @@ namespace AZ
bindings.m_srgVisHashByIndex[slot] = srgResourcesVisHash;
if(srgVisInfo != RHI::ShaderStageMask::None)
{
//For graphics and compute encoder make the resource resident (call UseResource) for the duration
//of the work associated with the current scope and ensure that it's in a
//format compatible with the appropriate metal function.
@@ -353,7 +353,7 @@ namespace AZ
}
}
}
//For graphics and compute encoder bind all the argument buffers
if(m_commandEncoderType == CommandEncoderType::Render)
{
@@ -362,7 +362,7 @@ namespace AZ
bufferVertexRegisterIdMax,
mtlVertexArgBuffers,
mtlVertexArgBufferOffsets);
BindArgumentBuffers(RHI::ShaderStage::Fragment,
bufferFragmentOrComputeRegisterIdMin,
bufferFragmentOrComputeRegisterIdMax,
@@ -377,40 +377,40 @@ namespace AZ
mtlFragmentOrComputeArgBuffers,
mtlFragmentOrComputeArgBufferOffsets);
}
id<MTLRenderCommandEncoder> renderEncoder = GetEncoder<id<MTLRenderCommandEncoder>>();
id<MTLComputeCommandEncoder> computeEncoder = GetEncoder<id<MTLComputeCommandEncoder>>();
//Call UseResource on all resources for Compute stage
for (const auto& key : resourcesToMakeResidentCompute)
{
AZStd::vector<id <MTLResource>> resourcesToProcessVec(key.second.begin(), key.second.end());
[computeEncoder useResources: &resourcesToProcessVec[0]
count: resourcesToProcessVec.size()
usage: key.first];
}
//Call UseResource on all resources for Vertex and Fragment stages
for (const auto& key : resourcesToMakeResidentGraphics)
{
AZStd::vector<id <MTLResource>> resourcesToProcessVec(key.second.begin(), key.second.end());
[renderEncoder useResources: &resourcesToProcessVec[0]
count: resourcesToProcessVec.size()
usage: key.first.first
stages: key.first.second];
}
if(bindNullDescriptorHeap)
{
MakeHeapsResident(mtlRenderStagesForNullDescHeap);
}
return true;
}
void CommandList::BindArgumentBuffers(RHI::ShaderStage shaderStage,
uint16_t registerIdMin,
uint16_t registerIdMax,
@@ -428,7 +428,7 @@ namespace AZ
if(mtlArgBuffers[i] == nil)
{
NSRange range = { startingIndex, i-startingIndex };
switch(shaderStage)
{
case RHI::ShaderStage::Vertex:
@@ -462,7 +462,7 @@ namespace AZ
}
trackingRange = false;
}
}
else
@@ -475,13 +475,13 @@ namespace AZ
}
}
}
void CommandList::Submit(const RHI::DrawItem& drawItem)
{
AZ_PROFILE_FUNCTION(RHI);
CreateEncoder(CommandEncoderType::Render);
RHI::CommandListScissorState scissorState;
if (drawItem.m_scissorsCount)
{
@@ -496,15 +496,15 @@ namespace AZ
}
CommitViewportState();
CommitScissorState();
const PipelineState* pipelineState = static_cast<const PipelineState*>(drawItem.m_pipelineState);
AZ_Assert(pipelineState, "PipelineState can not be null");
if(m_renderPassMultiSampleState != pipelineState->m_pipelineStateMultiSampleState)
{
AZ_Assert(false,"MultisampleState in the image descriptor needs to match the one provided in the pipeline state");
}
id<MTLRenderCommandEncoder> renderEncoder = GetEncoder<id<MTLRenderCommandEncoder>>();
bool bindResourceSuccessfull = CommitShaderResources<RHI::PipelineStateType::Draw>(drawItem);
if(!bindResourceSuccessfull)
@@ -512,21 +512,21 @@ namespace AZ
AZ_Assert(false, "Resource binding was unsuccessfully.");
return;
}
SetStreamBuffers(drawItem.m_streamBufferViews, drawItem.m_streamBufferViewCount);
SetStencilRef(drawItem.m_stencilRef);
MTLPrimitiveType mtlPrimType = pipelineState->GetPipelineTopology();
switch (drawItem.m_arguments.m_type)
{
case RHI::DrawType::Indexed:
{
const RHI::DrawIndexed& indexed = drawItem.m_arguments.m_indexed;
const RHI::IndexBufferView& indexBuffDescriptor = *drawItem.m_indexBufferView;
AZ::HashValue64 indicesHash = indexBuffDescriptor.GetHash();
m_state.m_indicesHash = indicesHash;
const Buffer * buff = static_cast<const Buffer*>(indexBuffDescriptor.GetBuffer());
id<MTLBuffer> mtlBuff = buff->GetMemoryView().GetGpuAddress<id<MTLBuffer>>();
@@ -534,7 +534,7 @@ namespace AZ
MTLIndexTypeUInt16 : MTLIndexTypeUInt32;
uint32_t indexTypeSize = 0;
GetIndexTypeSizeInBytes(mtlIndexType, indexTypeSize);
uint32_t indexOffset = indexBuffDescriptor.GetByteOffset() + (indexed.m_indexOffset * indexTypeSize) + buff->GetMemoryView().GetOffset();
[renderEncoder drawIndexedPrimitives: mtlPrimType
indexCount: indexed.m_indexCount
@@ -546,15 +546,15 @@ namespace AZ
baseInstance: indexed.m_instanceOffset];
break;
}
case RHI::DrawType::Linear:
{
{
const RHI::DrawLinear& linear = drawItem.m_arguments.m_linear;
[renderEncoder drawPrimitives: mtlPrimType
vertexStart: linear.m_vertexOffset
vertexCount: linear.m_vertexCount
instanceCount: linear.m_instanceCount
baseInstance: linear.m_instanceOffset];
baseInstance: linear.m_instanceOffset];
break;
}
}
@@ -576,7 +576,7 @@ namespace AZ
{
CommandListBase::Shutdown();
}
void CommandList::SetPipelineState(const PipelineState* pipelineState)
{
if (m_state.m_pipelineState != pipelineState)
@@ -608,7 +608,7 @@ namespace AZ
AZ_Assert(false, "Type not supported.");
}
}
ShaderResourceBindings& bindings = GetShaderResourceBindingsByPipelineType(pipelineState->GetType());
for (size_t i = 0; i < bindings.m_srgsByIndex.size(); ++i)
{
@@ -623,7 +623,7 @@ namespace AZ
}
}
}
void CommandList::SetStencilRef(uint8_t stencilRef)
{
if (m_state.m_stencilRef != stencilRef)
@@ -633,24 +633,24 @@ namespace AZ
m_state.m_stencilRef = stencilRef;
}
}
void CommandList::SetStreamBuffers(const RHI::StreamBufferView* streams, uint32_t count)
{
uint16_t bufferArrayLen = 0;
AZStd::array<id<MTLBuffer>, METAL_MAX_ENTRIES_BUFFER_ARG_TABLE> mtlStreamBuffers;
AZStd::array<NSUInteger, METAL_MAX_ENTRIES_BUFFER_ARG_TABLE> mtlStreamBufferOffsets;
AZ::HashValue64 streamsHash = AZ::HashValue64{0};
for (uint32_t i = 0; i < count; ++i)
{
streamsHash = AZ::TypeHash64(streamsHash, streams[i].GetHash());
}
if (streamsHash != m_state.m_streamsHash)
{
m_state.m_streamsHash = streamsHash;
AZ_Assert(count <= METAL_MAX_ENTRIES_BUFFER_ARG_TABLE , "Slots needed cannot exceed METAL_MAX_ENTRIES_BUFFER_ARG_TABLE");
NSRange range = {METAL_MAX_ENTRIES_BUFFER_ARG_TABLE - count, count};
//The stream buffers are populated from bottom to top as the top slots are taken by argument buffers
for (int i = count-1; i >= 0; --i)
@@ -671,7 +671,7 @@ namespace AZ
withRange: range];
}
}
void CommandList::SetRasterizerState(const RasterizerState& rastState)
{
id<MTLRenderCommandEncoder> renderEncoder = GetEncoder<id<MTLRenderCommandEncoder>>();
@@ -681,17 +681,17 @@ namespace AZ
[renderEncoder setTriangleFillMode: rastState.m_triangleFillMode];
[renderEncoder setDepthClipMode: rastState.m_depthClipMode];
}
void CommandList::SetShaderResourceGroupForDraw(const RHI::ShaderResourceGroup& shaderResourceGroup)
{
SetShaderResourceGroup<RHI::PipelineStateType::Draw>(static_cast<const ShaderResourceGroup*>(&shaderResourceGroup));
}
void CommandList::SetShaderResourceGroupForDispatch(const RHI::ShaderResourceGroup& shaderResourceGroup)
{
SetShaderResourceGroup<RHI::PipelineStateType::Dispatch>(static_cast<const ShaderResourceGroup*>(&shaderResourceGroup));
}
CommandList::ShaderResourceBindings& CommandList::GetShaderResourceBindingsByPipelineType(RHI::PipelineStateType pipelineType)
{
return m_state.m_bindingsByPipe[static_cast<size_t>(pipelineType)];
@@ -706,15 +706,15 @@ namespace AZ
AZ_Assert(false, "Pipeline state not provided");
return false;
}
SetPipelineState(pipelineState);
// Assign shader resource groups from the item to slot bindings.
for (uint32_t srgIndex = 0; srgIndex < item.m_shaderResourceGroupCount; ++srgIndex)
{
SetShaderResourceGroup<pipelineType>(static_cast<const ShaderResourceGroup*>(item.m_shaderResourceGroups[srgIndex]));
}
if (item.m_uniqueShaderResourceGroup)
{
SetShaderResourceGroup<pipelineType>(static_cast<const ShaderResourceGroup*>(item.m_uniqueShaderResourceGroup));
@@ -730,7 +730,7 @@ namespace AZ
{
return;
}
AZ_PROFILE_FUNCTION(RHI);
const auto& viewports = m_state.m_viewportState.m_states;
MTLViewport metalViewports[viewports.size()];
@@ -744,7 +744,7 @@ namespace AZ
metalViewports[i].znear = viewports[i].m_minZ;
metalViewports[i].zfar = viewports[i].m_maxZ;
}
id<MTLRenderCommandEncoder> renderEncoder = GetEncoder<id<MTLRenderCommandEncoder>>();
[renderEncoder setViewports: metalViewports
count: viewports.size()];
@@ -760,7 +760,7 @@ namespace AZ
AZStd::array<MTLScissorRect, MaxScissorsAllowed> metalScissorRects;
const auto& scissors = m_state.m_scissorState.m_states;
AZ_Assert(scissors.size() <= MaxScissorsAllowed , "Number of scissors violate the maximum number of scissors allowed");
for (uint32_t i = 0; i < scissors.size(); ++i)
{
@@ -27,7 +27,7 @@ namespace AZ
{
}
RHI::ResultCode PipelineLibrary::MergeIntoInternal(AZStd::array_view<const RHI::PipelineLibrary*> pipelineLibraries)
RHI::ResultCode PipelineLibrary::MergeIntoInternal(AZStd::span<const RHI::PipelineLibrary* const> pipelineLibraries)
{
return RHI::ResultCode::Success;
}
@@ -30,7 +30,7 @@ namespace AZ
// RHI::PipelineLibrary
RHI::ResultCode InitInternal(RHI::Device& device, const RHI::PipelineLibraryData* serializedData) override;
void ShutdownInternal() override;
RHI::ResultCode MergeIntoInternal(AZStd::array_view<const RHI::PipelineLibrary*> libraries) override;
RHI::ResultCode MergeIntoInternal(AZStd::span<const RHI::PipelineLibrary* const> libraries) override;
RHI::ConstPtr<RHI::PipelineLibraryData> GetSerializedDataInternal() const override;
//////////////////////////////////////////////////////////////////////////
@@ -37,7 +37,7 @@ namespace AZ
RHI::ResultCode ShaderResourceGroupPool::InitGroupInternal(RHI::ShaderResourceGroup& groupBase)
{
ShaderResourceGroup& group = static_cast<ShaderResourceGroup&>(groupBase);
for (size_t i = 0; i < RHI::Limits::Device::FrameCountMax; ++i)
{
auto argBuffer = ArgumentBuffer::Create();
@@ -82,7 +82,7 @@ namespace AZ
for (const RHI::ShaderInputImageDescriptor& shaderInputImage : layout->GetShaderInputListForImages())
{
const RHI::ShaderInputImageIndex imageInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
argBuffer.UpdateImageViews(shaderInputImage, imageInputIndex, imageViews);
++shaderInputIndex;
}
@@ -91,7 +91,7 @@ namespace AZ
for (const RHI::ShaderInputSamplerDescriptor& shaderInputSampler : layout->GetShaderInputListForSamplers())
{
const RHI::ShaderInputSamplerIndex samplerInputIndex(shaderInputIndex);
AZStd::array_view<RHI::SamplerState> samplerStates = groupData.GetSamplerArray(samplerInputIndex);
AZStd::span<const RHI::SamplerState> samplerStates = groupData.GetSamplerArray(samplerInputIndex);
argBuffer.UpdateSamplers(shaderInputSampler, samplerInputIndex, samplerStates);
++shaderInputIndex;
}
@@ -100,7 +100,7 @@ namespace AZ
for (const RHI::ShaderInputBufferDescriptor& shaderInputBuffer : layout->GetShaderInputListForBuffers())
{
const RHI::ShaderInputBufferIndex bufferInputIndex(shaderInputIndex);
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
AZStd::span<const RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
argBuffer.UpdateBufferViews(shaderInputBuffer, bufferInputIndex, bufferViews);
++shaderInputIndex;
}
@@ -30,7 +30,7 @@ namespace AZ
// RHI::PipelineLibrary
RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::PipelineLibraryData* serializedData) override { return RHI::ResultCode::Success;}
void ShutdownInternal() override {}
RHI::ResultCode MergeIntoInternal([[maybe_unused]] AZStd::array_view<const RHI::PipelineLibrary*> libraries) override { return RHI::ResultCode::Success;}
RHI::ResultCode MergeIntoInternal([[maybe_unused]] AZStd::span<const RHI::PipelineLibrary* const> libraries) override { return RHI::ResultCode::Success;}
RHI::ConstPtr<RHI::PipelineLibraryData> GetSerializedDataInternal() const override { return nullptr;}
//////////////////////////////////////////////////////////////////////////
};
@@ -9,7 +9,7 @@
#include <Atom/RHI.Reflect/Vulkan/Base.h>
#include <Atom/RHI.Reflect/ShaderStageFunction.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/std/string/string_view.h>
@@ -21,7 +21,7 @@ namespace AZ
namespace Vulkan
{
using ShaderByteCode = AZStd::vector<uint8_t>;
using ShaderByteCodeView = AZStd::array_view<uint8_t>;
using ShaderByteCodeView = AZStd::span<const uint8_t>;
/**
* A set of indices used to access physical sub-stages within a virtual stage.
@@ -76,12 +76,12 @@ namespace AZ
void CommandList::SetViewports(const RHI::Viewport* rhiViewports, uint32_t count)
{
m_state.m_viewportState.Set(AZStd::array_view<RHI::Viewport>(rhiViewports, count));
m_state.m_viewportState.Set(AZStd::span<const RHI::Viewport>(rhiViewports, count));
}
void CommandList::SetScissors(const RHI::Scissor* rhiScissors, uint32_t count)
{
m_state.m_scissorState.Set(AZStd::array_view<RHI::Scissor>(rhiScissors, count));
m_state.m_scissorState.Set(AZStd::span<const RHI::Scissor>(rhiScissors, count));
}
void CommandList::SetShaderResourceGroupForDraw(const RHI::ShaderResourceGroup& shaderResourceGroup)
@@ -625,7 +625,7 @@ namespace AZ
return ConvertResult(vkResult);
}
void CommandList::ExecuteSecondaryCommandLists(const AZStd::array_view<RHI::Ptr<CommandList>>& commands)
void CommandList::ExecuteSecondaryCommandLists(const AZStd::span<const RHI::Ptr<CommandList>>& commands)
{
AZ_Assert(m_isUpdating, "Secondary command buffers must be executed between BeginCommandBuffer() and EndCommandBuffer().");
AZ_Assert(m_descriptor.m_level == VK_COMMAND_BUFFER_LEVEL_PRIMARY, "Trying to execute commands from a secondary command list");
@@ -17,7 +17,7 @@
#include <Atom/RHI.Reflect/Limits.h>
#include <Atom/RHI.Reflect/ScopeId.h>
#include <Atom/RHI.Reflect/Interval.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/std/containers/list.h>
#include <AzCore/std/containers/unordered_set.h>
#include <AzCore/std/containers/vector.h>
@@ -103,7 +103,7 @@ namespace AZ
bool IsInsideRenderPass() const;
const Framebuffer* GetActiveFramebuffer() const;
const RenderPass* GetActiveRenderpass() const;
void ExecuteSecondaryCommandLists(const AZStd::array_view<RHI::Ptr<CommandList>>& commands);
void ExecuteSecondaryCommandLists(const AZStd::span<const RHI::Ptr<CommandList>>& commands);
uint32_t GetQueueFamilyIndex() const;
@@ -39,7 +39,7 @@ namespace AZ
}
}
void DescriptorSet::UpdateBufferViews(uint32_t layoutIndex, const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufViews)
void DescriptorSet::UpdateBufferViews(uint32_t layoutIndex, const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufViews)
{
const DescriptorSetLayout& layout = *m_descriptor.m_descriptorSetLayout;
VkDescriptorType type = layout.GetDescriptorType(layoutIndex);
@@ -119,7 +119,7 @@ namespace AZ
m_updateData.push_back(AZStd::move(data));
}
void DescriptorSet::UpdateImageViews(uint32_t layoutIndex, const AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>& imageViews, RHI::ShaderInputImageType imageType)
void DescriptorSet::UpdateImageViews(uint32_t layoutIndex, const AZStd::span<const RHI::ConstPtr<RHI::ImageView>>& imageViews, RHI::ShaderInputImageType imageType)
{
const DescriptorSetLayout& layout = *m_descriptor.m_descriptorSetLayout;
@@ -169,7 +169,7 @@ namespace AZ
m_updateData.push_back(AZStd::move(data));
}
void DescriptorSet::UpdateSamplers(uint32_t layoutIndex, const AZStd::array_view<RHI::SamplerState>& samplers)
void DescriptorSet::UpdateSamplers(uint32_t layoutIndex, const AZStd::span<const RHI::SamplerState>& samplers)
{
auto& device = static_cast<Device&>(GetDevice());
@@ -189,7 +189,7 @@ namespace AZ
m_updateData.push_back(AZStd::move(data));
}
void DescriptorSet::UpdateConstantData(AZStd::array_view<uint8_t> rawData)
void DescriptorSet::UpdateConstantData(AZStd::span<const uint8_t> rawData)
{
AZ_Assert(m_constantDataBuffer, "Null constant buffer");
const DescriptorSetLayout& layout = *m_descriptor.m_descriptorSetLayout;
@@ -13,7 +13,7 @@
#include <Atom/RHI/Image.h>
#include <Atom/RHI/ImageView.h>
#include <Atom/RHI.Reflect/SamplerState.h>
#include <AtomCore/std/containers/array_view.h>
#include <AzCore/std/containers/span.h>
#include <AzCore/Memory/PoolAllocator.h>
#include <RHI/Buffer.h>
@@ -57,10 +57,10 @@ namespace AZ
void CommitUpdates();
void UpdateBufferViews(uint32_t index, const AZStd::array_view<RHI::ConstPtr<RHI::BufferView>>& bufViews);
void UpdateImageViews(uint32_t index, const AZStd::array_view<RHI::ConstPtr<RHI::ImageView>>& imageViews, RHI::ShaderInputImageType imageType);
void UpdateSamplers(uint32_t index, const AZStd::array_view<RHI::SamplerState>& samplers);
void UpdateConstantData(AZStd::array_view<uint8_t> data);
void UpdateBufferViews(uint32_t index, const AZStd::span<const RHI::ConstPtr<RHI::BufferView>>& bufViews);
void UpdateImageViews(uint32_t index, const AZStd::span<const RHI::ConstPtr<RHI::ImageView>>& imageViews, RHI::ShaderInputImageType imageType);
void UpdateSamplers(uint32_t index, const AZStd::span<const RHI::SamplerState>& samplers);
void UpdateConstantData(AZStd::span<const uint8_t> data);
RHI::Ptr<BufferView> GetConstantDataBufferView() const;
@@ -152,12 +152,12 @@ namespace AZ
RHI::ResultCode DescriptorSetLayout::BuildDescriptorSetLayoutBindings()
{
const AZStd::array_view<RHI::ShaderInputBufferDescriptor> bufferDescs = m_shaderResourceGroupLayout->GetShaderInputListForBuffers();
const AZStd::array_view<RHI::ShaderInputImageDescriptor> imageDescs = m_shaderResourceGroupLayout->GetShaderInputListForImages();
const AZStd::array_view<RHI::ShaderInputBufferUnboundedArrayDescriptor> bufferUnboundedArrayDescs = m_shaderResourceGroupLayout->GetShaderInputListForBufferUnboundedArrays();
const AZStd::array_view<RHI::ShaderInputImageUnboundedArrayDescriptor> imageUnboundedArrayDescs = m_shaderResourceGroupLayout->GetShaderInputListForImageUnboundedArrays();
const AZStd::array_view<RHI::ShaderInputSamplerDescriptor> samplerDescs = m_shaderResourceGroupLayout->GetShaderInputListForSamplers();
const AZStd::array_view<RHI::ShaderInputStaticSamplerDescriptor>& staticSamplerDescs = m_shaderResourceGroupLayout->GetStaticSamplers();
const AZStd::span<const RHI::ShaderInputBufferDescriptor> bufferDescs = m_shaderResourceGroupLayout->GetShaderInputListForBuffers();
const AZStd::span<const RHI::ShaderInputImageDescriptor> imageDescs = m_shaderResourceGroupLayout->GetShaderInputListForImages();
const AZStd::span<const RHI::ShaderInputBufferUnboundedArrayDescriptor> bufferUnboundedArrayDescs = m_shaderResourceGroupLayout->GetShaderInputListForBufferUnboundedArrays();
const AZStd::span<const RHI::ShaderInputImageUnboundedArrayDescriptor> imageUnboundedArrayDescs = m_shaderResourceGroupLayout->GetShaderInputListForImageUnboundedArrays();
const AZStd::span<const RHI::ShaderInputSamplerDescriptor> samplerDescs = m_shaderResourceGroupLayout->GetShaderInputListForSamplers();
const AZStd::span<const RHI::ShaderInputStaticSamplerDescriptor>& staticSamplerDescs = m_shaderResourceGroupLayout->GetStaticSamplers();
// The + 1 is for Constant Data.
m_descriptorSetLayoutBindings.reserve(
@@ -173,7 +173,7 @@ namespace AZ
m_constantDataSize = m_shaderResourceGroupLayout->GetConstantDataSize();
if (m_constantDataSize)
{
AZStd::array_view<RHI::ShaderInputConstantDescriptor> inputListForConstants = m_shaderResourceGroupLayout->GetShaderInputListForConstants();
AZStd::span<const RHI::ShaderInputConstantDescriptor> inputListForConstants = m_shaderResourceGroupLayout->GetShaderInputListForConstants();
AZ_Assert(!inputListForConstants.empty(), "Empty constant input list");
m_descriptorSetLayoutBindings.emplace_back(VkDescriptorSetLayoutBinding{});
VkDescriptorSetLayoutBinding& vbinding = m_descriptorSetLayoutBindings.back();
@@ -81,12 +81,12 @@ namespace AZ
{
}
AZStd::array_view<const Scope*> FrameGraphExecuteGroup::GetScopes() const
AZStd::span<const Scope* const> FrameGraphExecuteGroup::GetScopes() const
{
return AZStd::array_view<const Scope*>(&m_scope, 1);
return AZStd::span<const Scope* const>(&m_scope, 1);
}
AZStd::array_view<RHI::Ptr<CommandList>> FrameGraphExecuteGroup::GetCommandLists() const
AZStd::span<const RHI::Ptr<CommandList>> FrameGraphExecuteGroup::GetCommandLists() const
{
return m_secondaryCommands;
}
@@ -44,8 +44,8 @@ namespace AZ
//////////////////////////////////////////////////////////////////////////
// FrameGraphExecuteGroupBase
AZStd::array_view<const Scope*> GetScopes() const override;
AZStd::array_view<RHI::Ptr<CommandList>> GetCommandLists() const override;
AZStd::span<const Scope* const> GetScopes() const override;
AZStd::span<const RHI::Ptr<CommandList>> GetCommandLists() const override;
//////////////////////////////////////////////////////////////////////////
//! Set the render context and subpass that will be used by this execute group.
@@ -37,9 +37,9 @@ namespace AZ
const RHI::GraphGroupId& GetGroupId() const;
virtual AZStd::array_view<const Scope*> GetScopes() const = 0;
virtual AZStd::span<const Scope* const> GetScopes() const = 0;
virtual AZStd::array_view<RHI::Ptr<CommandList>> GetCommandLists() const = 0;
virtual AZStd::span<const RHI::Ptr<CommandList>> GetCommandLists() const = 0;
protected:
RHI::Ptr<CommandList> AcquireCommandList(VkCommandBufferLevel level) const;
@@ -113,14 +113,14 @@ namespace AZ
scope->EmitScopeBarriers(*m_commandList, Scope::BarrierSlot::Epilogue);
}
AZStd::array_view<const Scope*> FrameGraphExecuteGroupMerged::GetScopes() const
AZStd::span<const Scope* const> FrameGraphExecuteGroupMerged::GetScopes() const
{
return m_scopes;
}
AZStd::array_view<RHI::Ptr<CommandList>> FrameGraphExecuteGroupMerged::GetCommandLists() const
AZStd::span<const RHI::Ptr<CommandList>> FrameGraphExecuteGroupMerged::GetCommandLists() const
{
return AZStd::array_view<RHI::Ptr<CommandList>>(&m_commandList, 1);
return AZStd::span<const RHI::Ptr<CommandList>>(&m_commandList, 1);
}
void FrameGraphExecuteGroupMerged::SetPrimaryCommandList(CommandList& commandList)
@@ -128,7 +128,7 @@ namespace AZ
m_commandList = &commandList;
}
void FrameGraphExecuteGroupMerged::SetRenderPasscontexts(AZStd::array_view<RenderPassContext> renderPassContexts)
void FrameGraphExecuteGroupMerged::SetRenderPasscontexts(AZStd::span<const RenderPassContext> renderPassContexts)
{
m_renderPassContexts = renderPassContexts;
}

Some files were not shown because too many files have changed in this diff Show More