/* * Copyright 2021 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tests/Test.h" #include "experimental/graphite/include/Context.h" #include "experimental/graphite/src/ContextPriv.h" #include "experimental/graphite/include/mtl/MtlTypes.h" #include "experimental/graphite/src/Buffer.h" #include "experimental/graphite/src/CommandBuffer.h" #include "experimental/graphite/src/Gpu.h" #include "experimental/graphite/src/RenderPipeline.h" #include "experimental/graphite/src/ResourceProvider.h" #include "experimental/graphite/src/Texture.h" #if GRAPHITE_TEST_UTILS // set to 1 if you want to do GPU capture of the commandBuffer #define CAPTURE_COMMANDBUFFER 0 #endif using namespace skgpu; /* * This is to test the various pieces of the CommandBuffer interface. */ DEF_GRAPHITE_TEST_FOR_CONTEXTS(CommandBufferTest, reporter, context) { auto gpu = context->priv().gpu(); REPORTER_ASSERT(reporter, gpu); #if GRAPHITE_TEST_UTILS && CAPTURE_COMMANDBUFFER gpu->testingOnly_startCapture(); #endif auto commandBuffer = gpu->resourceProvider()->createCommandBuffer(); SkISize textureSize = { 1024, 768 }; #ifdef SK_METAL skgpu::mtl::TextureInfo mtlTextureInfo = { 1, 1, 70, // MTLPixelFormatRGBA8Unorm 0x0005, // MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead 2, // MTLStorageModePrivate }; TextureInfo textureInfo(mtlTextureInfo); #else TextureInfo textureInfo; #endif sk_sp texture = gpu->resourceProvider()->findOrCreateTexture(textureSize, textureInfo); REPORTER_ASSERT(reporter, texture); RenderPassDesc renderPassDesc = {}; renderPassDesc.fColorAttachment.fTexture = texture; renderPassDesc.fColorAttachment.fLoadOp = LoadOp::kClear; renderPassDesc.fColorAttachment.fStoreOp = StoreOp::kStore; renderPassDesc.fClearColor = { 1, 0, 0, 1 }; commandBuffer->beginRenderPass(renderPassDesc); RenderPipelineDesc pipelineDesc; auto renderPipeline = gpu->resourceProvider()->findOrCreateRenderPipeline(pipelineDesc); commandBuffer->setRenderPipeline(std::move(renderPipeline)); commandBuffer->draw(PrimitiveType::kTriangleStrip, 0, 4); commandBuffer->endRenderPass(); sk_sp buffer = gpu->resourceProvider()->findOrCreateBuffer(1024*768*4, BufferType::kXferGpuToCpu, PrioritizeGpuReads::kNo); REPORTER_ASSERT(reporter, buffer); SkIRect srcRect = { 0, 0, 1024, 768 }; size_t rowBytes = 1024*4; commandBuffer->copyTextureToBuffer(texture, srcRect, buffer, 0, rowBytes); bool result = gpu->submit(commandBuffer); REPORTER_ASSERT(reporter, result); gpu->checkForFinishedWork(skgpu::SyncToCpu::kYes); uint32_t* pixels = (uint32_t*)(buffer->map()); REPORTER_ASSERT(reporter, pixels[0] == 0xffff0000); #if GRAPHITE_TEST_UTILS && CAPTURE_COMMANDBUFFER gpu->testingOnly_endCapture(); #endif }