blob: 903b3febf72a41fb2ec52e665b4618893733a70d [file] [log] [blame]
//
// Copyright 2014 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.
//
// FramebufferD3D.h: Defines the DefaultAttachmentD3D and FramebufferD3D classes.
#ifndef LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
#define LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
#include <cstdint>
#include <vector>
#include "common/Color.h"
#include "common/Optional.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/FramebufferImpl.h"
namespace gl
{
class FramebufferAttachment;
struct PixelPackState;
typedef std::vector<const FramebufferAttachment *> AttachmentList;
}
namespace rx
{
class RendererD3D;
class RenderTargetD3D;
struct ClearParameters
{
bool clearColor[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS];
gl::ColorF colorF;
gl::ColorI colorI;
gl::ColorUI colorUI;
GLenum colorType;
bool colorMaskRed;
bool colorMaskGreen;
bool colorMaskBlue;
bool colorMaskAlpha;
bool clearDepth;
float depthValue;
bool clearStencil;
GLint stencilValue;
GLuint stencilWriteMask;
bool scissorEnabled;
gl::Rectangle scissor;
};
class FramebufferD3D : public FramebufferImpl
{
public:
FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer);
virtual ~FramebufferD3D();
gl::Error clear(ContextImpl *impl, GLbitfield mask) override;
gl::Error clearBufferfv(ContextImpl *impl,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values) override;
gl::Error clearBufferuiv(ContextImpl *impl,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) override;
gl::Error clearBufferiv(ContextImpl *impl,
GLenum buffer,
GLint drawbuffer,
const GLint *values) override;
gl::Error clearBufferfi(ContextImpl *impl,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) override;
GLenum getImplementationColorReadFormat() const override;
GLenum getImplementationColorReadType() const override;
gl::Error readPixels(ContextImpl *impl,
const gl::Rectangle &area,
GLenum format,
GLenum type,
void *pixels) const override;
gl::Error blit(ContextImpl *impl,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
GLenum filter) override;
bool checkStatus() const override;
void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
const gl::AttachmentList &getColorAttachmentsForRender() const;
gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
private:
virtual gl::Error clearImpl(ContextImpl *impl, const ClearParameters &clearParams) = 0;
virtual gl::Error readPixelsImpl(const gl::Rectangle &area,
GLenum format,
GLenum type,
size_t outputPitch,
const gl::PixelPackState &pack,
uint8_t *pixels) const = 0;
virtual gl::Error blitImpl(const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
bool blitDepth,
bool blitStencil,
GLenum filter,
const gl::Framebuffer *sourceFramebuffer) = 0;
virtual GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const = 0;
RendererD3D *mRenderer;
Optional<gl::AttachmentList> mColorAttachmentsForRender;
};
}
#endif // LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_