| /* |
| * Copyright 2022 Rive |
| */ |
| |
| #include "rive/pls/pls_render_context_helper_impl.hpp" |
| |
| #include "rive/pls/pls_image.hpp" |
| #include "shaders/constants.glsl" |
| |
| #ifdef RIVE_DECODERS |
| #include "rive/decoders/bitmap_decoder.hpp" |
| #endif |
| |
| namespace rive::pls |
| { |
| rcp<PLSTexture> PLSRenderContextHelperImpl::decodeImageTexture(Span<const uint8_t> encodedBytes) |
| { |
| #ifdef RIVE_DECODERS |
| auto bitmap = Bitmap::decode(encodedBytes.data(), encodedBytes.size()); |
| if (bitmap) |
| { |
| // For now, PLSRenderContextImpl::makeImageTexture() only accepts RGBA. |
| if (bitmap->pixelFormat() != Bitmap::PixelFormat::RGBA) |
| { |
| bitmap->pixelFormat(Bitmap::PixelFormat::RGBA); |
| } |
| uint32_t width = bitmap->width(); |
| uint32_t height = bitmap->height(); |
| uint32_t mipLevelCount = math::msb(height | width); |
| return makeImageTexture(width, height, mipLevelCount, bitmap->bytes()); |
| } |
| #endif |
| return nullptr; |
| } |
| |
| void PLSRenderContextHelperImpl::resizeFlushUniformBuffer(size_t sizeInBytes) |
| { |
| m_flushUniformBuffer = makeUniformBufferRing(sizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeImageDrawUniformBuffer(size_t sizeInBytes) |
| { |
| m_imageDrawUniformBuffer = makeUniformBufferRing(sizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::resizePathBuffer(size_t sizeInBytes, |
| pls::StorageBufferStructure bufferStructure) |
| { |
| m_pathBuffer = makeStorageBufferRing(sizeInBytes, bufferStructure); |
| } |
| |
| void PLSRenderContextHelperImpl::resizePaintBuffer(size_t sizeInBytes, |
| pls::StorageBufferStructure bufferStructure) |
| { |
| m_paintBuffer = makeStorageBufferRing(sizeInBytes, bufferStructure); |
| } |
| |
| void PLSRenderContextHelperImpl::resizePaintAuxBuffer(size_t sizeInBytes, |
| pls::StorageBufferStructure bufferStructure) |
| { |
| m_paintAuxBuffer = makeStorageBufferRing(sizeInBytes, bufferStructure); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeContourBuffer(size_t sizeInBytes, |
| pls::StorageBufferStructure bufferStructure) |
| { |
| m_contourBuffer = makeStorageBufferRing(sizeInBytes, bufferStructure); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeSimpleColorRampsBuffer(size_t sizeInBytes) |
| { |
| m_simpleColorRampsBuffer = makeTextureTransferBufferRing(sizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeGradSpanBuffer(size_t sizeInBytes) |
| { |
| m_gradSpanBuffer = makeVertexBufferRing(sizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeTessVertexSpanBuffer(size_t sizeInBytes) |
| { |
| m_tessSpanBuffer = makeVertexBufferRing(sizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::resizeTriangleVertexBuffer(size_t sizeInBytes) |
| { |
| m_triangleBuffer = makeVertexBufferRing(sizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapFlushUniformBuffer(size_t mapSizeInBytes) |
| { |
| return m_flushUniformBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapImageDrawUniformBuffer(size_t mapSizeInBytes) |
| { |
| return m_imageDrawUniformBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapPathBuffer(size_t mapSizeInBytes) |
| { |
| return m_pathBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapPaintBuffer(size_t mapSizeInBytes) |
| { |
| return m_paintBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapPaintAuxBuffer(size_t mapSizeInBytes) |
| { |
| return m_paintAuxBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapContourBuffer(size_t mapSizeInBytes) |
| { |
| return m_contourBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapSimpleColorRampsBuffer(size_t mapSizeInBytes) |
| { |
| return m_simpleColorRampsBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapGradSpanBuffer(size_t mapSizeInBytes) |
| { |
| return m_gradSpanBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapTessVertexSpanBuffer(size_t mapSizeInBytes) |
| { |
| return m_tessSpanBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void* PLSRenderContextHelperImpl::mapTriangleVertexBuffer(size_t mapSizeInBytes) |
| { |
| return m_triangleBuffer->mapBuffer(mapSizeInBytes); |
| } |
| |
| void PLSRenderContextHelperImpl::unmapFlushUniformBuffer() |
| { |
| m_flushUniformBuffer->unmapAndSubmitBuffer(); |
| } |
| |
| void PLSRenderContextHelperImpl::unmapImageDrawUniformBuffer() |
| { |
| m_imageDrawUniformBuffer->unmapAndSubmitBuffer(); |
| } |
| |
| void PLSRenderContextHelperImpl::unmapPathBuffer() { m_pathBuffer->unmapAndSubmitBuffer(); } |
| |
| void PLSRenderContextHelperImpl::unmapPaintBuffer() { m_paintBuffer->unmapAndSubmitBuffer(); } |
| |
| void PLSRenderContextHelperImpl::unmapPaintAuxBuffer() { m_paintAuxBuffer->unmapAndSubmitBuffer(); } |
| |
| void PLSRenderContextHelperImpl::unmapContourBuffer() { m_contourBuffer->unmapAndSubmitBuffer(); } |
| |
| void PLSRenderContextHelperImpl::unmapSimpleColorRampsBuffer() |
| { |
| m_simpleColorRampsBuffer->unmapAndSubmitBuffer(); |
| } |
| |
| void PLSRenderContextHelperImpl::unmapGradSpanBuffer() { m_gradSpanBuffer->unmapAndSubmitBuffer(); } |
| |
| void PLSRenderContextHelperImpl::unmapTessVertexSpanBuffer() |
| { |
| m_tessSpanBuffer->unmapAndSubmitBuffer(); |
| } |
| |
| void PLSRenderContextHelperImpl::unmapTriangleVertexBuffer() |
| { |
| m_triangleBuffer->unmapAndSubmitBuffer(); |
| } |
| } // namespace rive::pls |