blob: 343ab44d59645d28fc82a4e2768c6482b7d34f76 [file] [log] [blame]
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// RenderBufferMtl.mm:
// Implements the class methods for RenderBufferMtl.
//
#include "libANGLE/renderer/metal/RenderBufferMtl.h"
#include "libANGLE/renderer/metal/ContextMtl.h"
#include "libANGLE/renderer/metal/mtl_format_utils.h"
#include "libANGLE/renderer/metal/mtl_utils.h"
namespace rx
{
RenderbufferMtl::RenderbufferMtl(const gl::RenderbufferState &state) : RenderbufferImpl(state) {}
RenderbufferMtl::~RenderbufferMtl() {}
void RenderbufferMtl::onDestroy(const gl::Context *context)
{
releaseTexture();
}
void RenderbufferMtl::releaseTexture()
{
mTexture = nullptr;
}
angle::Result RenderbufferMtl::setStorageImpl(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
{
ContextMtl *contextMtl = mtl::GetImpl(context);
// NOTE(hqle): Support MSAA
ANGLE_CHECK(contextMtl, samples == 1, "Multisample is not supported atm.", GL_INVALID_VALUE);
if (mTexture != nullptr && mTexture->valid())
{
// Check against the state if we need to recreate the storage.
if (internalformat != mState.getFormat().info->internalFormat ||
static_cast<GLsizei>(width) != mState.getWidth() ||
static_cast<GLsizei>(height) != mState.getHeight())
{
releaseTexture();
}
}
const gl::InternalFormat &internalFormat = gl::GetSizedInternalFormatInfo(internalformat);
angle::FormatID angleFormatId =
angle::Format::InternalFormatToID(internalFormat.sizedInternalFormat);
mFormat = contextMtl->getPixelFormat(angleFormatId);
if ((mTexture == nullptr || !mTexture->valid()) && (width != 0 && height != 0))
{
ANGLE_TRY(mtl::Texture::Make2DTexture(contextMtl, mFormat, static_cast<uint32_t>(width),
static_cast<uint32_t>(height), 1, false, false,
&mTexture));
mRenderTarget.set(mTexture, 0, 0, mFormat);
}
return angle::Result::Continue;
}
angle::Result RenderbufferMtl::setStorage(const gl::Context *context,
GLenum internalformat,
size_t width,
size_t height)
{
return setStorageImpl(context, 1, internalformat, width, height);
}
angle::Result RenderbufferMtl::setStorageMultisample(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
{
// NOTE(hqle): Support MSAA
UNIMPLEMENTED();
return angle::Result::Stop;
}
angle::Result RenderbufferMtl::setStorageEGLImageTarget(const gl::Context *context,
egl::Image *image)
{
// NOTE(hqle): Support EGLimage
UNIMPLEMENTED();
return angle::Result::Stop;
}
angle::Result RenderbufferMtl::getAttachmentRenderTarget(const gl::Context *context,
GLenum binding,
const gl::ImageIndex &imageIndex,
GLsizei samples,
FramebufferAttachmentRenderTarget **rtOut)
{
// NOTE(hqle): Support MSAA.
ASSERT(mTexture && mTexture->valid());
*rtOut = &mRenderTarget;
return angle::Result::Continue;
}
angle::Result RenderbufferMtl::initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex)
{
return mtl::InitializeTextureContents(context, mTexture, mFormat, imageIndex);
}
}