Merge branch 'development' of https://github.com/o3de/o3de into cgalvan/DraftStreamingImageAssetPixelAPI
This commit is contained in:
@@ -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
|
||||
@@ -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);
|
||||
|
||||
+4
-4
@@ -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();
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user