Exemplo n.º 1
0
bool
makeCurrent(trace::Call &call, glws::Drawable *drawable,
            glws::Drawable *readable, Context *context)
{
    Context *currentContext = currentContextPtr;
    glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL;
    glws::Drawable *currentReadable = currentContext ? currentContext->readable : NULL;

    if (drawable == currentDrawable &&
        readable == currentReadable &&
        context == currentContext) {
        return true;
    }

    if (currentContext) {
        glFlush();
        currentContext->needsFlush = false;
        if (!retrace::doubleBuffer) {
            frame_complete(call);
        }
    }

    flushQueries();

    beforeContextSwitch();

    bool success = glws::makeCurrent(drawable, readable, context ? context->wsContext : NULL);

    if (!success) {
        std::cerr << "error: failed to make current OpenGL context and drawable\n";
        exit(1);
    }

    if (context != currentContext) {
        if (context) {
            context->aquire();
        }
        currentContextPtr = context;
        if (currentContext) {
            currentContext->release();
        }
    }

    if (drawable && context) {
        context->drawable = drawable;
        context->readable = readable;

        if (!context->used) {
            initContext();
            context->used = true;
        }
    }

    afterContextSwitch();

    return true;
}
Exemplo n.º 2
0
void
frame_complete(trace::Call &call) {
    if (retrace::profilingWithBackends) {
        if (profilingBoundaries[QUERY_BOUNDARY_CALL] ||
            profilingBoundaries[QUERY_BOUNDARY_DRAWCALL])
        {
            if (isLastPass() && curMetricBackend) {
                // frame end indicator
                ProfilerCall::data callData = {true, 0, 0, ""};
                if (profilingBoundaries[QUERY_BOUNDARY_CALL]) {
                    profiler.addQuery(QUERY_BOUNDARY_CALL, 0, &callData);
                }
                if (profilingBoundaries[QUERY_BOUNDARY_DRAWCALL]) {
                    profiler.addQuery(QUERY_BOUNDARY_DRAWCALL, 0, &callData);
                }
            }
        }
        if (curMetricBackend) {
            curMetricBackend->endQuery(QUERY_BOUNDARY_FRAME);
        }
        if (profilingBoundaries[QUERY_BOUNDARY_FRAME]) {
            if (isLastPass() && curMetricBackend) {
                profiler.addQuery(QUERY_BOUNDARY_FRAME,
                        profilingBoundariesIndex[QUERY_BOUNDARY_FRAME]++);
            }
        }
    }
    else if (retrace::profiling) {
        /* Complete any remaining queries */
        flushQueries();

        /* Indicate end of current frame */
        retrace::profiler.addFrameEnd();
    }

    retrace::frameComplete(call);

    glretrace::Context *currentContext = glretrace::getCurrentContext();
    if (!currentContext) {
        return;
    }

    glws::Drawable *currentDrawable = currentContext->drawable;
    assert(currentDrawable);
    if (retrace::debug &&
        !currentDrawable->pbuffer &&
        !currentDrawable->visible) {
        retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
    }

    if (curMetricBackend) {
        curMetricBackend->beginQuery(QUERY_BOUNDARY_FRAME);
    }
}
Exemplo n.º 3
0
bool
makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
{
    glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL;

    if (drawable == currentDrawable && context == currentContext) {
        return true;
    }

    if (currentContext) {
        glFlush();
        if (!retrace::doubleBuffer) {
            frame_complete(call);
        }
    }

    flushQueries();

    bool success = glws::makeCurrent(drawable, context ? context->wsContext : NULL);

    if (!success) {
        std::cerr << "error: failed to make current OpenGL context and drawable\n";
        exit(1);
        return false;
    }

    if (currentContext) {
        currentContext->drawable = NULL;
    }

    if (drawable && context) {
        currentContext = context;
        currentContext->drawable = drawable;
        
        if (!context->used) {
            initContext();
            context->used = true;
        }
    } else {
        currentContext = NULL;
    }

    return true;
}
Exemplo n.º 4
0
void
frame_complete(trace::Call &call) {
    if (retrace::profiling) {
        /* Complete any remaining queries */
        flushQueries();

        /* Indicate end of current frame */
        retrace::profiler.addFrameEnd();
    }

    retrace::frameComplete(call);

    glretrace::Context *currentContext = glretrace::getCurrentContext();
    if (!currentContext) {
        return;
    }

    assert(currentContext->drawable);
    if (retrace::debug && !currentContext->drawable->visible) {
        retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
    }
}
Exemplo n.º 5
0
void
frame_complete(trace::Call &call) {
    if (retrace::profiling) {
        /* Complete any remaining queries */
        flushQueries();

        /* GPU time drifts due to being relative times, not absolute and can be
         * affected by the gpu switch between processes.
         *
         * To attempt to compensate we resynchronise on frame end however there is
         * still noticeable drift within a single frame which we do not account for.
         */
        if (retrace::profilingCpuTimes || retrace::profilingGpuTimes) {
            int64_t cpuTime, gpuTime, error;

            getCurrentTimes(cpuTime, gpuTime);
            cpuTime = cpuTime - retrace::profiler.getBaseCpuTime();
            gpuTime = gpuTime - retrace::profiler.getBaseGpuTime();
            error   = gpuTime - cpuTime * (1.0E9 / os::timeFrequency);

            retrace::profiler.setBaseGpuTime(retrace::profiler.getBaseGpuTime() + error);
        }

        /* Indicate end of current frame */
        retrace::profiler.addFrameEnd();
    }

    retrace::frameComplete(call);

    if (!currentDrawable) {
        return;
    }

    if (retrace::debug && !currentDrawable->visible) {
        retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
    }
}