cc: Remove RenderingStats passed to ContentLayerUpdater during Layer::Update()

depends on: https://codereview.chromium.org/13265003/

BUG=181319

Review URL: https://chromiumcodereview.appspot.com/13245007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208980 0039d316-1c4b-4281-b951-d872f2087c98
parent a6a6e2cc
...@@ -50,8 +50,7 @@ TEST(ContentLayerTest, ContentLayerPainterWithDeviceScale) { ...@@ -50,8 +50,7 @@ TEST(ContentLayerTest, ContentLayerPainterWithDeviceScale) {
gfx::Size(256, 256), gfx::Size(256, 256),
contents_scale, contents_scale,
contents_scale, contents_scale,
&resulting_opaque_rect, &resulting_opaque_rect);
NULL);
EXPECT_EQ(opaque_rect_in_content_space.ToString(), EXPECT_EQ(opaque_rect_in_content_space.ToString(),
resulting_opaque_rect.ToString()); resulting_opaque_rect.ToString());
......
...@@ -233,8 +233,7 @@ void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter, ...@@ -233,8 +233,7 @@ void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter,
rect.size(), rect.size(),
contents_scale_x(), contents_scale_x(),
contents_scale_y(), contents_scale_y(),
&painted_opaque_rect, &painted_opaque_rect);
stats);
if (!painter->pixels_did_change() && if (!painter->pixels_did_change() &&
resource->texture()->have_backing_texture()) { resource->texture()->have_backing_texture()) {
TRACE_EVENT_INSTANT0("cc", TRACE_EVENT_INSTANT0("cc",
...@@ -249,7 +248,7 @@ void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter, ...@@ -249,7 +248,7 @@ void ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter,
resource->texture()->ReturnBackingTexture(); resource->texture()->ReturnBackingTexture();
gfx::Vector2d dest_offset(0, 0); gfx::Vector2d dest_offset(0, 0);
resource->Update(queue, rect, dest_offset, partial_updates_allowed, stats); resource->Update(queue, rect, dest_offset, partial_updates_allowed);
} }
gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect( gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect(
......
...@@ -493,8 +493,7 @@ void TiledLayer::UpdateTileTextures(gfx::Rect paint_rect, ...@@ -493,8 +493,7 @@ void TiledLayer::UpdateTileTextures(gfx::Rect paint_rect,
tiler_->tile_size(), tiler_->tile_size(),
1.f / width_scale, 1.f / width_scale,
1.f / height_scale, 1.f / height_scale,
&painted_opaque_rect, &painted_opaque_rect);
stats);
for (int j = top; j <= bottom; ++j) { for (int j = top; j <= bottom; ++j) {
for (int i = left; i <= right; ++i) { for (int i = left; i <= right; ++i) {
...@@ -560,7 +559,7 @@ void TiledLayer::UpdateTileTextures(gfx::Rect paint_rect, ...@@ -560,7 +559,7 @@ void TiledLayer::UpdateTileTextures(gfx::Rect paint_rect,
CHECK_LE(paint_offset.y() + source_rect.height(), paint_rect.height()); CHECK_LE(paint_offset.y() + source_rect.height(), paint_rect.height());
tile->updater_resource()->Update( tile->updater_resource()->Update(
queue, source_rect, dest_offset, tile->partial_update, stats); queue, source_rect, dest_offset, tile->partial_update);
if (occlusion) { if (occlusion) {
occlusion->overdraw_metrics()-> occlusion->overdraw_metrics()->
DidUpload(gfx::Transform(), source_rect, tile->opaque_rect()); DidUpload(gfx::Transform(), source_rect, tile->opaque_rect());
......
...@@ -24,8 +24,7 @@ BitmapContentLayerUpdater::Resource::~Resource() {} ...@@ -24,8 +24,7 @@ BitmapContentLayerUpdater::Resource::~Resource() {}
void BitmapContentLayerUpdater::Resource::Update(ResourceUpdateQueue* queue, void BitmapContentLayerUpdater::Resource::Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) {
RenderingStats* stats) {
updater_->UpdateTexture( updater_->UpdateTexture(
queue, texture(), source_rect, dest_offset, partial_update); queue, texture(), source_rect, dest_offset, partial_update);
} }
...@@ -60,8 +59,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate( ...@@ -60,8 +59,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate(
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {
RenderingStats* stats) {
devtools_instrumentation::ScopedLayerTask paint_layer( devtools_instrumentation::ScopedLayerTask paint_layer(
devtools_instrumentation::kPaintLayer, layer_id_); devtools_instrumentation::kPaintLayer, layer_id_);
if (canvas_size_ != content_rect.size()) { if (canvas_size_ != content_rect.size()) {
...@@ -78,8 +76,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate( ...@@ -78,8 +76,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate(
content_rect, content_rect,
contents_width_scale, contents_width_scale,
contents_height_scale, contents_height_scale,
resulting_opaque_rect, resulting_opaque_rect);
stats);
base::TimeDelta duration = base::TimeDelta duration =
rendering_stats_instrumentation_->EndRecording(start_time); rendering_stats_instrumentation_->EndRecording(start_time);
rendering_stats_instrumentation_->AddPaint( rendering_stats_instrumentation_->AddPaint(
......
...@@ -30,8 +30,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater { ...@@ -30,8 +30,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater {
virtual void Update(ResourceUpdateQueue* queue, virtual void Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) OVERRIDE;
RenderingStats* stats) OVERRIDE;
private: private:
BitmapContentLayerUpdater* updater_; BitmapContentLayerUpdater* updater_;
...@@ -50,8 +49,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater { ...@@ -50,8 +49,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater {
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) OVERRIDE;
RenderingStats* stats) OVERRIDE;
void UpdateTexture(ResourceUpdateQueue* queue, void UpdateTexture(ResourceUpdateQueue* queue,
PrioritizedResource* resource, PrioritizedResource* resource,
gfx::Rect source_rect, gfx::Rect source_rect,
...@@ -71,6 +69,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater { ...@@ -71,6 +69,7 @@ class CC_EXPORT BitmapContentLayerUpdater : public ContentLayerUpdater {
gfx::Size canvas_size_; gfx::Size canvas_size_;
bool opaque_; bool opaque_;
private:
DISALLOW_COPY_AND_ASSIGN(BitmapContentLayerUpdater); DISALLOW_COPY_AND_ASSIGN(BitmapContentLayerUpdater);
}; };
......
...@@ -23,15 +23,14 @@ void BitmapSkPictureContentLayerUpdater::Resource::Update( ...@@ -23,15 +23,14 @@ void BitmapSkPictureContentLayerUpdater::Resource::Update(
ResourceUpdateQueue* queue, ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) {
RenderingStats* stats) {
bitmap_.setConfig( bitmap_.setConfig(
SkBitmap::kARGB_8888_Config, source_rect.width(), source_rect.height()); SkBitmap::kARGB_8888_Config, source_rect.width(), source_rect.height());
bitmap_.allocPixels(); bitmap_.allocPixels();
bitmap_.setIsOpaque(updater_->layer_is_opaque()); bitmap_.setIsOpaque(updater_->layer_is_opaque());
SkDevice device(bitmap_); SkDevice device(bitmap_);
SkCanvas canvas(&device); SkCanvas canvas(&device);
updater_->PaintContentsRect(&canvas, source_rect, stats); updater_->PaintContentsRect(&canvas, source_rect);
ResourceUpdate upload = ResourceUpdate::Create( ResourceUpdate upload = ResourceUpdate::Create(
texture(), &bitmap_, source_rect, source_rect, dest_offset); texture(), &bitmap_, source_rect, source_rect, dest_offset);
...@@ -71,8 +70,7 @@ BitmapSkPictureContentLayerUpdater::CreateResource( ...@@ -71,8 +70,7 @@ BitmapSkPictureContentLayerUpdater::CreateResource(
void BitmapSkPictureContentLayerUpdater::PaintContentsRect( void BitmapSkPictureContentLayerUpdater::PaintContentsRect(
SkCanvas* canvas, SkCanvas* canvas,
gfx::Rect source_rect, gfx::Rect source_rect) {
RenderingStats* stats) {
// Translate the origin of content_rect to that of source_rect. // Translate the origin of content_rect to that of source_rect.
canvas->translate(content_rect().x() - source_rect.x(), canvas->translate(content_rect().x() - source_rect.x(),
content_rect().y() - source_rect.y()); content_rect().y() - source_rect.y());
......
...@@ -23,8 +23,7 @@ class BitmapSkPictureContentLayerUpdater : public SkPictureContentLayerUpdater { ...@@ -23,8 +23,7 @@ class BitmapSkPictureContentLayerUpdater : public SkPictureContentLayerUpdater {
virtual void Update(ResourceUpdateQueue* queue, virtual void Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) OVERRIDE;
RenderingStats* stats) OVERRIDE;
private: private:
SkBitmap bitmap_; SkBitmap bitmap_;
...@@ -41,8 +40,7 @@ class BitmapSkPictureContentLayerUpdater : public SkPictureContentLayerUpdater { ...@@ -41,8 +40,7 @@ class BitmapSkPictureContentLayerUpdater : public SkPictureContentLayerUpdater {
virtual scoped_ptr<LayerUpdater::Resource> CreateResource( virtual scoped_ptr<LayerUpdater::Resource> CreateResource(
PrioritizedResourceManager* manager) OVERRIDE; PrioritizedResourceManager* manager) OVERRIDE;
void PaintContentsRect(SkCanvas* canvas, void PaintContentsRect(SkCanvas* canvas,
gfx::Rect source_rect, gfx::Rect source_rect);
RenderingStats* stats);
private: private:
BitmapSkPictureContentLayerUpdater( BitmapSkPictureContentLayerUpdater(
......
...@@ -37,14 +37,12 @@ void CachingBitmapContentLayerUpdater::PrepareToUpdate( ...@@ -37,14 +37,12 @@ void CachingBitmapContentLayerUpdater::PrepareToUpdate(
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {
RenderingStats* stats) {
BitmapContentLayerUpdater::PrepareToUpdate(content_rect, BitmapContentLayerUpdater::PrepareToUpdate(content_rect,
tile_size, tile_size,
contents_width_scale, contents_width_scale,
contents_height_scale, contents_height_scale,
resulting_opaque_rect, resulting_opaque_rect);
stats);
const SkBitmap& new_bitmap = canvas_->getDevice()->accessBitmap(false); const SkBitmap& new_bitmap = canvas_->getDevice()->accessBitmap(false);
SkAutoLockPixels lock(new_bitmap); SkAutoLockPixels lock(new_bitmap);
......
...@@ -22,8 +22,7 @@ class CachingBitmapContentLayerUpdater : public BitmapContentLayerUpdater { ...@@ -22,8 +22,7 @@ class CachingBitmapContentLayerUpdater : public BitmapContentLayerUpdater {
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) OVERRIDE;
RenderingStats* stats) OVERRIDE;
bool pixels_did_change() const { bool pixels_did_change() const {
return pixels_did_change_; return pixels_did_change_;
......
...@@ -36,8 +36,7 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas, ...@@ -36,8 +36,7 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas,
gfx::Rect content_rect, gfx::Rect content_rect,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {
RenderingStats* stats) {
TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents"); TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents");
canvas->save(); canvas->save();
canvas->translate(SkFloatToScalar(-content_rect.x()), canvas->translate(SkFloatToScalar(-content_rect.x()),
......
...@@ -33,8 +33,7 @@ class CC_EXPORT ContentLayerUpdater : public LayerUpdater { ...@@ -33,8 +33,7 @@ class CC_EXPORT ContentLayerUpdater : public LayerUpdater {
gfx::Rect content_rect, gfx::Rect content_rect,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect);
RenderingStats* stats);
gfx::Rect content_rect() const { return content_rect_; } gfx::Rect content_rect() const { return content_rect_; }
RenderingStatsInstrumentation* rendering_stats_instrumentation_; RenderingStatsInstrumentation* rendering_stats_instrumentation_;
......
...@@ -17,8 +17,7 @@ ImageLayerUpdater::Resource::~Resource() {} ...@@ -17,8 +17,7 @@ ImageLayerUpdater::Resource::~Resource() {}
void ImageLayerUpdater::Resource::Update(ResourceUpdateQueue* queue, void ImageLayerUpdater::Resource::Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) {
RenderingStats*) {
updater_->UpdateTexture( updater_->UpdateTexture(
queue, texture(), source_rect, dest_offset, partial_update); queue, texture(), source_rect, dest_offset, partial_update);
} }
......
...@@ -24,8 +24,7 @@ class CC_EXPORT ImageLayerUpdater : public LayerUpdater { ...@@ -24,8 +24,7 @@ class CC_EXPORT ImageLayerUpdater : public LayerUpdater {
virtual void Update(ResourceUpdateQueue* queue, virtual void Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) OVERRIDE;
RenderingStats* stats) OVERRIDE;
private: private:
ImageLayerUpdater* updater_; ImageLayerUpdater* updater_;
......
...@@ -17,7 +17,6 @@ class PrioritizedResource; ...@@ -17,7 +17,6 @@ class PrioritizedResource;
class PrioritizedResourceManager; class PrioritizedResourceManager;
class ResourceUpdateQueue; class ResourceUpdateQueue;
class TextureManager; class TextureManager;
struct RenderingStats;
class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> { class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> {
public: public:
...@@ -32,8 +31,7 @@ class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> { ...@@ -32,8 +31,7 @@ class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> {
virtual void Update(ResourceUpdateQueue* queue, virtual void Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) = 0;
RenderingStats* stats) = 0;
protected: protected:
explicit Resource(scoped_ptr<PrioritizedResource> texture); explicit Resource(scoped_ptr<PrioritizedResource> texture);
...@@ -54,8 +52,7 @@ class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> { ...@@ -54,8 +52,7 @@ class CC_EXPORT LayerUpdater : public base::RefCounted<LayerUpdater> {
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {}
RenderingStats* stats) {}
virtual void ReduceMemoryUsage() {} virtual void ReduceMemoryUsage() {}
// Set true by the layer when it is known that the entire output is going to // Set true by the layer when it is known that the entire output is going to
......
...@@ -27,8 +27,7 @@ void SkPictureContentLayerUpdater::PrepareToUpdate( ...@@ -27,8 +27,7 @@ void SkPictureContentLayerUpdater::PrepareToUpdate(
gfx::Size, gfx::Size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {
RenderingStats* stats) {
SkCanvas* canvas = SkCanvas* canvas =
picture_.beginRecording(content_rect.width(), content_rect.height()); picture_.beginRecording(content_rect.width(), content_rect.height());
base::TimeTicks start_time = base::TimeTicks start_time =
...@@ -37,8 +36,7 @@ void SkPictureContentLayerUpdater::PrepareToUpdate( ...@@ -37,8 +36,7 @@ void SkPictureContentLayerUpdater::PrepareToUpdate(
content_rect, content_rect,
contents_width_scale, contents_width_scale,
contents_height_scale, contents_height_scale,
resulting_opaque_rect, resulting_opaque_rect);
stats);
base::TimeDelta duration = base::TimeDelta duration =
rendering_stats_instrumentation_->EndRecording(start_time); rendering_stats_instrumentation_->EndRecording(start_time);
rendering_stats_instrumentation_->AddRecord( rendering_stats_instrumentation_->AddRecord(
......
...@@ -34,8 +34,7 @@ class SkPictureContentLayerUpdater : public ContentLayerUpdater { ...@@ -34,8 +34,7 @@ class SkPictureContentLayerUpdater : public ContentLayerUpdater {
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) OVERRIDE;
RenderingStats* stats) OVERRIDE;
void DrawPicture(SkCanvas* canvas); void DrawPicture(SkCanvas* canvas);
bool layer_is_opaque() const { return layer_is_opaque_; } bool layer_is_opaque() const { return layer_is_opaque_; }
......
...@@ -18,8 +18,7 @@ FakeLayerUpdater::Resource::~Resource() {} ...@@ -18,8 +18,7 @@ FakeLayerUpdater::Resource::~Resource() {}
void FakeLayerUpdater::Resource::Update(ResourceUpdateQueue* queue, void FakeLayerUpdater::Resource::Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) {
RenderingStats* stats) {
const gfx::Rect kRect(0, 0, 10, 10); const gfx::Rect kRect(0, 0, 10, 10);
ResourceUpdate upload = ResourceUpdate::Create( ResourceUpdate upload = ResourceUpdate::Create(
texture(), &bitmap_, kRect, kRect, gfx::Vector2d()); texture(), &bitmap_, kRect, kRect, gfx::Vector2d());
...@@ -39,8 +38,7 @@ void FakeLayerUpdater::PrepareToUpdate(gfx::Rect content_rect, ...@@ -39,8 +38,7 @@ void FakeLayerUpdater::PrepareToUpdate(gfx::Rect content_rect,
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) {
RenderingStats* stats) {
prepare_count_++; prepare_count_++;
last_update_rect_ = content_rect; last_update_rect_ = content_rect;
if (!rect_to_invalidate_.IsEmpty()) { if (!rect_to_invalidate_.IsEmpty()) {
......
...@@ -32,8 +32,7 @@ class FakeLayerUpdater : public LayerUpdater { ...@@ -32,8 +32,7 @@ class FakeLayerUpdater : public LayerUpdater {
virtual void Update(ResourceUpdateQueue* queue, virtual void Update(ResourceUpdateQueue* queue,
gfx::Rect source_rect, gfx::Rect source_rect,
gfx::Vector2d dest_offset, gfx::Vector2d dest_offset,
bool partial_update, bool partial_update) OVERRIDE;
RenderingStats* stats) OVERRIDE;
private: private:
FakeLayerUpdater* layer_; FakeLayerUpdater* layer_;
...@@ -51,8 +50,7 @@ class FakeLayerUpdater : public LayerUpdater { ...@@ -51,8 +50,7 @@ class FakeLayerUpdater : public LayerUpdater {
gfx::Size tile_size, gfx::Size tile_size,
float contents_width_scale, float contents_width_scale,
float contents_height_scale, float contents_height_scale,
gfx::Rect* resulting_opaque_rect, gfx::Rect* resulting_opaque_rect) OVERRIDE;
RenderingStats* stats) OVERRIDE;
// Sets the rect to invalidate during the next call to PrepareToUpdate(). // Sets the rect to invalidate during the next call to PrepareToUpdate().
// After the next call to PrepareToUpdate() the rect is reset. // After the next call to PrepareToUpdate() the rect is reset.
void SetRectToInvalidate(gfx::Rect rect, FakeTiledLayer* layer); void SetRectToInvalidate(gfx::Rect rect, FakeTiledLayer* layer);
...@@ -153,6 +151,7 @@ class FakeTiledLayerWithScaledBounds : public FakeTiledLayer { ...@@ -153,6 +151,7 @@ class FakeTiledLayerWithScaledBounds : public FakeTiledLayer {
virtual ~FakeTiledLayerWithScaledBounds(); virtual ~FakeTiledLayerWithScaledBounds();
gfx::Size forced_content_bounds_; gfx::Size forced_content_bounds_;
private:
DISALLOW_COPY_AND_ASSIGN(FakeTiledLayerWithScaledBounds); DISALLOW_COPY_AND_ASSIGN(FakeTiledLayerWithScaledBounds);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment