QVariant VirtualMachine::extractVariable(const QString& name) { QByteArray nameBytes = name.toUtf8(); unqlite_value* pVal = unqlite_vm_extract_variable(m_pVm, nameBytes.data()); if (!pVal) return QVariant(); QVariant var = createVariant(pVal); unqlite_value_release(pVal); return var; }
VkFramebuffer VulkanFramebuffer::getFramebuffer(RenderSurfaceMask loadMask, RenderSurfaceMask readMask, ClearMask clearMask) const { if (loadMask == RT_NONE && readMask == RT_NONE && clearMask == CLEAR_NONE) return mDefault.framebuffer; VariantKey key(loadMask, readMask, clearMask); auto iterFind = mVariants.find(key); if (iterFind != mVariants.end()) return iterFind->second.framebuffer; Variant newVariant = createVariant(loadMask, readMask, clearMask); mVariants[key] = newVariant; return newVariant.framebuffer; }
jobject createParameter(JNIEnv *env, jclass paramClass, jmethodID paramCons, ELEMDESC elemDesc, BSTR theName) { int defaultMask = (PARAMFLAG_FOPT|PARAMFLAG_FHASDEFAULT); int flags = elemDesc.paramdesc.wParamFlags; int vt = elemDesc.tdesc.vt; int hasDefault = (flags & defaultMask) == defaultMask; jobject defaultValue = 0; if (hasDefault) { PARAMDESCEX *paramDescEx = elemDesc.paramdesc.pparamdescex; defaultValue = createVariant(env, ¶mDescEx->varDefaultValue); } jstring name = 0; if (theName != NULL) { name = makeString(env, theName); SysFreeString(theName); } return env->NewObject(paramClass, paramCons, name, flags & PARAMFLAG_FIN, flags & PARAMFLAG_FOUT, flags & PARAMFLAG_FOPT, flags & PARAMFLAG_FRETVAL, vt, hasDefault, defaultValue); }
JNIEXPORT jobject JNICALL Java_org_racob_com_TypeInfo_getVarDesc (JNIEnv *env, jobject obj, jint pointer, jint index) { ITypeInfo *typeInfo = (ITypeInfo *) pointer; VARDESC *varDesc = NULL; HRESULT hr = typeInfo->GetVarDesc(index, &varDesc); if (!SUCCEEDED(hr)) { ThrowComFail(env, "getVarDesc failed", hr); return NULL; } // We have a constant so let's save the variant jobject cValue = varDesc->varkind == VAR_CONST ? createVariant(env, varDesc->lpvarValue) : NULL; jclass autoClass = env->FindClass("org/racob/com/VarDesc"); jmethodID autoCons = env->GetMethodID(autoClass, "<init>", "(ILorg/racob/com/Variant;II)V"); jobject newAuto = env->NewObject(autoClass, autoCons, varDesc->memid, cValue, varDesc->varkind, varDesc->wVarFlags); typeInfo->ReleaseVarDesc(varDesc); return newAuto; }
VulkanFramebuffer::VulkanFramebuffer(VulkanResourceManager* owner, const VULKAN_FRAMEBUFFER_DESC& desc) : VulkanResource(owner, false), mNumAttachments(0), mNumColorAttachments(0), mNumLayers(desc.layers) , mColorAttachments(), mDepthStencilAttachment(), mHasDepth(false), mSampleFlags(VK_SAMPLE_COUNT_1_BIT) { mId = sNextValidId++; mSampleFlags = VulkanUtility::getSampleFlags(desc.numSamples); UINT32 attachmentIdx = 0; for(UINT32 i = 0; i < BS_MAX_MULTIPLE_RENDER_TARGETS; i++) { if (desc.color[i].image == nullptr) continue; VkAttachmentDescription& attachmentDesc = mAttachments[attachmentIdx]; attachmentDesc.flags = 0; attachmentDesc.format = desc.color[i].format; attachmentDesc.samples = mSampleFlags; attachmentDesc.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachmentDesc.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachmentDesc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachmentDesc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; attachmentDesc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; // If offscreen we make the assumption the surface will be read by a shader if(desc.offscreen) attachmentDesc.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; else attachmentDesc.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; mColorAttachments[attachmentIdx].baseLayer = desc.color[i].baseLayer; mColorAttachments[attachmentIdx].image = desc.color[i].image; mColorAttachments[attachmentIdx].finalLayout = attachmentDesc.finalLayout; mColorAttachments[attachmentIdx].index = i; VkAttachmentReference& ref = mColorReferences[attachmentIdx]; ref.attachment = attachmentIdx; ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; mAttachmentViews[attachmentIdx] = desc.color[i].view; attachmentIdx++; } mNumColorAttachments = attachmentIdx; mHasDepth = desc.depth.view != VK_NULL_HANDLE; if (mHasDepth) { VkAttachmentDescription& attachmentDesc = mAttachments[attachmentIdx]; attachmentDesc.flags = 0; attachmentDesc.format = desc.depth.format; attachmentDesc.samples = mSampleFlags; attachmentDesc.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachmentDesc.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachmentDesc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachmentDesc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; attachmentDesc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; attachmentDesc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; mDepthStencilAttachment.baseLayer = desc.depth.baseLayer; mDepthStencilAttachment.image = desc.depth.image; mDepthStencilAttachment.finalLayout = attachmentDesc.finalLayout; mDepthStencilAttachment.index = 0; VkAttachmentReference& ref = mDepthReference; ref.attachment = attachmentIdx; ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; mAttachmentViews[attachmentIdx] = desc.depth.view; attachmentIdx++; } mNumAttachments = attachmentIdx; mSubpassDesc.flags = 0; mSubpassDesc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; mSubpassDesc.colorAttachmentCount = mNumColorAttachments; mSubpassDesc.inputAttachmentCount = 0; mSubpassDesc.pInputAttachments = nullptr; mSubpassDesc.preserveAttachmentCount = 0; mSubpassDesc.pPreserveAttachments = nullptr; mSubpassDesc.pResolveAttachments = nullptr; if (mNumColorAttachments > 0) mSubpassDesc.pColorAttachments = mColorReferences; else mSubpassDesc.pColorAttachments = nullptr; if (mHasDepth) mSubpassDesc.pDepthStencilAttachment = &mDepthReference; else mSubpassDesc.pDepthStencilAttachment = nullptr; // Subpass dependencies for layout transitions mDependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; mDependencies[0].dstSubpass = 0; mDependencies[0].srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; mDependencies[0].dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; mDependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT; mDependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT; mDependencies[0].dependencyFlags = 0; mDependencies[1].srcSubpass = 0; mDependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; mDependencies[1].srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; mDependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; mDependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT; mDependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT; mDependencies[1].dependencyFlags = 0; // Create render pass and frame buffer create infos mRenderPassCI.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; mRenderPassCI.pNext = nullptr; mRenderPassCI.flags = 0; mRenderPassCI.attachmentCount = mNumAttachments; mRenderPassCI.pAttachments = mAttachments; mRenderPassCI.subpassCount = 1; mRenderPassCI.pSubpasses = &mSubpassDesc; mRenderPassCI.dependencyCount = 2; mRenderPassCI.pDependencies = mDependencies; mFramebufferCI.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; mFramebufferCI.pNext = nullptr; mFramebufferCI.flags = 0; mFramebufferCI.renderPass = VK_NULL_HANDLE; mFramebufferCI.attachmentCount = mNumAttachments; mFramebufferCI.pAttachments = mAttachmentViews; mFramebufferCI.width = desc.width; mFramebufferCI.height = desc.height; mFramebufferCI.layers = desc.layers; mDefault = createVariant(RT_NONE, RT_NONE, CLEAR_NONE); }