1c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
2c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com/*
3c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com * Copyright 2013 Google Inc.
4c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com *
5c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com * found in the LICENSE file.
7c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com */
8c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#ifndef GrDrawTargetCaps_DEFINED
9c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#define GrDrawTargetCaps_DEFINED
10c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
118b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org#include "GrTypes.h"
128b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org#include "SkRefCnt.h"
138b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org#include "SkString.h"
148b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org
15c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com/**
16c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com * Represents the draw target capabilities.
17c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com */
18c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.comclass GrDrawTargetCaps : public SkRefCnt {
19c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.compublic:
20c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    SK_DECLARE_INST_COUNT(Caps)
21c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
22c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    GrDrawTargetCaps() { this->reset(); }
23faa5ae456d184202993a5dbe782a3a95acc25326commit-bot@chromium.org    GrDrawTargetCaps(const GrDrawTargetCaps& other) : INHERITED() { *this = other; }
24c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    GrDrawTargetCaps& operator= (const GrDrawTargetCaps&);
25c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
26c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    virtual void reset();
278b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org    virtual SkString dump() const;
28c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
29c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
304744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org    /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
314744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org        only for POT textures) */
324744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org    bool mipMapSupport() const { return fMipMapSupport; }
33c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
34c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool stencilWrapOpsSupport() const { return  fStencilWrapOpsSupport; }
35c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool hwAALineSupport() const { return fHWAALineSupport; }
36c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool shaderDerivativeSupport() const { return fShaderDerivativeSupport; }
37c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool geometryShaderSupport() const { return fGeometryShaderSupport; }
38c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; }
39c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org    bool pathRenderingSupport() const { return fPathRenderingSupport; }
406b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com    bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; }
4128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
42a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    bool gpuTracingSupport() const { return fGpuTracingSupport; }
432d2e5c4e2425a1cb64d31d7d10832f4a3a9137a4robertphillips@google.com
44160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    /**
45160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org     * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
46160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org     * textures allows partial mappings or full mappings.
47160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org     */
48160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    enum MapFlags {
49160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        kNone_MapFlags   = 0x0,       //<! Cannot map the resource.
50160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
51160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        kCanMap_MapFlag  = 0x1,       //<! The resource can be mapped. Must be set for any of
52160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org                                      //   the other flags to have meaning.k
53160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        kSubset_MapFlag  = 0x2,       //<! The resource can be partially mapped.
54160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    };
55160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
56160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    uint32_t mapBufferFlags() const { return fMapBufferFlags; }
57160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
582d2e5c4e2425a1cb64d31d7d10832f4a3a9137a4robertphillips@google.com    // Scratch textures not being reused means that those scratch textures
597ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com    // that we upload to (i.e., don't have a render target) will not be
602d2e5c4e2425a1cb64d31d7d10832f4a3a9137a4robertphillips@google.com    // recycled in the texture cache. This is to prevent ghosting by drivers
612d2e5c4e2425a1cb64d31d7d10832f4a3a9137a4robertphillips@google.com    // (in particular for deferred architectures).
62b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org    bool reuseScratchTextures() const { return fReuseScratchTextures; }
63c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
64c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
65c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int maxTextureSize() const { return fMaxTextureSize; }
66c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    // Will be 0 if MSAA is not supported
67c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int maxSampleCount() const { return fMaxSampleCount; }
68c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
696b7938f9cb250086a7c6325cf31576f894ca4a1bcommit-bot@chromium.org    bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
707388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org        SkASSERT(kGrPixelConfigCnt > config);
716b7938f9cb250086a7c6325cf31576f894ca4a1bcommit-bot@chromium.org        return fConfigRenderSupport[config][withMSAA];
727388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org    }
737388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org
746e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org    bool isConfigTexturable(GrPixelConfig config) const {
756e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org        SkASSERT(kGrPixelConfigCnt > config);
766e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org        return fConfigTextureSupport[config];
7742dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org    }
7842dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org
79c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.comprotected:
80c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fNPOTTextureTileSupport    : 1;
814744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org    bool fMipMapSupport             : 1;
82c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fTwoSidedStencilSupport    : 1;
83c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fStencilWrapOpsSupport     : 1;
84c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fHWAALineSupport           : 1;
85c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fShaderDerivativeSupport   : 1;
86c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fGeometryShaderSupport     : 1;
87c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    bool fDualSourceBlendingSupport : 1;
88c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org    bool fPathRenderingSupport      : 1;
896b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com    bool fDstReadInShaderSupport    : 1;
9028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    bool fDiscardRenderTargetSupport: 1;
91b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org    bool fReuseScratchTextures      : 1;
92a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    bool fGpuTracingSupport         : 1;
93c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
94160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    uint32_t fMapBufferFlags;
95160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
96c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int fMaxRenderTargetSize;
97c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int fMaxTextureSize;
98c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    int fMaxSampleCount;
99c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
1006b7938f9cb250086a7c6325cf31576f894ca4a1bcommit-bot@chromium.org    // The first entry for each config is without msaa and the second is with.
1016b7938f9cb250086a7c6325cf31576f894ca4a1bcommit-bot@chromium.org    bool fConfigRenderSupport[kGrPixelConfigCnt][2];
1026e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org    bool fConfigTextureSupport[kGrPixelConfigCnt];
10342dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org
104c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    typedef SkRefCnt INHERITED;
105c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com};
106c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com
107c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#endif
108