swr: switch to using SwrGetInterface api table

Use the SWR rasterizer API through the table returned from
SwrGetInterface rather than referencing the functions directly.
This will allow us to move to a model of having the driver dynamically
load the appropriate swr architecture library.

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
Tim Rowley 2017-06-29 14:03:43 -05:00
parent 27c5568de3
commit 50cd222116
10 changed files with 72 additions and 65 deletions

View File

@ -78,9 +78,9 @@ swr_clear(struct pipe_context *pipe,
for (unsigned i = 0; i < layers; ++i) {
swr_update_draw_context(ctx);
SwrClearRenderTarget(ctx->swrContext, clearMask, i,
color->f, depth, stencil,
clear_rect);
ctx->api.pfnSwrClearRenderTarget(ctx->swrContext, clearMask, i,
color->f, depth, stencil,
clear_rect);
// Mask out the attachments that are out of layers.
if (fb->zsbuf &&

View File

@ -311,8 +311,8 @@ swr_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info)
}
if (ctx->active_queries) {
SwrEnableStatsFE(ctx->swrContext, FALSE);
SwrEnableStatsBE(ctx->swrContext, FALSE);
ctx->api.pfnSwrEnableStatsFE(ctx->swrContext, FALSE);
ctx->api.pfnSwrEnableStatsBE(ctx->swrContext, FALSE);
}
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vertex_buffer);
@ -349,8 +349,8 @@ swr_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info)
util_blitter_blit(ctx->blitter, &info);
if (ctx->active_queries) {
SwrEnableStatsFE(ctx->swrContext, TRUE);
SwrEnableStatsBE(ctx->swrContext, TRUE);
ctx->api.pfnSwrEnableStatsFE(ctx->swrContext, TRUE);
ctx->api.pfnSwrEnableStatsBE(ctx->swrContext, TRUE);
}
}
@ -383,10 +383,10 @@ swr_destroy(struct pipe_context *pipe)
/* Idle core after destroying buffer resources, but before deleting
* context. Destroying resources has potentially called StoreTiles.*/
SwrWaitForIdle(ctx->swrContext);
ctx->api.pfnSwrWaitForIdle(ctx->swrContext);
if (ctx->swrContext)
SwrDestroyContext(ctx->swrContext);
ctx->api.pfnSwrDestroyContext(ctx->swrContext);
delete ctx->blendJIT;
@ -467,6 +467,9 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
AlignedMalloc(sizeof(struct swr_context), KNOB_SIMD_BYTES);
memset(ctx, 0, sizeof(struct swr_context));
SwrGetInterface(ctx->api);
ctx->swrDC.pAPI = &ctx->api;
ctx->blendJIT =
new std::unordered_map<BLEND_COMPILE_STATE, PFN_BLEND_JIT_FUNC>;
@ -478,9 +481,9 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
createInfo.pfnClearTile = swr_StoreHotTileClear;
createInfo.pfnUpdateStats = swr_UpdateStats;
createInfo.pfnUpdateStatsFE = swr_UpdateStatsFE;
ctx->swrContext = SwrCreateContext(&createInfo);
ctx->swrContext = ctx->api.pfnSwrCreateContext(&createInfo);
SwrInit();
ctx->api.pfnSwrInit();
if (ctx->swrContext == NULL)
goto fail;

View File

@ -102,6 +102,7 @@ struct swr_draw_context {
SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS];
struct swr_query_result *pStats; // @llvm_struct
SWR_INTERFACE *pAPI; // @llvm_struct - Needed for the swr_memory callbacks
};
/* gen_llvm_types FINI */
@ -169,6 +170,8 @@ struct swr_context {
struct swr_draw_context swrDC;
unsigned dirty; /**< Mask of SWR_NEW_x flags */
SWR_INTERFACE api;
};
static INLINE struct swr_context *
@ -182,7 +185,7 @@ swr_update_draw_context(struct swr_context *ctx,
struct swr_query_result *pqr = nullptr)
{
swr_draw_context *pDC =
(swr_draw_context *)SwrGetPrivateContextState(ctx->swrContext);
(swr_draw_context *)ctx->api.pfnSwrGetPrivateContextState(ctx->swrContext);
if (pqr)
ctx->swrDC.pStats = pqr;
memcpy(pDC, &ctx->swrDC, sizeof(swr_draw_context));

View File

@ -100,7 +100,7 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
assert(ctx->vs->soFunc[info->mode] && "Error: SoShader = NULL");
}
SwrSetSoFunc(ctx->swrContext, ctx->vs->soFunc[info->mode], 0);
ctx->api.pfnSwrSetSoFunc(ctx->swrContext, ctx->vs->soFunc[info->mode], 0);
}
struct swr_vertex_element_state *velems = ctx->velems;
@ -123,7 +123,7 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
velems->map.insert(std::make_pair(key, velems->fsFunc));
}
SwrSetFetchFunc(ctx->swrContext, velems->fsFunc);
ctx->api.pfnSwrSetFetchFunc(ctx->swrContext, velems->fsFunc);
/* Set up frontend state
* XXX setup provokingVertex & topologyProvokingVertex */
@ -171,23 +171,23 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
}
feState.bEnableCutIndex = info->primitive_restart;
SwrSetFrontendState(ctx->swrContext, &feState);
ctx->api.pfnSwrSetFrontendState(ctx->swrContext, &feState);
if (info->index_size)
SwrDrawIndexedInstanced(ctx->swrContext,
swr_convert_prim_topology(info->mode),
info->count,
info->instance_count,
info->start,
info->index_bias,
info->start_instance);
ctx->api.pfnSwrDrawIndexedInstanced(ctx->swrContext,
swr_convert_prim_topology(info->mode),
info->count,
info->instance_count,
info->start,
info->index_bias,
info->start_instance);
else
SwrDrawInstanced(ctx->swrContext,
swr_convert_prim_topology(info->mode),
info->count,
info->instance_count,
info->start,
info->start_instance);
ctx->api.pfnSwrDrawInstanced(ctx->swrContext,
swr_convert_prim_topology(info->mode),
info->count,
info->instance_count,
info->start,
info->start_instance);
}
@ -235,9 +235,9 @@ swr_invalidate_render_target(struct pipe_context *pipe,
swr_update_draw_context(ctx);
SWR_RECT full_rect =
{0, 0, (int32_t)width, (int32_t)height};
SwrInvalidateTiles(ctx->swrContext,
1 << attachment,
full_rect);
ctx->api.pfnSwrInvalidateTiles(ctx->swrContext,
1 << attachment,
full_rect);
}
@ -260,10 +260,10 @@ swr_store_render_target(struct pipe_context *pipe,
{0, 0,
(int32_t)u_minify(renderTarget->width, renderTarget->lod),
(int32_t)u_minify(renderTarget->height, renderTarget->lod)};
SwrStoreTiles(ctx->swrContext,
1 << attachment,
post_tile_state,
full_rect);
ctx->api.pfnSwrStoreTiles(ctx->swrContext,
1 << attachment,
post_tile_state,
full_rect);
}
}

View File

@ -59,7 +59,7 @@ swr_fence_submit(struct swr_context *ctx, struct pipe_fence_handle *fh)
fence->write++;
fence->pending = TRUE;
SwrSync(ctx->swrContext, swr_fence_cb, (uint64_t)fence, fence->write, 0);
ctx->api.pfnSwrSync(ctx->swrContext, swr_fence_cb, (uint64_t)fence, fence->write, 0);
}
/*

View File

@ -34,7 +34,7 @@ swr_LoadHotTile(HANDLE hPrivateContext,
swr_draw_context *pDC = (swr_draw_context*)hPrivateContext;
SWR_SURFACE_STATE *pSrcSurface = &pDC->renderTargets[renderTargetIndex];
SwrLoadHotTile(pSrcSurface, dstFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pDstHotTile);
pDC->pAPI->pfnSwrLoadHotTile(pSrcSurface, dstFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pDstHotTile);
}
INLINE void
@ -48,7 +48,7 @@ swr_StoreHotTile(HANDLE hPrivateContext,
swr_draw_context *pDC = (swr_draw_context*)hPrivateContext;
SWR_SURFACE_STATE *pDstSurface = &pDC->renderTargets[renderTargetIndex];
SwrStoreHotTileToSurface(pDstSurface, srcFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pSrcHotTile);
pDC->pAPI->pfnSwrStoreHotTileToSurface(pDstSurface, srcFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pSrcHotTile);
}
INLINE void
@ -63,5 +63,5 @@ swr_StoreHotTileClear(HANDLE hPrivateContext,
swr_draw_context *pDC = (swr_draw_context*)hPrivateContext;
SWR_SURFACE_STATE *pDstSurface = &pDC->renderTargets[renderTargetIndex];
SwrStoreHotTileClear(pDstSurface, renderTargetIndex, x, y, renderTargetArrayIndex, pClearColor);
pDC->pAPI->pfnSwrStoreHotTileClear(pDstSurface, renderTargetIndex, x, y, renderTargetArrayIndex, pClearColor);
}

View File

@ -180,8 +180,8 @@ swr_begin_query(struct pipe_context *pipe, struct pipe_query *q)
/* Only change stat collection if there are no active queries */
if (ctx->active_queries == 0) {
SwrEnableStatsFE(ctx->swrContext, TRUE);
SwrEnableStatsBE(ctx->swrContext, TRUE);
ctx->api.pfnSwrEnableStatsFE(ctx->swrContext, TRUE);
ctx->api.pfnSwrEnableStatsBE(ctx->swrContext, TRUE);
}
ctx->active_queries++;
break;
@ -217,8 +217,8 @@ swr_end_query(struct pipe_context *pipe, struct pipe_query *q)
/* Only change stat collection if there are no active queries */
ctx->active_queries--;
if (ctx->active_queries == 0) {
SwrEnableStatsFE(ctx->swrContext, FALSE);
SwrEnableStatsBE(ctx->swrContext, FALSE);
ctx->api.pfnSwrEnableStatsFE(ctx->swrContext, FALSE);
ctx->api.pfnSwrEnableStatsBE(ctx->swrContext, FALSE);
}
break;

View File

@ -41,7 +41,7 @@ swr_copy_to_scratch_space(struct swr_context *ctx,
if (size >= 2048) { /* XXX TODO create KNOB_ for this */
/* Use per draw SwrAllocDrawContextMemory for larger copies */
ptr = SwrAllocDrawContextMemory(ctx->swrContext, size, 4);
ptr = ctx->api.pfnSwrAllocDrawContextMemory(ctx->swrContext, size, 4);
} else {
/* Allocate enough so that MAX_DRAWS_IN_FLIGHT sets fit. */
unsigned int max_size_in_flight = size * KNOB_MAX_DRAWS_IN_FLIGHT;

View File

@ -1016,11 +1016,12 @@ swr_flush_frontbuffer(struct pipe_screen *p_screen,
struct sw_winsys *winsys = screen->winsys;
struct swr_resource *spr = swr_resource(resource);
struct pipe_context *pipe = screen->pipe;
struct swr_context *ctx = swr_context(pipe);
if (pipe) {
swr_fence_finish(p_screen, NULL, screen->flush_fence, 0);
swr_resource_unused(resource);
SwrEndFrame(swr_context(pipe)->swrContext);
ctx->api.pfnSwrEndFrame(ctx->swrContext);
}
/* Multisample resolved into resolve_target at flush with store_resource */

View File

@ -1165,12 +1165,12 @@ swr_update_derived(struct pipe_context *pipe,
rastState->cullDistanceMask =
ctx->vs->info.base.culldist_writemask << ctx->vs->info.base.num_written_clipdistance;
SwrSetRastState(ctx->swrContext, rastState);
ctx->api.pfnSwrSetRastState(ctx->swrContext, rastState);
}
/* Scissor */
if (ctx->dirty & SWR_NEW_SCISSOR) {
SwrSetScissorRects(ctx->swrContext, 1, &ctx->swr_scissor);
ctx->api.pfnSwrSetScissorRects(ctx->swrContext, 1, &ctx->swr_scissor);
}
/* Viewport */
@ -1210,7 +1210,7 @@ swr_update_derived(struct pipe_context *pipe,
vp->width = std::min(vp->width, (float)fb->width - vp->x);
vp->height = std::min(vp->height, (float)fb->height - vp->y);
SwrSetViewports(ctx->swrContext, 1, vp, vpm);
ctx->api.pfnSwrSetViewports(ctx->swrContext, 1, vp, vpm);
}
/* Set vertex & index buffers
@ -1285,7 +1285,7 @@ swr_update_derived(struct pipe_context *pipe,
swrVertexBuffers[i].partialInboundsSize = partial_inbounds;
}
SwrSetVertexBuffers(
ctx->api.pfnSwrSetVertexBuffers(
ctx->swrContext, ctx->num_vertex_buffers, swrVertexBuffers);
/* index buffer, if required (info passed in by swr_draw_vbo) */
@ -1324,7 +1324,7 @@ swr_update_derived(struct pipe_context *pipe,
swrIndexBuffer.pIndices = p_data;
swrIndexBuffer.size = size;
SwrSetIndexBuffer(ctx->swrContext, &swrIndexBuffer);
ctx->api.pfnSwrSetIndexBuffer(ctx->swrContext, &swrIndexBuffer);
}
struct swr_vertex_element_state *velems = ctx->velems;
@ -1349,7 +1349,7 @@ swr_update_derived(struct pipe_context *pipe,
} else {
func = swr_compile_gs(ctx, key);
}
SwrSetGsFunc(ctx->swrContext, func);
ctx->api.pfnSwrSetGsFunc(ctx->swrContext, func);
/* JIT sampler state */
if (ctx->dirty & SWR_NEW_SAMPLER) {
@ -1367,11 +1367,11 @@ swr_update_derived(struct pipe_context *pipe,
ctx->swrDC.texturesGS);
}
SwrSetGsState(ctx->swrContext, &ctx->gs->gsState);
ctx->api.pfnSwrSetGsState(ctx->swrContext, &ctx->gs->gsState);
} else {
SWR_GS_STATE state = { 0 };
SwrSetGsState(ctx->swrContext, &state);
SwrSetGsFunc(ctx->swrContext, NULL);
ctx->api.pfnSwrSetGsState(ctx->swrContext, &state);
ctx->api.pfnSwrSetGsFunc(ctx->swrContext, NULL);
}
}
@ -1390,7 +1390,7 @@ swr_update_derived(struct pipe_context *pipe,
} else {
func = swr_compile_vs(ctx, key);
}
SwrSetVertexFunc(ctx->swrContext, func);
ctx->api.pfnSwrSetVertexFunc(ctx->swrContext, func);
/* JIT sampler state */
if (ctx->dirty & SWR_NEW_SAMPLER) {
@ -1478,7 +1478,7 @@ swr_update_derived(struct pipe_context *pipe,
psState.barycentricsMask = barycentricsMask;
psState.usesUAV = false; // XXX
psState.forceEarlyZ = false;
SwrSetPixelShaderState(ctx->swrContext, &psState);
ctx->api.pfnSwrSetPixelShaderState(ctx->swrContext, &psState);
/* JIT sampler state */
if (ctx->dirty & (SWR_NEW_SAMPLER |
@ -1567,12 +1567,12 @@ swr_update_derived(struct pipe_context *pipe,
depthStencilState.depthTestEnable = depth->enabled;
depthStencilState.depthTestFunc = swr_convert_depth_func(depth->func);
depthStencilState.depthWriteEnable = depth->writemask;
SwrSetDepthStencilState(ctx->swrContext, &depthStencilState);
ctx->api.pfnSwrSetDepthStencilState(ctx->swrContext, &depthStencilState);
depthBoundsState.depthBoundsTestEnable = depth->bounds_test;
depthBoundsState.depthBoundsTestMinValue = depth->bounds_min;
depthBoundsState.depthBoundsTestMaxValue = depth->bounds_max;
SwrSetDepthBoundsState(ctx->swrContext, &depthBoundsState);
ctx->api.pfnSwrSetDepthBoundsState(ctx->swrContext, &depthBoundsState);
}
/* Blend State */
@ -1601,7 +1601,7 @@ swr_update_derived(struct pipe_context *pipe,
blendState.renderTarget[0].writeDisableGreen = 1;
blendState.renderTarget[0].writeDisableBlue = 1;
blendState.renderTarget[0].writeDisableAlpha = 1;
SwrSetBlendFunc(ctx->swrContext, 0, NULL);
ctx->api.pfnSwrSetBlendFunc(ctx->swrContext, 0, NULL);
}
else
for (int target = 0;
@ -1633,7 +1633,7 @@ swr_update_derived(struct pipe_context *pipe,
if (compileState.blendState.blendEnable == false &&
compileState.blendState.logicOpEnable == false &&
ctx->depth_stencil->alpha.enabled == 0) {
SwrSetBlendFunc(ctx->swrContext, target, NULL);
ctx->api.pfnSwrSetBlendFunc(ctx->swrContext, target, NULL);
continue;
}
@ -1669,10 +1669,10 @@ swr_update_derived(struct pipe_context *pipe,
ctx->blendJIT->insert(std::make_pair(compileState, func));
}
SwrSetBlendFunc(ctx->swrContext, target, func);
ctx->api.pfnSwrSetBlendFunc(ctx->swrContext, target, func);
}
SwrSetBlendState(ctx->swrContext, &blendState);
ctx->api.pfnSwrSetBlendState(ctx->swrContext, &blendState);
}
if (ctx->dirty & SWR_NEW_STIPPLE) {
@ -1682,7 +1682,7 @@ swr_update_derived(struct pipe_context *pipe,
if (ctx->dirty & (SWR_NEW_VS | SWR_NEW_SO | SWR_NEW_RASTERIZER)) {
ctx->vs->soState.rasterizerDisable =
ctx->rasterizer->rasterizer_discard;
SwrSetSoState(ctx->swrContext, &ctx->vs->soState);
ctx->api.pfnSwrSetSoState(ctx->swrContext, &ctx->vs->soState);
pipe_stream_output_info *stream_output = &ctx->vs->pipe.stream_output;
@ -1698,7 +1698,7 @@ swr_update_derived(struct pipe_context *pipe,
buffer.pitch = stream_output->stride[i];
buffer.streamOffset = 0;
SwrSetSoBuffers(ctx->swrContext, &buffer, i);
ctx->api.pfnSwrSetSoBuffers(ctx->swrContext, &buffer, i);
}
}
@ -1750,7 +1750,7 @@ swr_update_derived(struct pipe_context *pipe,
backendState.readViewportArrayIndex = pLastFE->writes_viewport_index;
backendState.vertexAttribOffset = VERTEX_ATTRIB_START_SLOT; // TODO: optimize
SwrSetBackendState(ctx->swrContext, &backendState);
ctx->api.pfnSwrSetBackendState(ctx->swrContext, &backendState);
/* Ensure that any in-progress attachment change StoreTiles finish */
if (swr_is_fence_pending(screen->flush_fence))