зеркало из https://github.com/mozilla/gecko-dev.git
121 строка
2.6 KiB
C++
121 строка
2.6 KiB
C++
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "DrawingJob.h"
|
|
#include "JobScheduler.h"
|
|
#include "mozilla/gfx/2D.h"
|
|
|
|
namespace mozilla {
|
|
namespace gfx {
|
|
|
|
DrawingJobBuilder::DrawingJobBuilder()
|
|
{}
|
|
|
|
DrawingJobBuilder::~DrawingJobBuilder()
|
|
{
|
|
MOZ_ASSERT(!mDrawTarget);
|
|
}
|
|
|
|
void
|
|
DrawingJob::Clear()
|
|
{
|
|
mCommandBuffer = nullptr;
|
|
mCursor = 0;
|
|
}
|
|
|
|
void
|
|
DrawingJobBuilder::BeginDrawingJob(DrawTarget* aTarget, IntPoint aOffset,
|
|
SyncObject* aStart)
|
|
{
|
|
MOZ_ASSERT(mCommandOffsets.empty());
|
|
MOZ_ASSERT(aTarget);
|
|
mDrawTarget = aTarget;
|
|
mOffset = aOffset;
|
|
mStart = aStart;
|
|
}
|
|
|
|
DrawingJob*
|
|
DrawingJobBuilder::EndDrawingJob(CommandBuffer* aCmdBuffer,
|
|
SyncObject* aCompletion,
|
|
WorkerThread* aPinToWorker)
|
|
{
|
|
MOZ_ASSERT(mDrawTarget);
|
|
DrawingJob* task = new DrawingJob(mDrawTarget, mOffset, mStart, aCompletion, aPinToWorker);
|
|
task->mCommandBuffer = aCmdBuffer;
|
|
task->mCommandOffsets = Move(mCommandOffsets);
|
|
|
|
mDrawTarget = nullptr;
|
|
mOffset = IntPoint();
|
|
mStart = nullptr;
|
|
|
|
return task;
|
|
}
|
|
|
|
DrawingJob::DrawingJob(DrawTarget* aTarget, IntPoint aOffset,
|
|
SyncObject* aStart, SyncObject* aCompletion,
|
|
WorkerThread* aPinToWorker)
|
|
: Job(aStart, aCompletion, aPinToWorker)
|
|
, mCommandBuffer(nullptr)
|
|
, mCursor(0)
|
|
, mDrawTarget(aTarget)
|
|
, mOffset(aOffset)
|
|
{
|
|
mCommandOffsets.reserve(64);
|
|
}
|
|
|
|
JobStatus
|
|
DrawingJob::Run()
|
|
{
|
|
while (mCursor < mCommandOffsets.size()) {
|
|
|
|
const DrawingCommand* cmd = mCommandBuffer->GetDrawingCommand(mCommandOffsets[mCursor]);
|
|
|
|
if (!cmd) {
|
|
return JobStatus::Error;
|
|
}
|
|
|
|
cmd->ExecuteOnDT(mDrawTarget);
|
|
|
|
++mCursor;
|
|
}
|
|
|
|
return JobStatus::Complete;
|
|
}
|
|
|
|
DrawingJob::~DrawingJob()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
const DrawingCommand*
|
|
CommandBuffer::GetDrawingCommand(ptrdiff_t aId)
|
|
{
|
|
return static_cast<DrawingCommand*>(mStorage.GetStorage(aId));
|
|
}
|
|
|
|
CommandBuffer::~CommandBuffer()
|
|
{
|
|
mStorage.ForEach([](void* item){
|
|
static_cast<DrawingCommand*>(item)->~DrawingCommand();
|
|
});
|
|
mStorage.Clear();
|
|
}
|
|
|
|
void
|
|
CommandBufferBuilder::BeginCommandBuffer(size_t aBufferSize)
|
|
{
|
|
MOZ_ASSERT(!mCommands);
|
|
mCommands = new CommandBuffer(aBufferSize);
|
|
}
|
|
|
|
already_AddRefed<CommandBuffer>
|
|
CommandBufferBuilder::EndCommandBuffer()
|
|
{
|
|
return mCommands.forget();
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace
|