From c613731e3d28aa8dc7ba99b00b248ecf618ba20c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 21:19:04 +0100 Subject: [PATCH 1/3] Update dependency gradle to v8.11 (#2814) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- benchmark/android/gradle/wrapper/gradle-wrapper.properties | 2 +- platform/android/gradle/wrapper/gradle-wrapper.properties | 2 +- render-test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- test/android/gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmark/android/gradle/wrapper/gradle-wrapper.properties b/benchmark/android/gradle/wrapper/gradle-wrapper.properties index 66cd5a0e49b..7cf748e7430 100644 --- a/benchmark/android/gradle/wrapper/gradle-wrapper.properties +++ b/benchmark/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/platform/android/gradle/wrapper/gradle-wrapper.properties b/platform/android/gradle/wrapper/gradle-wrapper.properties index 9355b415575..94113f200e6 100644 --- a/platform/android/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/render-test/android/gradle/wrapper/gradle-wrapper.properties b/render-test/android/gradle/wrapper/gradle-wrapper.properties index 66cd5a0e49b..7cf748e7430 100644 --- a/render-test/android/gradle/wrapper/gradle-wrapper.properties +++ b/render-test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/test/android/gradle/wrapper/gradle-wrapper.properties b/test/android/gradle/wrapper/gradle-wrapper.properties index 66cd5a0e49b..7cf748e7430 100644 --- a/test/android/gradle/wrapper/gradle-wrapper.properties +++ b/test/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b30397005c5bc20f676c124d40a1eb113f5ac5cd Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 12 Nov 2024 22:19:20 +0200 Subject: [PATCH 2/3] Reuse allocated descriptor sets (#3002) --- include/mbgl/util/instrumentation.hpp | 16 +++- include/mbgl/vulkan/descriptor_set.hpp | 2 + include/mbgl/vulkan/texture2d.hpp | 2 + .../textFit-grid-long/expected.png | Bin 16304 -> 12646 bytes metrics/ignores/linux-vulkan.json | 3 +- src/mbgl/vulkan/buffer_resource.cpp | 5 ++ src/mbgl/vulkan/context.cpp | 9 ++ src/mbgl/vulkan/descriptor_set.cpp | 78 ++++++++++++++---- src/mbgl/vulkan/drawable.cpp | 21 +++++ src/mbgl/vulkan/texture2d.cpp | 5 ++ src/mbgl/vulkan/uniform_buffer.cpp | 11 ++- 11 files changed, 129 insertions(+), 23 deletions(-) diff --git a/include/mbgl/util/instrumentation.hpp b/include/mbgl/util/instrumentation.hpp index 852871442e8..e3882a31fa5 100644 --- a/include/mbgl/util/instrumentation.hpp +++ b/include/mbgl/util/instrumentation.hpp @@ -20,9 +20,10 @@ const void* castGpuIdToTracyPtr(GpuId id) { return reinterpret_cast(static_cast(id)); } -#ifndef MLN_RENDER_BACKEND_OPENGL +#if !defined(MLN_RENDER_BACKEND_OPENGL) && !defined(MLN_RENDER_BACKEND_VULKAN) #error \ - "MLN_RENDER_BACKEND_OPENGL is not defined. MLN_RENDER_BACKEND_OPENGL is expected to be defined in CMake and Bazel" + "MLN_RENDER_BACKEND_OPENGL/MLN_RENDER_BACKEND_VULKAN is not defined. \ + MLN_RENDER_BACKEND_OPENGL/MLN_RENDER_BACKEND_VULKAN is expected to be defined in CMake and Bazel" #endif #define MLN_TRACE_FUNC() ZoneScoped @@ -88,14 +89,21 @@ constexpr const char* tracyConstMemoryLabel = "Constant Buffer Memory"; #undef glGetQueryObjectui64v #undef GLint -#else // MLN_RENDER_BACKEND_OPENGL +#elif MLN_RENDER_BACKEND_VULKAN + +#define MLN_END_FRAME() \ + do { \ + FrameMark; \ + } while (0); + +#else #define MLN_TRACE_GL_CONTEXT() ((void)0) #define MLN_TRACE_GL_ZONE(label) ((void)0) #define MLN_TRACE_FUNC_GL() ((void)0) #define MLN_END_FRAME() FrameMark -#endif // MLN_RENDER_BACKEND_OPENGL +#endif #else // MLN_TRACY_ENABLE diff --git a/include/mbgl/vulkan/descriptor_set.hpp b/include/mbgl/vulkan/descriptor_set.hpp index a4f3fb3c1bb..fff737a7d91 100644 --- a/include/mbgl/vulkan/descriptor_set.hpp +++ b/include/mbgl/vulkan/descriptor_set.hpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace mbgl { namespace vulkan { @@ -21,6 +22,7 @@ struct DescriptorPoolGrowable { struct PoolInfo { vk::UniqueDescriptorPool pool; uint32_t remainingSets{0}; + std::queue> unusedSets; PoolInfo(vk::UniqueDescriptorPool&& pool_, uint32_t remainingSets_) : pool(std::move(pool_)), diff --git a/include/mbgl/vulkan/texture2d.hpp b/include/mbgl/vulkan/texture2d.hpp index 7d88e3e87c0..b0aaef237f9 100644 --- a/include/mbgl/vulkan/texture2d.hpp +++ b/include/mbgl/vulkan/texture2d.hpp @@ -59,6 +59,8 @@ class Texture2D : public gfx::Texture2D { size_t getPixelStride() const noexcept override; size_t numChannels() const noexcept override; + bool isDirty() const { return samplerStateDirty || textureDirty; } + void create() noexcept override; void upload() noexcept override; diff --git a/metrics/expectations/platform-android-vulkan/render-tests/icon-text-fit/textFit-grid-long/expected.png b/metrics/expectations/platform-android-vulkan/render-tests/icon-text-fit/textFit-grid-long/expected.png index 060dce66232589f53ffc6d73cf47b98162f87d12..5b2fabc6c8c33fbd4bcbb0263d69d1cf6351668d 100644 GIT binary patch literal 12646 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 F{tri;$R+>) literal 16304 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 diff --git a/metrics/ignores/linux-vulkan.json b/metrics/ignores/linux-vulkan.json index e49d79329c9..a0d601b4203 100644 --- a/metrics/ignores/linux-vulkan.json +++ b/metrics/ignores/linux-vulkan.json @@ -1,4 +1,5 @@ { "render-tests/fill-extrusion-color/function": "Layer Z Fighting: https://github.com/maplibre/maplibre-native/issues/1847", - "render-tests/tilejson-bounds/default": "flaky on CI" + "render-tests/tilejson-bounds/default": "flaky on CI", + "render-tests/icon-text-fit/textFit-grid-long": "Needs to be investigated" } \ No newline at end of file diff --git a/src/mbgl/vulkan/buffer_resource.cpp b/src/mbgl/vulkan/buffer_resource.cpp index 0289149dad4..ddcc505900e 100644 --- a/src/mbgl/vulkan/buffer_resource.cpp +++ b/src/mbgl/vulkan/buffer_resource.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -48,6 +49,8 @@ BufferResource::BufferResource( size(size_), usage(usage_), persistent(persistent_) { + MLN_TRACE_FUNC(); + const auto& allocator = context.getBackend().getAllocator(); std::size_t totalSize = size; @@ -141,6 +144,8 @@ BufferResource& BufferResource::operator=(BufferResource&& other) noexcept { } void BufferResource::update(const void* newData, std::size_t updateSize, std::size_t offset) noexcept { + MLN_TRACE_FUNC(); + assert(updateSize + offset <= size); updateSize = std::min(updateSize, size - offset); if (updateSize <= 0) { diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index 1d812d82683..5a6e9863438 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -144,6 +144,8 @@ void Context::enqueueDeletion(std::function&& function) { } void Context::submitOneTimeCommand(const std::function& function) const { + MLN_TRACE_FUNC(); + const vk::CommandBufferAllocateInfo allocateInfo( backend.getCommandPool().get(), vk::CommandBufferLevel::ePrimary, 1); @@ -170,6 +172,7 @@ void Context::submitOneTimeCommand(const std::function::max(); @@ -180,6 +183,8 @@ void Context::waitFrame() const { } } void Context::beginFrame() { + MLN_TRACE_FUNC(); + const auto& device = backend.getDevice(); auto& renderableResource = backend.getDefaultRenderable().getResource(); const auto& platformSurface = renderableResource.getPlatformSurface(); @@ -208,6 +213,7 @@ void Context::beginFrame() { frame.runDeletionQueue(*this); if (platformSurface) { + MLN_TRACE_ZONE(acquireNextImageKHR); try { const vk::ResultValue acquireImageResult = device->acquireNextImageKHR( renderableResource.getSwapchain().get(), timeout, frame.surfaceSemaphore.get(), nullptr); @@ -245,6 +251,7 @@ void Context::endFrame() { } void Context::submitFrame() { + MLN_TRACE_FUNC(); const auto& frame = frameResources[frameResourceIndex]; frame.commandBuffer->end(); @@ -626,6 +633,8 @@ const vk::UniquePipelineLayout& Context::getPushConstantPipelineLayout() { } void Context::FrameResources::runDeletionQueue(Context& context) { + MLN_TRACE_FUNC(); + for (const auto& function : deletionQueue) function(context); deletionQueue.clear(); diff --git a/src/mbgl/vulkan/descriptor_set.cpp b/src/mbgl/vulkan/descriptor_set.cpp index 79d2a86a8fa..d8d6866e5e7 100644 --- a/src/mbgl/vulkan/descriptor_set.cpp +++ b/src/mbgl/vulkan/descriptor_set.cpp @@ -4,10 +4,13 @@ #include #include #include +#include #include #include +#define USE_DESCRIPTOR_POOL_RESET + namespace mbgl { namespace vulkan { @@ -19,8 +22,12 @@ DescriptorSet::~DescriptorSet() { context.enqueueDeletion( [type_ = type, poolIndex = descriptorPoolIndex, sets = std::move(descriptorSets)](auto& context_) mutable { auto& poolInfo = context_.getDescriptorPool(type_).pools[poolIndex]; +#ifdef USE_DESCRIPTOR_POOL_RESET + poolInfo.unusedSets.push(std::move(sets)); +#else context_.getBackend().getDevice()->freeDescriptorSets(poolInfo.pool.get(), sets); poolInfo.remainingSets += sets.size(); +#endif }); } @@ -34,15 +41,21 @@ void DescriptorSet::createDescriptorPool(DescriptorPoolGrowable& growablePool) { : vk::DescriptorType::eCombinedImageSampler, maxSets * growablePool.descriptorsPerSet}; - const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet) - .setPoolSizes(size) - .setMaxSets(maxSets); +#ifdef USE_DESCRIPTOR_POOL_RESET + const auto poolFlags = vk::DescriptorPoolCreateFlags(); +#else + const auto poolFlags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet; +#endif + + const auto descriptorPoolInfo = vk::DescriptorPoolCreateInfo(poolFlags).setPoolSizes(size).setMaxSets(maxSets); growablePool.pools.emplace_back(device->createDescriptorPoolUnique(descriptorPoolInfo), maxSets); growablePool.currentPoolIndex = growablePool.pools.size() - 1; }; void DescriptorSet::allocate() { + MLN_TRACE_FUNC(); + if (!descriptorSets.empty()) { return; } @@ -52,31 +65,55 @@ void DescriptorSet::allocate() { auto& growablePool = context.getDescriptorPool(type); const std::vector layouts(context.getBackend().getMaxFrames(), descriptorSetLayout); - if (growablePool.currentPoolIndex == -1 || growablePool.current().remainingSets < layouts.size()) { - const auto& poolIt = std::find_if(growablePool.pools.begin(), growablePool.pools.end(), [&](const auto& p) { - return p.remainingSets >= layouts.size(); - }); - - if (poolIt != growablePool.pools.end()) { - growablePool.currentPoolIndex = std::distance(growablePool.pools.begin(), poolIt); - } else { - createDescriptorPool(growablePool); + if (growablePool.currentPoolIndex == -1 || + (growablePool.current().unusedSets.empty() && growablePool.current().remainingSets < layouts.size())) { +#ifdef USE_DESCRIPTOR_POOL_RESET + // find a pool that has unused allocated descriptor sets + const auto& unusedPoolIt = std::find_if( + growablePool.pools.begin(), growablePool.pools.end(), [&](const auto& p) { return !p.unusedSets.empty(); }); + + if (unusedPoolIt != growablePool.pools.end()) { + growablePool.currentPoolIndex = std::distance(growablePool.pools.begin(), unusedPoolIt); + } else +#endif + { + // find a pool that has available memory to allocate more descriptor sets + const auto& freePoolIt = std::find_if(growablePool.pools.begin(), + growablePool.pools.end(), + [&](const auto& p) { return p.remainingSets >= layouts.size(); }); + + if (freePoolIt != growablePool.pools.end()) { + growablePool.currentPoolIndex = std::distance(growablePool.pools.begin(), freePoolIt); + } else { + createDescriptorPool(growablePool); + } } } descriptorPoolIndex = growablePool.currentPoolIndex; - descriptorSets = device->allocateDescriptorSets( - vk::DescriptorSetAllocateInfo().setDescriptorPool(growablePool.current().pool.get()).setSetLayouts(layouts)); - growablePool.current().remainingSets -= descriptorSets.size(); - markDirty(true); +#ifdef USE_DESCRIPTOR_POOL_RESET + if (!growablePool.current().unusedSets.empty()) { + descriptorSets = growablePool.current().unusedSets.front(); + growablePool.current().unusedSets.pop(); + } else +#endif + { + descriptorSets = device->allocateDescriptorSets(vk::DescriptorSetAllocateInfo() + .setDescriptorPool(growablePool.current().pool.get()) + .setSetLayouts(layouts)); + growablePool.current().remainingSets -= descriptorSets.size(); + } + + dirty = std::vector(descriptorSets.size(), true); } void DescriptorSet::markDirty(bool value) { - dirty = std::vector(descriptorSets.size(), value); + std::fill(dirty.begin(), dirty.end(), value); } void DescriptorSet::bind(CommandEncoder& encoder) { + MLN_TRACE_FUNC(); auto& commandBuffer = encoder.getCommandBuffer(); const uint8_t index = context.getCurrentFrameResourceIndex(); @@ -94,6 +131,8 @@ UniformDescriptorSet::UniformDescriptorSet(Context& context_, DescriptorSetType void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, uint32_t uniformStartIndex, uint32_t descriptorBindingCount) { + MLN_TRACE_FUNC(); + allocate(); const uint8_t frameIndex = context.getCurrentFrameResourceIndex(); @@ -127,12 +166,15 @@ void UniformDescriptorSet::update(const gfx::UniformBufferArray& uniforms, device->updateDescriptorSets(writeDescriptorSet, nullptr); } + + dirty[frameIndex] = false; } ImageDescriptorSet::ImageDescriptorSet(Context& context_) : DescriptorSet(context_, DescriptorSetType::DrawableImage) {} void ImageDescriptorSet::update(const std::array& textures) { + MLN_TRACE_FUNC(); allocate(); const uint8_t frameIndex = context.getCurrentFrameResourceIndex(); @@ -160,6 +202,8 @@ void ImageDescriptorSet::update(const std::arrayupdateDescriptorSets(writeDescriptorSet, nullptr); } + + dirty[frameIndex] = false; } } // namespace vulkan diff --git a/src/mbgl/vulkan/drawable.cpp b/src/mbgl/vulkan/drawable.cpp index a8c65f8251a..64dcf681ac0 100644 --- a/src/mbgl/vulkan/drawable.cpp +++ b/src/mbgl/vulkan/drawable.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #if !defined(NDEBUG) @@ -129,6 +130,8 @@ void Drawable::updateVertexAttributes(gfx::VertexAttributeArrayPtr vertices, } void Drawable::upload(gfx::UploadPass& uploadPass_) { + MLN_TRACE_FUNC(); + if (isCustom) { return; } @@ -234,6 +237,8 @@ void Drawable::upload(gfx::UploadPass& uploadPass_) { } void Drawable::draw(PaintParameters& parameters) const { + MLN_TRACE_FUNC(); + if (isCustom) { return; } @@ -334,6 +339,8 @@ gfx::UniformBufferArray& Drawable::mutableUniformBuffers() { } void Drawable::buildVulkanInputBindings() noexcept { + MLN_TRACE_FUNC(); + impl->vulkanVertexBuffers.clear(); impl->vulkanVertexOffsets.clear(); @@ -386,6 +393,8 @@ void Drawable::buildVulkanInputBindings() noexcept { } bool Drawable::bindAttributes(CommandEncoder& encoder) const noexcept { + MLN_TRACE_FUNC(); + if (impl->vulkanVertexBuffers.empty()) return false; const auto& commandBuffer = encoder.getCommandBuffer(); @@ -403,6 +412,8 @@ bool Drawable::bindAttributes(CommandEncoder& encoder) const noexcept { } bool Drawable::bindDescriptors(CommandEncoder& encoder) const noexcept { + MLN_TRACE_FUNC(); + if (!shader) return false; // bind uniforms @@ -415,6 +426,15 @@ bool Drawable::bindDescriptors(CommandEncoder& encoder) const noexcept { impl->imageDescriptorSet = std::make_unique(encoder.getContext()); } + for (const auto& texture : textures) { + if (!texture) continue; + const auto textureImpl = static_cast(texture.get()); + if (textureImpl->isDirty()) { + impl->imageDescriptorSet->markDirty(true); + break; + } + } + impl->imageDescriptorSet->update(textures); impl->imageDescriptorSet->bind(encoder); } @@ -423,6 +443,7 @@ bool Drawable::bindDescriptors(CommandEncoder& encoder) const noexcept { } void Drawable::uploadTextures(UploadPass&) const noexcept { + MLN_TRACE_FUNC(); for (const auto& texture : textures) { if (texture) { texture->upload(); diff --git a/src/mbgl/vulkan/texture2d.cpp b/src/mbgl/vulkan/texture2d.cpp index d461f68b9cc..7c31f5330d8 100644 --- a/src/mbgl/vulkan/texture2d.cpp +++ b/src/mbgl/vulkan/texture2d.cpp @@ -50,6 +50,11 @@ Texture2D::~Texture2D() { } gfx::Texture2D& Texture2D::setSamplerConfiguration(const SamplerState& samplerState_) noexcept { + if (samplerState.filter == samplerState_.filter && samplerState.wrapU == samplerState_.wrapU && + samplerState.wrapV == samplerState_.wrapV) { + return *this; + } + samplerState = samplerState_; samplerStateDirty = true; return *this; diff --git a/src/mbgl/vulkan/uniform_buffer.cpp b/src/mbgl/vulkan/uniform_buffer.cpp index 9f5364f2d78..b01e0facc90 100644 --- a/src/mbgl/vulkan/uniform_buffer.cpp +++ b/src/mbgl/vulkan/uniform_buffer.cpp @@ -41,11 +41,20 @@ void UniformBuffer::update(const void* data, std::size_t size_) { const std::shared_ptr& UniformBufferArray::set(const size_t id, std::shared_ptr uniformBuffer) { + if (id >= uniformBufferVector.size()) { + return nullref; + } + + if (uniformBufferVector[id] == uniformBuffer) { + return uniformBufferVector[id]; + } + if (descriptorSet) { descriptorSet->markDirty(); } - return gfx::UniformBufferArray::set(id, uniformBuffer); + uniformBufferVector[id] = std::move(uniformBuffer); + return uniformBufferVector[id]; } void UniformBufferArray::createOrUpdate( From dd7461f89571447089860644600f440b0045250e Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 13 Nov 2024 00:00:13 +0100 Subject: [PATCH 3/3] Attempt to fix instrumentation tests (#3012) --- .github/workflows/android-device-test.yml | 3 --- .github/workflows/ios-device-test.yml | 3 --- scripts/aws-device-farm/aws-device-farm-run.sh | 2 ++ 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 9d1c2efbe52..263c4c76ae3 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -144,9 +144,6 @@ jobs: export testPackageType=INSTRUMENTATION_TEST_PACKAGE export testType=INSTRUMENTATION export testFilter="${{ matrix.test.testFilter }}" - export AWS_ACCESS_KEY_ID="${{ secrets.AWS_ACCESS_KEY_ID }}" - export AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}" - export AWS_ROLE_TO_ASSUME="${{ vars.OIDC_AWS_ROLE_TO_ASSUME }}" export AWS_DEVICE_FARM_PROJECT_ARN="${{ vars.AWS_DEVICE_FARM_PROJECT_ARN }}" export AWS_DEVICE_FARM_DEVICE_POOL_ARN="${{ matrix.test.devicePool }}" export testSpecArn="${{ matrix.test.testSpecArn }}" diff --git a/.github/workflows/ios-device-test.yml b/.github/workflows/ios-device-test.yml index 5ea5666f28e..fc8bde6698c 100644 --- a/.github/workflows/ios-device-test.yml +++ b/.github/workflows/ios-device-test.yml @@ -58,9 +58,6 @@ jobs: export testFile="${{ matrix.test.xcTestFile }}" export testPackageType=XCTEST_TEST_PACKAGE export testType=XCTEST - export AWS_ACCESS_KEY_ID="${{ secrets.AWS_ACCESS_KEY_ID }}" - export AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}" - export AWS_ROLE_TO_ASSUME="${{ vars.OIDC_AWS_ROLE_TO_ASSUME }}" export AWS_DEVICE_FARM_PROJECT_ARN="${{ vars.AWS_DEVICE_FARM_PROJECT_ARN }}" export AWS_DEVICE_FARM_DEVICE_POOL_ARN="${{ vars.AWS_DEVICE_FARM_IPHONE_DEVICE_POOL_ARN }}" export wait_for_completion=true diff --git a/scripts/aws-device-farm/aws-device-farm-run.sh b/scripts/aws-device-farm/aws-device-farm-run.sh index 31b58db2fd1..9b76bb0f844 100755 --- a/scripts/aws-device-farm/aws-device-farm-run.sh +++ b/scripts/aws-device-farm/aws-device-farm-run.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + # List of required environment variables required_vars=( "AWS_DEVICE_FARM_PROJECT_ARN"