gl::Error RendererD3D::applyTextures(GLImplFactory *implFactory, const gl::ContextState &data) { FramebufferTextureArray framebufferTextures; size_t framebufferSerialCount = getBoundFramebufferTextures(data, &framebufferTextures); ANGLE_TRY(applyTextures(implFactory, data, gl::SAMPLER_VERTEX, framebufferTextures, framebufferSerialCount)); ANGLE_TRY(applyTextures(implFactory, data, gl::SAMPLER_PIXEL, framebufferTextures, framebufferSerialCount)); return gl::NoError(); }
gl::Error RendererD3D::applyTextures(const gl::Data &data) { FramebufferTextureArray framebufferTextures; size_t framebufferSerialCount = getBoundFramebufferTextures(data, &framebufferTextures); gl::Error error = applyTextures(data, gl::SAMPLER_VERTEX, framebufferTextures, framebufferSerialCount); if (error.isError()) { return error; } error = applyTextures(data, gl::SAMPLER_PIXEL, framebufferTextures, framebufferSerialCount); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }
void Tp2Application::compileQuadGridList(FLOAT size, INT rowCount, INT columnCount, BOOL isOutsideNormal) { mQuadGridListId = glGenLists(1); glNewList(mQuadGridListId, GL_COMPILE); { applyTextures(); drawQuadGrid(size, rowCount, columnCount, isOutsideNormal); } glEndList(); }
void Renderer::apply() { #ifdef DEBUG /*if (!wasReset){ CHG_WARNING("Warning: reset() not called before apply()"); } wasReset = false;*/ #endif if (selectedShader != DONTCARE) { changeShader(selectedShader); applyConstants(); } applyTextures(); applyImageBuffers(); applyObjectBuffers(); applyRWStructuredBuffers(); applySamplerStates(); changeVertexFormat(selectedVertexFormat); changeVertexBuffer(0, numVertexBufferUsed, selectedVertexBuffers, selectedOffsets); if (selectedIndexBuffer != DONTCARE) changeIndexBuffer(selectedIndexBuffer); if (selectedDepthState != DONTCARE) { changeDepthState(selectedDepthState, selectedStencilRef); } if (selectedBlendState != DONTCARE) { changeBlendState(selectedBlendState, selectedSampleMask); } if (selectedRasterizerState != DONTCARE) changeRasterizerState(selectedRasterizerState); }
void Renderer::apply(){ #ifdef DEBUG if (!wasReset){ outputDebugString("Warning: reset() not called before apply()"); } wasReset = false; #endif if (selectedShader != DONTCARE){ changeShader(selectedShader); applyConstants(); } /* for (uint i = 0; i < nImageUnits; i++){ if (selectedTextures[i] != DONTCARE) changeTexture(i, selectedTextures[i]); }*/ applyTextures(); /* for (uint i = 0; i < MAX_SAMPLERSTATE; i++){ if (selectedSamplerStates[i] != DONTCARE) changeSamplerState(i, selectedSamplerStates[i]); }*/ applySamplerStates(); changeVertexFormat(selectedVertexFormat); for (uint i = 0; i < MAX_VERTEXSTREAM; i++){ if (selectedVertexBuffers[i] != DONTCARE){ changeVertexBuffer(i, selectedVertexBuffers[i], selectedOffsets[i]); } } if (selectedIndexBuffer != DONTCARE) changeIndexBuffer(selectedIndexBuffer); if (selectedDepthState != DONTCARE){ changeDepthState(selectedDepthState, selectedStencilRef); } if (selectedBlendState != DONTCARE){ changeBlendState(selectedBlendState, selectedSampleMask); } if (selectedRasterizerState != DONTCARE) changeRasterizerState(selectedRasterizerState); // reset(); }
gl::Error RendererD3D::drawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances, const gl::RangeUI &indexRange) { if (data.state->isPrimitiveRestartEnabled()) { UNIMPLEMENTED(); return gl::Error(GL_INVALID_OPERATION, "Primitive restart not implemented"); } gl::Program *program = data.state->getProgram(); ASSERT(program != NULL); program->updateSamplerMapping(); gl::Error error = generateSwizzles(data); if (error.isError()) { return error; } if (!applyPrimitiveType(mode, count, program->usesPointSize())) { return gl::Error(GL_NO_ERROR); } error = applyRenderTarget(data, mode, false); if (error.isError()) { return error; } error = applyState(data, mode); if (error.isError()) { return error; } gl::VertexArray *vao = data.state->getVertexArray(); TranslatedIndexData indexInfo; indexInfo.indexRange = indexRange; SourceIndexData sourceIndexInfo; error = applyIndexBuffer(indices, vao->getElementArrayBuffer().get(), count, mode, type, &indexInfo, &sourceIndexInfo); if (error.isError()) { return error; } applyTransformFeedbackBuffers(*data.state); // Transform feedback is not allowed for DrawElements, this error should have been caught at the API validation // layer. ASSERT(!data.state->isTransformFeedbackActiveUnpaused()); GLsizei vertexCount = indexInfo.indexRange.length() + 1; error = applyVertexBuffer(*data.state, mode, indexInfo.indexRange.start, vertexCount, instances, &sourceIndexInfo); if (error.isError()) { return error; } error = applyShaders(data); if (error.isError()) { return error; } error = applyTextures(data); if (error.isError()) { return error; } error = program->applyUniformBuffers(data); if (error.isError()) { return error; } if (!skipDraw(data, mode)) { error = drawElements(mode, count, type, indices, vao->getElementArrayBuffer().get(), indexInfo, instances, program->usesPointSize()); if (error.isError()) { return error; } } return gl::Error(GL_NO_ERROR); }
gl::Error RendererD3D::drawArrays(const gl::Data &data, GLenum mode, GLint first, GLsizei count, GLsizei instances) { gl::Program *program = data.state->getProgram(); ASSERT(program != NULL); program->updateSamplerMapping(); gl::Error error = generateSwizzles(data); if (error.isError()) { return error; } if (!applyPrimitiveType(mode, count, program->usesPointSize())) { return gl::Error(GL_NO_ERROR); } error = applyRenderTarget(data, mode, false); if (error.isError()) { return error; } error = applyState(data, mode); if (error.isError()) { return error; } applyTransformFeedbackBuffers(*data.state); error = applyVertexBuffer(*data.state, mode, first, count, instances, nullptr); if (error.isError()) { return error; } error = applyShaders(data); if (error.isError()) { return error; } error = applyTextures(data); if (error.isError()) { return error; } error = program->applyUniformBuffers(data); if (error.isError()) { return error; } if (!skipDraw(data, mode)) { error = drawArrays(data, mode, count, instances, program->usesPointSize()); if (error.isError()) { return error; } if (data.state->isTransformFeedbackActiveUnpaused()) { markTransformFeedbackUsage(data); } } return gl::Error(GL_NO_ERROR); }
gl::Error RendererD3D::genericDrawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances, const gl::IndexRange &indexRange) { gl::Program *program = data.state->getProgram(); ASSERT(program != nullptr); ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); bool usesPointSize = programD3D->usesPointSize(); programD3D->updateSamplerMapping(); gl::Error error = generateSwizzles(data); if (error.isError()) { return error; } if (!applyPrimitiveType(mode, count, usesPointSize)) { return gl::Error(GL_NO_ERROR); } error = updateState(data, mode); if (error.isError()) { return error; } TranslatedIndexData indexInfo; indexInfo.indexRange = indexRange; error = applyIndexBuffer(data, indices, count, mode, type, &indexInfo); if (error.isError()) { return error; } applyTransformFeedbackBuffers(*data.state); // Transform feedback is not allowed for DrawElements, this error should have been caught at the API validation // layer. ASSERT(!data.state->isTransformFeedbackActiveUnpaused()); size_t vertexCount = indexInfo.indexRange.vertexCount(); error = applyVertexBuffer(*data.state, mode, static_cast<GLsizei>(indexInfo.indexRange.start), static_cast<GLsizei>(vertexCount), instances, &indexInfo); if (error.isError()) { return error; } error = applyTextures(data); if (error.isError()) { return error; } error = applyShaders(data, mode); if (error.isError()) { return error; } error = programD3D->applyUniformBuffers(data); if (error.isError()) { return error; } if (!skipDraw(data, mode)) { error = drawElementsImpl(data, indexInfo, mode, count, type, indices, instances); if (error.isError()) { return error; } } return gl::Error(GL_NO_ERROR); }