aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrGpu.h
diff options
context:
space:
mode:
authorGravatar cdalton <cdalton@nvidia.com>2016-03-07 13:58:26 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-07 13:58:26 -0800
commit28f45b949acc746849100fbe112ee5280f0594c9 (patch)
treeb350d442680ef996ab6097433ab0cf960d3680b6 /src/gpu/GrGpu.h
parentb3b13b7edeabad4c8e53b0d309b0a44668d1e68f (diff)
Add "sample locations" feature to GrProcessor
Adds a "sample locations" feature to GrProcessor. When enabled, this allows a processor to know inside the shader where all the samples are located. Also adds various infastructure to query, cache, and identify multisample data. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1717393002 Review URL: https://codereview.chromium.org/1717393002
Diffstat (limited to 'src/gpu/GrGpu.h')
-rw-r--r--src/gpu/GrGpu.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 5d35fcf859..ebe4116ebe 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -12,6 +12,7 @@
#include "GrProgramDesc.h"
#include "GrStencil.h"
#include "GrSwizzle.h"
+#include "GrAllocator.h"
#include "GrTextureParamsAdjuster.h"
#include "GrTypes.h"
#include "GrXferProcessor.h"
@@ -365,6 +366,22 @@ public:
const SkIRect& srcRect,
const SkIPoint& dstPoint);
+ struct MultisampleSpecs {
+ // Nonzero ID that uniquely identifies these multisample specs.
+ uint8_t fUniqueID;
+ // The actual number of samples the GPU will run. NOTE: this value can be greater than the
+ // the render target's sample count.
+ int fEffectiveSampleCnt;
+ // If sample locations are supported, contains the subpixel locations at which the GPU will
+ // sample. Pixel center is at (.5, .5) and (0, 0) indicates the top left corner.
+ SkAutoTDeleteArray<const SkPoint> fSampleLocations;
+ };
+
+ // Finds a render target's multisample specs. The stencil settings are only needed to flush the
+ // draw state prior to querying multisample information; they should not have any effect on the
+ // multisample information itself.
+ const MultisampleSpecs& getMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&);
+
struct DrawArgs {
DrawArgs(const GrPrimitiveProcessor* primProc,
const GrPipeline* pipeline,
@@ -601,6 +618,12 @@ private:
const SkIRect& srcRect,
const SkIPoint& dstPoint) = 0;
+ // overridden by backend specific derived class to perform the multisample queries
+ virtual void onGetMultisampleSpecs(GrRenderTarget*,
+ const GrStencilSettings&,
+ int* effectiveSampleCnt,
+ SkAutoTDeleteArray<SkPoint>* sampleLocations) = 0;
+
void resetContext() {
this->onResetContext(fResetBits);
fResetBits = 0;
@@ -609,6 +632,8 @@ private:
ResetTimestamp fResetTimestamp;
uint32_t fResetBits;
+ SkTArray<const MultisampleSpecs*, true> fMultisampleSpecsMap;
+ GrTAllocator<MultisampleSpecs> fMultisampleSpecsAllocator;
// The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
GrContext* fContext;