blob: c392bd9cead4f24f90aac08e7695ed2f59b69d40 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/fml/time/time_point.h"
#include "flutter/testing/testing.h"
#include "impeller/base/strings.h"
#include "impeller/fixtures/sample.comp.h"
#include "impeller/playground/playground_test.h"
#include "impeller/renderer/command_buffer.h"
#include "impeller/renderer/compute_command.h"
#include "impeller/renderer/compute_pipeline_builder.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/pipeline_library.h"
namespace impeller {
namespace testing {
using ComputeTest = PlaygroundTest;
INSTANTIATE_PLAYGROUND_SUITE(ComputeTest);
TEST_P(ComputeTest, CanCreateComputePass) {
if (GetParam() == PlaygroundBackend::kOpenGLES) {
GTEST_SKIP_("Compute is not supported on GL.");
}
if (GetParam() == PlaygroundBackend::kVulkan) {
GTEST_SKIP_("Compute is not supported on Vulkan yet.");
}
using CS = SampleComputeShader;
auto context = GetContext();
ASSERT_TRUE(context);
using SamplePipelineBuilder = ComputePipelineBuilder<CS>;
auto pipeline_desc =
SamplePipelineBuilder::MakeDefaultPipelineDescriptor(*context);
ASSERT_TRUE(pipeline_desc.has_value());
auto compute_pipeline =
context->GetPipelineLibrary()->GetPipeline(pipeline_desc).get();
ASSERT_TRUE(compute_pipeline);
auto cmd_buffer = context->CreateCommandBuffer();
auto pass = cmd_buffer->CreateComputePass();
ASSERT_TRUE(pass && pass->IsValid());
ComputeCommand cmd;
cmd.label = "Compute";
cmd.pipeline = compute_pipeline;
std::vector<CS::Input0> input_0;
std::vector<CS::Input1> input_1;
input_0.push_back(CS::Input0{Vector4(2.0, 3.0, 4.0, 5.0)});
input_1.push_back(CS::Input1{Vector4(6.0, 7.0, 8.0, 9.0)});
std::vector<CS::Output> output(5);
CS::BindInput0(cmd,
pass->GetTransientsBuffer().EmplaceStorageBuffer(input_0));
CS::BindInput1(cmd,
pass->GetTransientsBuffer().EmplaceStorageBuffer(input_1));
CS::BindOutput(cmd, pass->GetTransientsBuffer().EmplaceStorageBuffer(output));
ASSERT_TRUE(pass->AddCommand(std::move(cmd)));
ASSERT_TRUE(pass->EncodeCommands());
}
} // namespace testing
} // namespace impeller