aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/remote_demo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/remote_demo.cpp')
-rw-r--r--tools/remote_demo.cpp147
1 files changed, 85 insertions, 62 deletions
diff --git a/tools/remote_demo.cpp b/tools/remote_demo.cpp
index 8549c63e75..1e78888e0c 100644
--- a/tools/remote_demo.cpp
+++ b/tools/remote_demo.cpp
@@ -37,6 +37,10 @@
static const size_t kPageSize = 4096;
+static bool gUseGpu = true;
+static bool gPurgeFontCaches = true;
+static bool gUseProcess = true;
+
class Op {
public:
explicit Op(const SkScalerContextRec& rec) : descriptor{rec} {}
@@ -115,7 +119,7 @@ private:
}
const int fReadFd,
- fWriteFd;
+ fWriteFd;
uint8_t fBuffer[1024 * kPageSize];
};
@@ -131,20 +135,26 @@ static void final_draw(std::string outFilename,
auto s = SkSurface::MakeRasterN32Premul(r.width(), r.height());
auto c = s->getCanvas();
-
auto picUnderTest = SkPicture::MakeFromData(picData, picSize, procs);
- auto start = std::chrono::high_resolution_clock::now();
- for (int i = 0; i < 40; i++) {
+ std::chrono::duration<double> total_seconds{0.0};
+ for (int i = 0; i < 20; i++) {
+ if (gPurgeFontCaches) {
+ SkGraphics::PurgeFontCache();
+ }
+ auto start = std::chrono::high_resolution_clock::now();
c->drawPicture(picUnderTest);
- }
+ auto end = std::chrono::high_resolution_clock::now();
+ std::chrono::duration<double> elapsed_seconds = end-start;
+ total_seconds += elapsed_seconds;
- auto end = std::chrono::high_resolution_clock::now();
-
- std::chrono::duration<double> elapsed_seconds = end-start;
+ }
- std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
+ std::cout << "useProcess: " << gUseProcess
+ << " useGPU: " << gUseGpu
+ << " purgeCache: " << gPurgeFontCaches << std::endl;
+ std::cerr << "elapsed time: " << total_seconds.count() << "s\n";
auto i = s->makeImageSnapshot();
auto data = i->encodeToData();
@@ -155,29 +165,32 @@ static void final_draw(std::string outFilename,
static void gpu(int readFd, int writeFd) {
size_t picSize = 0;
- read(readFd, &picSize, sizeof(picSize));
-
- static constexpr size_t kBufferSize = 10 * 1024 * kPageSize;
- std::unique_ptr<uint8_t[]> picBuffer{new uint8_t[kBufferSize]};
-
- size_t readSoFar = 0;
- while (readSoFar < picSize) {
- ssize_t readSize;
- if((readSize = read(readFd, &picBuffer[readSoFar], kBufferSize - readSoFar)) <= 0) {
- if (readSize == 0) return;
- err(1, "gpu pic read error %d", errno);
+ ssize_t r = read(readFd, &picSize, sizeof(picSize));
+ if (r > 0) {
+
+ static constexpr size_t kBufferSize = 10 * 1024 * kPageSize;
+ std::unique_ptr<uint8_t[]> picBuffer{new uint8_t[kBufferSize]};
+
+ size_t readSoFar = 0;
+ while (readSoFar < picSize) {
+ ssize_t readSize;
+ if ((readSize = read(readFd, &picBuffer[readSoFar], kBufferSize - readSoFar)) <= 0) {
+ if (readSize == 0) return;
+ err(1, "gpu pic read error %d", errno);
+ }
+ readSoFar += readSize;
}
- readSoFar += readSize;
- }
- SkRemoteGlyphCacheGPU rc{
- skstd::make_unique<RemoteScalerContextFIFO>(readFd, writeFd)
- };
+ SkRemoteGlyphCacheGPU rc{
+ skstd::make_unique<RemoteScalerContextFIFO>(readFd, writeFd)
+ };
- SkDeserialProcs procs;
- rc.prepareDeserializeProcs(&procs);
+ SkDeserialProcs procs;
+ rc.prepareDeserializeProcs(&procs);
- final_draw("test.png", &procs, picBuffer.get(), picSize);
+ final_draw("test.png", &procs, picBuffer.get(), picSize);
+
+ }
close(writeFd);
close(readFd);
@@ -190,24 +203,25 @@ static int renderer(
std::string fileName{prefix + skpName + ".skp"};
auto skp = SkData::MakeFromFileName(fileName.c_str());
- auto pic = SkPicture::MakeFromData(skp.get());
-
- bool toGpu = true;
+ std::cout << "skp stream is " << skp->size() << " bytes long " << std::endl;
SkRemoteGlyphCacheRenderer rc;
SkSerialProcs procs;
- if (toGpu) {
+ sk_sp<SkData> stream;
+ if (gUseGpu) {
+ auto pic = SkPicture::MakeFromData(skp.get());
rc.prepareSerializeProcs(&procs);
+ stream = pic->serialize(&procs);
+ } else {
+ stream = skp;
}
- auto stream = pic->serialize(&procs);
-
- std::cerr << "stream is " << stream->size() << " bytes long" << std::endl;
+ std::cout << "stream is " << stream->size() << " bytes long" << std::endl;
size_t picSize = stream->size();
uint8_t* picBuffer = (uint8_t*) stream->data();
- if (!toGpu) {
+ if (!gUseGpu) {
final_draw("test-direct.png", nullptr, picBuffer, picSize);
close(writeFd);
close(readFd);
@@ -221,7 +235,7 @@ static int renderer(
ssize_t writeSize = write(writeFd, &picBuffer[writeSoFar], picSize - writeSoFar);
if (writeSize <= 0) {
if (writeSize == 0) {
- std::cerr << "Exit" << std::endl;
+ std::cout << "Exit" << std::endl;
return 1;
}
perror("Can't write picture from render to GPU ");
@@ -229,7 +243,7 @@ static int renderer(
}
writeSoFar += writeSize;
}
- std::cerr << "Waiting for scaler context ops." << std::endl;
+ std::cout << "Waiting for scaler context ops." << std::endl;
static constexpr size_t kBufferSize = 1024 * kPageSize;
std::unique_ptr<uint8_t[]> glyphBuffer{new uint8_t[kBufferSize]};
@@ -237,7 +251,7 @@ static int renderer(
Op* op = (Op*)glyphBuffer.get();
while (true) {
ssize_t size = read(readFd, glyphBuffer.get(), sizeof(*op));
- if (size <= 0) { std::cerr << "Exit op loop" << std::endl; break;}
+ if (size <= 0) { std::cout << "Exit op loop" << std::endl; break;}
size_t writeSize = sizeof(*op);
auto sc = rc.generateScalerContext(op->descriptor, op->typeface_id);
@@ -274,7 +288,7 @@ static int renderer(
close(readFd);
close(writeFd);
- std::cerr << "Returning from render" << std::endl;
+ std::cout << "Returning from render" << std::endl;
return 0;
}
@@ -297,38 +311,47 @@ static void start_render(std::string& skpName, int render_to_gpu[2], int gpu_to_
int main(int argc, char** argv) {
std::string skpName = argc > 1 ? std::string{argv[1]} : std::string{"desk_nytimes"};
+ int mode = argc > 2 ? atoi(argv[2]) : -1;
printf("skp: %s\n", skpName.c_str());
int render_to_gpu[2],
gpu_to_render[2];
- int r = pipe(render_to_gpu);
- if (r < 0) {
- perror("Can't write picture from render to GPU ");
- return 1;
- }
- r = pipe(gpu_to_render);
- if (r < 0) {
- perror("Can't write picture from render to GPU ");
- return 1;
- }
+ for (int m = 0; m < 8; m++) {
+ int r = pipe(render_to_gpu);
+ if (r < 0) {
+ perror("Can't write picture from render to GPU ");
+ return 1;
+ }
+ r = pipe(gpu_to_render);
+ if (r < 0) {
+ perror("Can't write picture from render to GPU ");
+ return 1;
+ }
- bool useProcess = true;
+ gPurgeFontCaches = (m & 4) == 4;
+ gUseGpu = (m & 2) == 2;
+ gUseProcess = (m & 1) == 1;
- if (useProcess) {
- pid_t child = fork();
- SkGraphics::Init();
+ if (mode >= 0 && mode < 8 && mode != m) {
+ continue;
+ }
- if (child == 0) {
- start_gpu(render_to_gpu, gpu_to_render);
+ if (gUseProcess) {
+ pid_t child = fork();
+ SkGraphics::Init();
+
+ if (child == 0) {
+ start_gpu(render_to_gpu, gpu_to_render);
+ } else {
+ start_render(skpName, render_to_gpu, gpu_to_render);
+ waitpid(child, nullptr, 0);
+ }
} else {
- start_render(skpName, render_to_gpu, gpu_to_render);
- waitpid(child, nullptr, 0);
+ SkGraphics::Init();
+ std::thread(gpu, render_to_gpu[kRead], gpu_to_render[kWrite]).detach();
+ renderer(skpName, gpu_to_render[kRead], render_to_gpu[kWrite]);
}
- } else {
- SkGraphics::Init();
- std::thread(gpu, render_to_gpu[kRead], gpu_to_render[kWrite]).detach();
- renderer(skpName, gpu_to_render[kRead], render_to_gpu[kWrite]);
}
return 0;