Merge "RESTRICT AUTOMERGE Add 1/16th pixel offset when drawing non-AA points/lines" into udc-dev
This commit is contained in:
@@ -51,6 +51,9 @@
|
||||
#include "include/gpu/GrDirectContext.h"
|
||||
#include "pipeline/skia/AnimatedDrawables.h"
|
||||
#include "pipeline/skia/FunctorDrawable.h"
|
||||
#ifdef __ANDROID__
|
||||
#include "renderthread/CanvasContext.h"
|
||||
#endif
|
||||
|
||||
namespace android {
|
||||
namespace uirenderer {
|
||||
@@ -489,7 +492,19 @@ struct DrawPoints final : Op {
|
||||
size_t count;
|
||||
SkPaint paint;
|
||||
void draw(SkCanvas* c, const SkMatrix&) const {
|
||||
c->drawPoints(mode, count, pod<SkPoint>(this), paint);
|
||||
if (paint.isAntiAlias()) {
|
||||
c->drawPoints(mode, count, pod<SkPoint>(this), paint);
|
||||
} else {
|
||||
c->save();
|
||||
#ifdef __ANDROID__
|
||||
auto pixelSnap = renderthread::CanvasContext::getActiveContext()->getPixelSnapMatrix();
|
||||
auto transform = c->getLocalToDevice();
|
||||
transform.postConcat(pixelSnap);
|
||||
c->setMatrix(transform);
|
||||
#endif
|
||||
c->drawPoints(mode, count, pod<SkPoint>(this), paint);
|
||||
c->restore();
|
||||
}
|
||||
}
|
||||
};
|
||||
struct DrawVertices final : Op {
|
||||
|
||||
@@ -53,6 +53,14 @@ public:
|
||||
bool isSurfaceReady() override;
|
||||
bool isContextReady() override;
|
||||
|
||||
const SkM44& getPixelSnapMatrix() const override {
|
||||
// Small (~1/16th) nudge to ensure that pixel-aligned non-AA'd draws fill the
|
||||
// desired fragment
|
||||
static const SkScalar kOffset = 0.063f;
|
||||
static const SkM44 sSnapMatrix = SkM44::Translate(kOffset, kOffset);
|
||||
return sSnapMatrix;
|
||||
}
|
||||
|
||||
static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -215,6 +215,10 @@ void SkiaVulkanPipeline::onContextDestroyed() {
|
||||
}
|
||||
}
|
||||
|
||||
const SkM44& SkiaVulkanPipeline::getPixelSnapMatrix() const {
|
||||
return mVkSurface->getPixelSnapMatrix();
|
||||
}
|
||||
|
||||
} /* namespace skiapipeline */
|
||||
} /* namespace uirenderer */
|
||||
} /* namespace android */
|
||||
|
||||
@@ -55,6 +55,7 @@ public:
|
||||
bool isContextReady() override;
|
||||
bool supportsExtendedRangeHdr() const override { return true; }
|
||||
void setTargetSdrHdrRatio(float ratio) override;
|
||||
const SkM44& getPixelSnapMatrix() const override;
|
||||
|
||||
static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
|
||||
static sk_sp<Bitmap> allocateHardwareBitmap(renderthread::RenderThread& thread,
|
||||
|
||||
@@ -871,6 +871,10 @@ SkISize CanvasContext::getNextFrameSize() const {
|
||||
return size;
|
||||
}
|
||||
|
||||
const SkM44& CanvasContext::getPixelSnapMatrix() const {
|
||||
return mRenderPipeline->getPixelSnapMatrix();
|
||||
}
|
||||
|
||||
void CanvasContext::prepareAndDraw(RenderNode* node) {
|
||||
ATRACE_CALL();
|
||||
|
||||
|
||||
@@ -200,6 +200,9 @@ public:
|
||||
|
||||
SkISize getNextFrameSize() const;
|
||||
|
||||
// Returns the matrix to use to nudge non-AA'd points/lines towards the fragment center
|
||||
const SkM44& getPixelSnapMatrix() const;
|
||||
|
||||
// Called when SurfaceStats are available.
|
||||
static void onSurfaceStatsAvailable(void* context, int32_t surfaceControlId,
|
||||
ASurfaceControlStats* stats);
|
||||
|
||||
@@ -97,6 +97,7 @@ public:
|
||||
|
||||
virtual bool supportsExtendedRangeHdr() const { return false; }
|
||||
virtual void setTargetSdrHdrRatio(float ratio) = 0;
|
||||
virtual const SkM44& getPixelSnapMatrix() const = 0;
|
||||
|
||||
virtual ~IRenderPipeline() {}
|
||||
};
|
||||
|
||||
@@ -63,6 +63,18 @@ static SkMatrix GetPreTransformMatrix(SkISize windowSize, int transform) {
|
||||
return SkMatrix::I();
|
||||
}
|
||||
|
||||
static SkM44 GetPixelSnapMatrix(SkISize windowSize, int transform) {
|
||||
// Small (~1/16th) nudge to ensure that pixel-aligned non-AA'd draws fill the
|
||||
// desired fragment
|
||||
static const SkScalar kOffset = 0.063f;
|
||||
SkMatrix preRotation = GetPreTransformMatrix(windowSize, transform);
|
||||
SkMatrix invert;
|
||||
LOG_ALWAYS_FATAL_IF(!preRotation.invert(&invert));
|
||||
return SkM44::Translate(kOffset, kOffset)
|
||||
.postConcat(SkM44(preRotation))
|
||||
.preConcat(SkM44(invert));
|
||||
}
|
||||
|
||||
static bool ConnectAndSetWindowDefaults(ANativeWindow* window) {
|
||||
ATRACE_CALL();
|
||||
|
||||
@@ -178,6 +190,8 @@ bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode
|
||||
|
||||
outWindowInfo->preTransform =
|
||||
GetPreTransformMatrix(outWindowInfo->size, outWindowInfo->transform);
|
||||
outWindowInfo->pixelSnapMatrix =
|
||||
GetPixelSnapMatrix(outWindowInfo->size, outWindowInfo->transform);
|
||||
|
||||
err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value);
|
||||
if (err != 0 || query_value < 0) {
|
||||
@@ -413,6 +427,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() {
|
||||
}
|
||||
|
||||
mWindowInfo.preTransform = GetPreTransformMatrix(mWindowInfo.size, mWindowInfo.transform);
|
||||
mWindowInfo.pixelSnapMatrix = GetPixelSnapMatrix(mWindowInfo.size, mWindowInfo.transform);
|
||||
}
|
||||
|
||||
uint32_t idx;
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
const SkMatrix& getCurrentPreTransform() { return mWindowInfo.preTransform; }
|
||||
|
||||
void setColorSpace(sk_sp<SkColorSpace> colorSpace);
|
||||
const SkM44& getPixelSnapMatrix() const { return mWindowInfo.pixelSnapMatrix; }
|
||||
|
||||
bool isBeyond8Bit() const;
|
||||
|
||||
@@ -107,6 +108,7 @@ private:
|
||||
SkISize actualSize;
|
||||
// transform to be applied to the SkSurface to map the coordinates to the provided transform
|
||||
SkMatrix preTransform;
|
||||
SkM44 pixelSnapMatrix;
|
||||
};
|
||||
|
||||
VulkanSurface(ANativeWindow* window, const WindowInfo& windowInfo, GrDirectContext* grContext);
|
||||
|
||||
Reference in New Issue
Block a user