SharedGraphicsContext3D.h [plain text]
#ifndef SharedGraphicsContext3D_h
#define SharedGraphicsContext3D_h
#include "GraphicsContext3D.h"
#include "GraphicsTypes.h"
#include "ImageSource.h"
#include "Texture.h"
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/OwnArrayPtr.h>
#include <wtf/OwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#if USE(SKIA)
class GrContext;
#endif
namespace WebCore {
class AffineTransform;
class BicubicShader;
class Color;
class ConvolutionShader;
class DrawingBuffer;
class FloatRect;
class HostWindow;
class IntSize;
class LoopBlinnSolidFillShader;
class SolidFillShader;
class TexShader;
typedef HashMap<NativeImagePtr, RefPtr<Texture> > TextureHashMap;
class SharedGraphicsContext3D : public RefCounted<SharedGraphicsContext3D> {
public:
enum CreationFlagBits {
UseSkiaGPU = 1
};
typedef unsigned CreationFlags;
static PassRefPtr<SharedGraphicsContext3D> create(HostWindow*, CreationFlags);
~SharedGraphicsContext3D();
void makeContextCurrent();
void bindBuffer(GC3Denum target, Platform3DObject);
void bindFramebuffer(Platform3DObject framebuffer);
void bufferData(GC3Denum target, GC3Dsizeiptr, GC3Denum usage);
void bufferData(GC3Denum target, GC3Dsizeiptr, const void* data, GC3Denum usage);
void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr, const void* data);
void setViewport(const IntSize&);
void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
void enable(GC3Denum capacity);
void disable(GC3Denum capacity);
void clearColor(const Color&);
void clear(GC3Dbitfield mask);
void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
GC3Denum getError();
void getIntegerv(GC3Denum pname, GC3Dint* value);
void flush();
Platform3DObject createBuffer();
Platform3DObject createFramebuffer();
Platform3DObject createTexture();
void deleteFramebuffer(Platform3DObject framebuffer);
void deleteTexture(Platform3DObject texture);
void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
bool paintsIntoCanvasBuffer() const;
void applyCompositeOperator(CompositeOperator);
void enableStencil(bool enable);
void useQuadVertices();
void useFillSolidProgram(const AffineTransform&, const Color&);
void useTextureProgram(const AffineTransform&, const AffineTransform&, float alpha);
void useBicubicProgram(const AffineTransform&, const AffineTransform&, const float coefficients[16], const float imageIncrement[2], float alpha);
void useConvolutionProgram(const AffineTransform&, const AffineTransform& texTransform, const float* kernel, int kernelWidth, float imageIncrement[2]);
void setActiveTexture(GC3Denum textureUnit);
void bindTexture(GC3Denum target, Platform3DObject texture);
bool supportsBGRA();
bool supportsCompositeOp(CompositeOperator) const;
Texture* createTexture(NativeImagePtr, Texture::Format, int width, int height);
Texture* getTexture(NativeImagePtr);
static void removeTexturesFor(NativeImagePtr);
PassRefPtr<Texture> createTexture(Texture::Format, int width, int height);
GraphicsContext3D* graphicsContext3D() const { return m_context.get(); }
static bool useLoopBlinnForPathRendering();
void useLoopBlinnInteriorProgram(unsigned vertexOffset, const AffineTransform&, const Color&);
void useLoopBlinnExteriorProgram(unsigned vertexOffset, unsigned klmOffset, const AffineTransform&, const Color&);
DrawingBuffer* getOffscreenBuffer(unsigned index, const IntSize&);
#if USE(SKIA)
GrContext* grContext();
#endif
private:
SharedGraphicsContext3D(PassRefPtr<GraphicsContext3D>, PassOwnPtr<SolidFillShader>, PassOwnPtr<TexShader>, PassOwnPtr<BicubicShader>, PassOwnArrayPtr<OwnPtr<ConvolutionShader> >, CreationFlags);
static HashSet<SharedGraphicsContext3D*>* allContexts();
void removeTextureFor(NativeImagePtr);
RefPtr<GraphicsContext3D> m_context;
bool m_bgraSupported;
unsigned m_quadVertices;
OwnPtr<SolidFillShader> m_solidFillShader;
OwnPtr<TexShader> m_texShader;
OwnPtr<BicubicShader> m_bicubicShader;
OwnArrayPtr<OwnPtr<ConvolutionShader> > m_convolutionShaders;
TextureHashMap m_textures;
OwnPtr<LoopBlinnSolidFillShader> m_loopBlinnInteriorShader;
OwnPtr<LoopBlinnSolidFillShader> m_loopBlinnExteriorShader;
bool m_oesStandardDerivativesSupported;
WTF::Vector<RefPtr<DrawingBuffer> > m_offscreenBuffers;
unsigned m_flags;
#if USE(SKIA)
GrContext* m_grContext;
#endif
};
const float cMaxSigma = 4.0f;
const int cMaxKernelWidth = 25;
}
#endif // SharedGraphicsContext3D_h